aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/pppoe.c
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@openvz.org>2009-01-21 18:54:15 -0500
committerDavid S. Miller <davem@davemloft.net>2009-01-21 18:54:15 -0500
commit6aba915881918a429d656e874f7fec2efd37ad96 (patch)
treedd04553bf94de691d6951768240092c122570805 /drivers/net/pppoe.c
parente2878806227d223467f84f900ef4c6733ee166df (diff)
net: pppoe - code cleanup and helpers
- Introduce PPPOE_HASH_MASK. - Remove redundant declaration of pppoe_chan_ops. - Introduce stage_session helper. - Tabs, space, long-line-split cleanup. Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/pppoe.c')
-rw-r--r--drivers/net/pppoe.c167
1 files changed, 86 insertions, 81 deletions
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c
index 5efc3d172c8..c2ceea4f46b 100644
--- a/drivers/net/pppoe.c
+++ b/drivers/net/pppoe.c
@@ -84,32 +84,43 @@
84#include <asm/uaccess.h> 84#include <asm/uaccess.h>
85 85
86#define PPPOE_HASH_BITS 4 86#define PPPOE_HASH_BITS 4
87#define PPPOE_HASH_SIZE (1<<PPPOE_HASH_BITS) 87#define PPPOE_HASH_SIZE (1 << PPPOE_HASH_BITS)
88 88#define PPPOE_HASH_MASK (PPPOE_HASH_SIZE - 1)
89static struct ppp_channel_ops pppoe_chan_ops;
90 89
91static int pppoe_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); 90static int pppoe_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg);
92static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb); 91static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb);
93static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb); 92static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb);
94 93
95static const struct proto_ops pppoe_ops; 94static const struct proto_ops pppoe_ops;
95static struct ppp_channel_ops pppoe_chan_ops;
96static DEFINE_RWLOCK(pppoe_hash_lock); 96static DEFINE_RWLOCK(pppoe_hash_lock);
97 97
98static struct ppp_channel_ops pppoe_chan_ops; 98/*
99 * PPPoE could be in the following stages:
100 * 1) Discovery stage (to obtain remote MAC and Session ID)
101 * 2) Session stage (MAC and SID are known)
102 *
103 * Ethernet frames have a special tag for this but
104 * we use simplier approach based on session id
105 */
106static inline bool stage_session(__be16 sid)
107{
108 return sid != 0;
109}
99 110
100static inline int cmp_2_addr(struct pppoe_addr *a, struct pppoe_addr *b) 111static inline int cmp_2_addr(struct pppoe_addr *a, struct pppoe_addr *b)
101{ 112{
102 return (a->sid == b->sid && 113 return a->sid == b->sid &&
103 (memcmp(a->remote, b->remote, ETH_ALEN) == 0)); 114 (memcmp(a->remote, b->remote, ETH_ALEN) == 0);
104} 115}
105 116
106static inline int cmp_addr(struct pppoe_addr *a, __be16 sid, char *addr) 117static inline int cmp_addr(struct pppoe_addr *a, __be16 sid, char *addr)
107{ 118{
108 return (a->sid == sid && 119 return a->sid == sid &&
109 (memcmp(a->remote,addr,ETH_ALEN) == 0)); 120 (memcmp(a->remote, addr, ETH_ALEN) == 0);
110} 121}
111 122
112#if 8%PPPOE_HASH_BITS 123#if 8 % PPPOE_HASH_BITS
113#error 8 must be a multiple of PPPOE_HASH_BITS 124#error 8 must be a multiple of PPPOE_HASH_BITS
114#endif 125#endif
115 126
@@ -118,17 +129,14 @@ static int hash_item(__be16 sid, unsigned char *addr)
118 unsigned char hash = 0; 129 unsigned char hash = 0;
119 unsigned int i; 130 unsigned int i;
120 131
121 for (i = 0 ; i < ETH_ALEN ; i++) { 132 for (i = 0; i < ETH_ALEN; i++)
122 hash ^= addr[i]; 133 hash ^= addr[i];
123 } 134 for (i = 0; i < sizeof(sid_t) * 8; i += 8)
124 for (i = 0 ; i < sizeof(sid_t)*8 ; i += 8 ){ 135 hash ^= (__force __u32)sid >> i;
125 hash ^= (__force __u32)sid>>i; 136 for (i = 8; (i >>= 1) >= PPPOE_HASH_BITS;)
126 } 137 hash ^= hash >> i;
127 for (i = 8 ; (i>>=1) >= PPPOE_HASH_BITS ; ) {
128 hash ^= hash>>i;
129 }
130 138
131 return hash & ( PPPOE_HASH_SIZE - 1 ); 139 return hash & PPPOE_HASH_MASK;
132} 140}
133 141
134/* zeroed because its in .bss */ 142/* zeroed because its in .bss */
@@ -146,10 +154,15 @@ static struct pppox_sock *__get_item(__be16 sid, unsigned char *addr, int ifinde
146 154
147 ret = item_hash_table[hash]; 155 ret = item_hash_table[hash];
148 156
149 while (ret && !(cmp_addr(&ret->pppoe_pa, sid, addr) && ret->pppoe_ifindex == ifindex)) 157 while (ret) {
158 if (cmp_addr(&ret->pppoe_pa, sid, addr) &&
159 ret->pppoe_ifindex == ifindex)
160 return ret;
161
150 ret = ret->next; 162 ret = ret->next;
163 }
151 164
152 return ret; 165 return NULL;
153} 166}
154 167
155static int __set_item(struct pppox_sock *po) 168static int __set_item(struct pppox_sock *po)
@@ -159,7 +172,8 @@ static int __set_item(struct pppox_sock *po)
159 172
160 ret = item_hash_table[hash]; 173 ret = item_hash_table[hash];
161 while (ret) { 174 while (ret) {
162 if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa) && ret->pppoe_ifindex == po->pppoe_ifindex) 175 if (cmp_2_addr(&ret->pppoe_pa, &po->pppoe_pa) &&
176 ret->pppoe_ifindex == po->pppoe_ifindex)
163 return -EALREADY; 177 return -EALREADY;
164 178
165 ret = ret->next; 179 ret = ret->next;
@@ -180,7 +194,8 @@ static struct pppox_sock *__delete_item(__be16 sid, char *addr, int ifindex)
180 src = &item_hash_table[hash]; 194 src = &item_hash_table[hash];
181 195
182 while (ret) { 196 while (ret) {
183 if (cmp_addr(&ret->pppoe_pa, sid, addr) && ret->pppoe_ifindex == ifindex) { 197 if (cmp_addr(&ret->pppoe_pa, sid, addr) &&
198 ret->pppoe_ifindex == ifindex) {
184 *src = ret->next; 199 *src = ret->next;
185 break; 200 break;
186 } 201 }
@@ -217,7 +232,7 @@ static inline struct pppox_sock *get_item_by_addr(struct sockaddr_pppox *sp)
217 int ifindex; 232 int ifindex;
218 233
219 dev = dev_get_by_name(&init_net, sp->sa_addr.pppoe.dev); 234 dev = dev_get_by_name(&init_net, sp->sa_addr.pppoe.dev);
220 if(!dev) 235 if (!dev)
221 return NULL; 236 return NULL;
222 ifindex = dev->ifindex; 237 ifindex = dev->ifindex;
223 dev_put(dev); 238 dev_put(dev);
@@ -329,7 +344,6 @@ static struct notifier_block pppoe_notifier = {
329 .notifier_call = pppoe_device_event, 344 .notifier_call = pppoe_device_event,
330}; 345};
331 346
332
333/************************************************************************ 347/************************************************************************
334 * 348 *
335 * Do the real work of receiving a PPPoE Session frame. 349 * Do the real work of receiving a PPPoE Session frame.
@@ -383,7 +397,8 @@ static int pppoe_rcv(struct sk_buff *skb,
383 struct pppox_sock *po; 397 struct pppox_sock *po;
384 int len; 398 int len;
385 399
386 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 400 skb = skb_share_check(skb, GFP_ATOMIC);
401 if (!skb)
387 goto out; 402 goto out;
388 403
389 if (dev_net(dev) != &init_net) 404 if (dev_net(dev) != &init_net)
@@ -432,7 +447,8 @@ static int pppoe_disc_rcv(struct sk_buff *skb,
432 if (dev_net(dev) != &init_net) 447 if (dev_net(dev) != &init_net)
433 goto abort; 448 goto abort;
434 449
435 if (!(skb = skb_share_check(skb, GFP_ATOMIC))) 450 skb = skb_share_check(skb, GFP_ATOMIC);
451 if (!skb)
436 goto out; 452 goto out;
437 453
438 if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr))) 454 if (!pskb_may_pull(skb, sizeof(struct pppoe_hdr)))
@@ -493,12 +509,11 @@ static struct proto pppoe_sk_proto = {
493 **********************************************************************/ 509 **********************************************************************/
494static int pppoe_create(struct net *net, struct socket *sock) 510static int pppoe_create(struct net *net, struct socket *sock)
495{ 511{
496 int error = -ENOMEM;
497 struct sock *sk; 512 struct sock *sk;
498 513
499 sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppoe_sk_proto); 514 sk = sk_alloc(net, PF_PPPOX, GFP_KERNEL, &pppoe_sk_proto);
500 if (!sk) 515 if (!sk)
501 goto out; 516 return -ENOMEM;
502 517
503 sock_init_data(sock, sk); 518 sock_init_data(sock, sk);
504 519
@@ -511,8 +526,7 @@ static int pppoe_create(struct net *net, struct socket *sock)
511 sk->sk_family = PF_PPPOX; 526 sk->sk_family = PF_PPPOX;
512 sk->sk_protocol = PX_PROTO_OE; 527 sk->sk_protocol = PX_PROTO_OE;
513 528
514 error = 0; 529 return 0;
515out: return error;
516} 530}
517 531
518static int pppoe_release(struct socket *sock) 532static int pppoe_release(struct socket *sock)
@@ -524,7 +538,7 @@ static int pppoe_release(struct socket *sock)
524 return 0; 538 return 0;
525 539
526 lock_sock(sk); 540 lock_sock(sk);
527 if (sock_flag(sk, SOCK_DEAD)){ 541 if (sock_flag(sk, SOCK_DEAD)) {
528 release_sock(sk); 542 release_sock(sk);
529 return -EBADF; 543 return -EBADF;
530 } 544 }
@@ -542,7 +556,7 @@ static int pppoe_release(struct socket *sock)
542 write_lock_bh(&pppoe_hash_lock); 556 write_lock_bh(&pppoe_hash_lock);
543 557
544 po = pppox_sk(sk); 558 po = pppox_sk(sk);
545 if (po->pppoe_pa.sid) { 559 if (stage_session(po->pppoe_pa.sid)) {
546 __delete_item(po->pppoe_pa.sid, 560 __delete_item(po->pppoe_pa.sid,
547 po->pppoe_pa.remote, po->pppoe_ifindex); 561 po->pppoe_pa.remote, po->pppoe_ifindex);
548 } 562 }
@@ -564,7 +578,6 @@ static int pppoe_release(struct socket *sock)
564 return 0; 578 return 0;
565} 579}
566 580
567
568static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, 581static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
569 int sockaddr_len, int flags) 582 int sockaddr_len, int flags)
570{ 583{
@@ -582,32 +595,31 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
582 595
583 /* Check for already bound sockets */ 596 /* Check for already bound sockets */
584 error = -EBUSY; 597 error = -EBUSY;
585 if ((sk->sk_state & PPPOX_CONNECTED) && sp->sa_addr.pppoe.sid) 598 if ((sk->sk_state & PPPOX_CONNECTED) &&
599 stage_session(sp->sa_addr.pppoe.sid))
586 goto end; 600 goto end;
587 601
588 /* Check for already disconnected sockets, on attempts to disconnect */ 602 /* Check for already disconnected sockets, on attempts to disconnect */
589 error = -EALREADY; 603 error = -EALREADY;
590 if ((sk->sk_state & PPPOX_DEAD) && !sp->sa_addr.pppoe.sid ) 604 if ((sk->sk_state & PPPOX_DEAD) &&
605 !stage_session(sp->sa_addr.pppoe.sid))
591 goto end; 606 goto end;
592 607
593 error = 0; 608 error = 0;
594 if (po->pppoe_pa.sid) {
595 pppox_unbind_sock(sk);
596 609
597 /* Delete the old binding */ 610 /* Delete the old binding */
598 delete_item(po->pppoe_pa.sid,po->pppoe_pa.remote,po->pppoe_ifindex); 611 if (stage_session(po->pppoe_pa.sid)) {
599 612 pppox_unbind_sock(sk);
600 if(po->pppoe_dev) 613 delete_item(po->pppoe_pa.sid, po->pppoe_pa.remote, po->pppoe_ifindex);
614 if (po->pppoe_dev)
601 dev_put(po->pppoe_dev); 615 dev_put(po->pppoe_dev);
602
603 memset(sk_pppox(po) + 1, 0, 616 memset(sk_pppox(po) + 1, 0,
604 sizeof(struct pppox_sock) - sizeof(struct sock)); 617 sizeof(struct pppox_sock) - sizeof(struct sock));
605
606 sk->sk_state = PPPOX_NONE; 618 sk->sk_state = PPPOX_NONE;
607 } 619 }
608 620
609 /* Don't re-bind if sid==0 */ 621 /* Re-bind in session stage only */
610 if (sp->sa_addr.pppoe.sid != 0) { 622 if (stage_session(sp->sa_addr.pppoe.sid)) {
611 dev = dev_get_by_name(&init_net, sp->sa_addr.pppoe.dev); 623 dev = dev_get_by_name(&init_net, sp->sa_addr.pppoe.dev);
612 624
613 error = -ENODEV; 625 error = -ENODEV;
@@ -618,7 +630,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
618 po->pppoe_ifindex = dev->ifindex; 630 po->pppoe_ifindex = dev->ifindex;
619 631
620 write_lock_bh(&pppoe_hash_lock); 632 write_lock_bh(&pppoe_hash_lock);
621 if (!(dev->flags & IFF_UP)){ 633 if (!(dev->flags & IFF_UP)) {
622 write_unlock_bh(&pppoe_hash_lock); 634 write_unlock_bh(&pppoe_hash_lock);
623 goto err_put; 635 goto err_put;
624 } 636 }
@@ -648,7 +660,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr,
648 660
649 po->num = sp->sa_addr.pppoe.sid; 661 po->num = sp->sa_addr.pppoe.sid;
650 662
651 end: 663end:
652 release_sock(sk); 664 release_sock(sk);
653 return error; 665 return error;
654err_put: 666err_put:
@@ -659,7 +671,6 @@ err_put:
659 goto end; 671 goto end;
660} 672}
661 673
662
663static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr, 674static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
664 int *usockaddr_len, int peer) 675 int *usockaddr_len, int peer)
665{ 676{
@@ -678,7 +689,6 @@ static int pppoe_getname(struct socket *sock, struct sockaddr *uaddr,
678 return 0; 689 return 0;
679} 690}
680 691
681
682static int pppoe_ioctl(struct socket *sock, unsigned int cmd, 692static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
683 unsigned long arg) 693 unsigned long arg)
684{ 694{
@@ -709,7 +719,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
709 break; 719 break;
710 720
711 err = -EFAULT; 721 err = -EFAULT;
712 if (get_user(val,(int __user *) arg)) 722 if (get_user(val, (int __user *)arg))
713 break; 723 break;
714 724
715 if (val < (po->pppoe_dev->mtu 725 if (val < (po->pppoe_dev->mtu
@@ -722,7 +732,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
722 732
723 case PPPIOCSFLAGS: 733 case PPPIOCSFLAGS:
724 err = -EFAULT; 734 err = -EFAULT;
725 if (get_user(val, (int __user *) arg)) 735 if (get_user(val, (int __user *)arg))
726 break; 736 break;
727 err = 0; 737 err = 0;
728 break; 738 break;
@@ -749,7 +759,7 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
749 759
750 err = -EINVAL; 760 err = -EINVAL;
751 if (po->pppoe_relay.sa_family != AF_PPPOX || 761 if (po->pppoe_relay.sa_family != AF_PPPOX ||
752 po->pppoe_relay.sa_protocol!= PX_PROTO_OE) 762 po->pppoe_relay.sa_protocol != PX_PROTO_OE)
753 break; 763 break;
754 764
755 /* Check that the socket referenced by the address 765 /* Check that the socket referenced by the address
@@ -781,7 +791,6 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd,
781 return err; 791 return err;
782} 792}
783 793
784
785static int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock, 794static int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock,
786 struct msghdr *m, size_t total_len) 795 struct msghdr *m, size_t total_len)
787{ 796{
@@ -808,7 +817,7 @@ static int pppoe_sendmsg(struct kiocb *iocb, struct socket *sock,
808 dev = po->pppoe_dev; 817 dev = po->pppoe_dev;
809 818
810 error = -EMSGSIZE; 819 error = -EMSGSIZE;
811 if (total_len > (dev->mtu + dev->hard_header_len)) 820 if (total_len > (dev->mtu + dev->hard_header_len))
812 goto end; 821 goto end;
813 822
814 823
@@ -853,7 +862,6 @@ end:
853 return error; 862 return error;
854} 863}
855 864
856
857/************************************************************************ 865/************************************************************************
858 * 866 *
859 * xmit function for internal use. 867 * xmit function for internal use.
@@ -903,7 +911,6 @@ abort:
903 return 1; 911 return 1;
904} 912}
905 913
906
907/************************************************************************ 914/************************************************************************
908 * 915 *
909 * xmit function called by generic PPP driver 916 * xmit function called by generic PPP driver
@@ -916,7 +923,6 @@ static int pppoe_xmit(struct ppp_channel *chan, struct sk_buff *skb)
916 return __pppoe_xmit(sk, skb); 923 return __pppoe_xmit(sk, skb);
917} 924}
918 925
919
920static struct ppp_channel_ops pppoe_chan_ops = { 926static struct ppp_channel_ops pppoe_chan_ops = {
921 .start_xmit = pppoe_xmit, 927 .start_xmit = pppoe_xmit,
922}; 928};
@@ -976,9 +982,9 @@ out:
976static __inline__ struct pppox_sock *pppoe_get_idx(loff_t pos) 982static __inline__ struct pppox_sock *pppoe_get_idx(loff_t pos)
977{ 983{
978 struct pppox_sock *po; 984 struct pppox_sock *po;
979 int i = 0; 985 int i;
980 986
981 for (; i < PPPOE_HASH_SIZE; i++) { 987 for (i = 0; i < PPPOE_HASH_SIZE; i++) {
982 po = item_hash_table[i]; 988 po = item_hash_table[i];
983 while (po) { 989 while (po) {
984 if (!pos--) 990 if (!pos--)
@@ -1064,32 +1070,31 @@ static inline int pppoe_proc_init(void) { return 0; }
1064#endif /* CONFIG_PROC_FS */ 1070#endif /* CONFIG_PROC_FS */
1065 1071
1066static const struct proto_ops pppoe_ops = { 1072static const struct proto_ops pppoe_ops = {
1067 .family = AF_PPPOX, 1073 .family = AF_PPPOX,
1068 .owner = THIS_MODULE, 1074 .owner = THIS_MODULE,
1069 .release = pppoe_release, 1075 .release = pppoe_release,
1070 .bind = sock_no_bind, 1076 .bind = sock_no_bind,
1071 .connect = pppoe_connect, 1077 .connect = pppoe_connect,
1072 .socketpair = sock_no_socketpair, 1078 .socketpair = sock_no_socketpair,
1073 .accept = sock_no_accept, 1079 .accept = sock_no_accept,
1074 .getname = pppoe_getname, 1080 .getname = pppoe_getname,
1075 .poll = datagram_poll, 1081 .poll = datagram_poll,
1076 .listen = sock_no_listen, 1082 .listen = sock_no_listen,
1077 .shutdown = sock_no_shutdown, 1083 .shutdown = sock_no_shutdown,
1078 .setsockopt = sock_no_setsockopt, 1084 .setsockopt = sock_no_setsockopt,
1079 .getsockopt = sock_no_getsockopt, 1085 .getsockopt = sock_no_getsockopt,
1080 .sendmsg = pppoe_sendmsg, 1086 .sendmsg = pppoe_sendmsg,
1081 .recvmsg = pppoe_recvmsg, 1087 .recvmsg = pppoe_recvmsg,
1082 .mmap = sock_no_mmap, 1088 .mmap = sock_no_mmap,
1083 .ioctl = pppox_ioctl, 1089 .ioctl = pppox_ioctl,
1084}; 1090};
1085 1091
1086static struct pppox_proto pppoe_proto = { 1092static struct pppox_proto pppoe_proto = {
1087 .create = pppoe_create, 1093 .create = pppoe_create,
1088 .ioctl = pppoe_ioctl, 1094 .ioctl = pppoe_ioctl,
1089 .owner = THIS_MODULE, 1095 .owner = THIS_MODULE,
1090}; 1096};
1091 1097
1092
1093static int __init pppoe_init(void) 1098static int __init pppoe_init(void)
1094{ 1099{
1095 int err = proto_register(&pppoe_sk_proto, 0); 1100 int err = proto_register(&pppoe_sk_proto, 0);
@@ -1097,7 +1102,7 @@ static int __init pppoe_init(void)
1097 if (err) 1102 if (err)
1098 goto out; 1103 goto out;
1099 1104
1100 err = register_pppox_proto(PX_PROTO_OE, &pppoe_proto); 1105 err = register_pppox_proto(PX_PROTO_OE, &pppoe_proto);
1101 if (err) 1106 if (err)
1102 goto out_unregister_pppoe_proto; 1107 goto out_unregister_pppoe_proto;
1103 1108