aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/pppoe.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/pppoe.c')
-rw-r--r--drivers/net/pppoe.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c
index 6f98834e6ace..68631a5721ac 100644
--- a/drivers/net/pppoe.c
+++ b/drivers/net/pppoe.c
@@ -108,19 +108,24 @@ static inline int cmp_addr(struct pppoe_addr *a, unsigned long sid, char *addr)
108 (memcmp(a->remote,addr,ETH_ALEN) == 0)); 108 (memcmp(a->remote,addr,ETH_ALEN) == 0));
109} 109}
110 110
111static int hash_item(unsigned long sid, unsigned char *addr) 111#if 8%PPPOE_HASH_BITS
112#error 8 must be a multiple of PPPOE_HASH_BITS
113#endif
114
115static int hash_item(unsigned int sid, unsigned char *addr)
112{ 116{
113 char hash = 0; 117 unsigned char hash = 0;
114 int i, j; 118 unsigned int i;
115 119
116 for (i = 0; i < ETH_ALEN ; ++i) { 120 for (i = 0 ; i < ETH_ALEN ; i++) {
117 for (j = 0; j < 8/PPPOE_HASH_BITS ; ++j) { 121 hash ^= addr[i];
118 hash ^= addr[i] >> ( j * PPPOE_HASH_BITS ); 122 }
119 } 123 for (i = 0 ; i < sizeof(sid_t)*8 ; i += 8 ){
124 hash ^= sid>>i;
125 }
126 for (i = 8 ; (i>>=1) >= PPPOE_HASH_BITS ; ) {
127 hash ^= hash>>i;
120 } 128 }
121
122 for (i = 0; i < (sizeof(unsigned long)*8) / PPPOE_HASH_BITS ; ++i)
123 hash ^= sid >> (i*PPPOE_HASH_BITS);
124 129
125 return hash & ( PPPOE_HASH_SIZE - 1 ); 130 return hash & ( PPPOE_HASH_SIZE - 1 );
126} 131}
@@ -664,8 +669,8 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
664{ 669{
665 struct sock *sk = sock->sk; 670 struct sock *sk = sock->sk;
666 struct pppox_sock *po = pppox_sk(sk); 671 struct pppox_sock *po = pppox_sk(sk);
667 int val = 0; 672 int val;
668 int err = 0; 673 int err;
669 674
670 switch (cmd) { 675 switch (cmd) {
671 case PPPIOCGMRU: 676 case PPPIOCGMRU:
@@ -754,8 +759,9 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
754 err = 0; 759 err = 0;
755 break; 760 break;
756 761
757 default:; 762 default:
758 }; 763 err = -ENOTTY;
764 }
759 765
760 return err; 766 return err;
761} 767}
@@ -773,6 +779,7 @@ static int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock,
773 struct net_device *dev; 779 struct net_device *dev;
774 char *start; 780 char *start;
775 781
782 lock_sock(sk);
776 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) { 783 if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) {
777 error = -ENOTCONN; 784 error = -ENOTCONN;
778 goto end; 785 goto end;
@@ -783,8 +790,6 @@ static int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock,
783 hdr.code = 0; 790 hdr.code = 0;
784 hdr.sid = po->num; 791 hdr.sid = po->num;
785 792
786 lock_sock(sk);
787
788 dev = po->pppoe_dev; 793 dev = po->pppoe_dev;
789 794
790 error = -EMSGSIZE; 795 error = -EMSGSIZE;