diff options
Diffstat (limited to 'drivers/net/pppoe.c')
-rw-r--r-- | drivers/net/pppoe.c | 37 |
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 | ||
111 | static 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 | |||
115 | static 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; |