diff options
| -rw-r--r-- | net/packet/af_packet.c | 31 |
1 files changed, 4 insertions, 27 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 02e401cd683f..99b55e641e8d 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -86,20 +86,6 @@ | |||
| 86 | #define CONFIG_SOCK_PACKET 1 | 86 | #define CONFIG_SOCK_PACKET 1 |
| 87 | 87 | ||
| 88 | /* | 88 | /* |
| 89 | Proposed replacement for SIOC{ADD,DEL}MULTI and | ||
| 90 | IFF_PROMISC, IFF_ALLMULTI flags. | ||
| 91 | |||
| 92 | It is more expensive, but I believe, | ||
| 93 | it is really correct solution: reentereble, safe and fault tolerant. | ||
| 94 | |||
| 95 | IFF_PROMISC/IFF_ALLMULTI/SIOC{ADD/DEL}MULTI are faked by keeping | ||
| 96 | reference count and global flag, so that real status is | ||
| 97 | (gflag|(count != 0)), so that we can use obsolete faulty interface | ||
| 98 | not harming clever users. | ||
| 99 | */ | ||
| 100 | #define CONFIG_PACKET_MULTICAST 1 | ||
| 101 | |||
| 102 | /* | ||
| 103 | Assumptions: | 89 | Assumptions: |
| 104 | - if device has no dev->hard_header routine, it adds and removes ll header | 90 | - if device has no dev->hard_header routine, it adds and removes ll header |
| 105 | inside itself. In this case ll header is invisible outside of device, | 91 | inside itself. In this case ll header is invisible outside of device, |
| @@ -159,7 +145,6 @@ static atomic_t packet_socks_nr; | |||
| 159 | 145 | ||
| 160 | /* Private packet socket structures. */ | 146 | /* Private packet socket structures. */ |
| 161 | 147 | ||
| 162 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 163 | struct packet_mclist | 148 | struct packet_mclist |
| 164 | { | 149 | { |
| 165 | struct packet_mclist *next; | 150 | struct packet_mclist *next; |
| @@ -179,7 +164,7 @@ struct packet_mreq_max | |||
| 179 | unsigned short mr_alen; | 164 | unsigned short mr_alen; |
| 180 | unsigned char mr_address[MAX_ADDR_LEN]; | 165 | unsigned char mr_address[MAX_ADDR_LEN]; |
| 181 | }; | 166 | }; |
| 182 | #endif | 167 | |
| 183 | #ifdef CONFIG_PACKET_MMAP | 168 | #ifdef CONFIG_PACKET_MMAP |
| 184 | static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing); | 169 | static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing); |
| 185 | #endif | 170 | #endif |
| @@ -205,9 +190,7 @@ struct packet_sock { | |||
| 205 | origdev:1; | 190 | origdev:1; |
| 206 | int ifindex; /* bound device */ | 191 | int ifindex; /* bound device */ |
| 207 | __be16 num; | 192 | __be16 num; |
| 208 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 209 | struct packet_mclist *mclist; | 193 | struct packet_mclist *mclist; |
| 210 | #endif | ||
| 211 | #ifdef CONFIG_PACKET_MMAP | 194 | #ifdef CONFIG_PACKET_MMAP |
| 212 | atomic_t mapped; | 195 | atomic_t mapped; |
| 213 | unsigned int pg_vec_order; | 196 | unsigned int pg_vec_order; |
| @@ -851,9 +834,7 @@ static int packet_release(struct socket *sock) | |||
| 851 | __sock_put(sk); | 834 | __sock_put(sk); |
| 852 | } | 835 | } |
| 853 | 836 | ||
| 854 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 855 | packet_flush_mclist(sk); | 837 | packet_flush_mclist(sk); |
| 856 | #endif | ||
| 857 | 838 | ||
| 858 | #ifdef CONFIG_PACKET_MMAP | 839 | #ifdef CONFIG_PACKET_MMAP |
| 859 | if (po->pg_vec) { | 840 | if (po->pg_vec) { |
| @@ -1221,7 +1202,6 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 1221 | return 0; | 1202 | return 0; |
| 1222 | } | 1203 | } |
| 1223 | 1204 | ||
| 1224 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 1225 | static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int what) | 1205 | static void packet_dev_mc(struct net_device *dev, struct packet_mclist *i, int what) |
| 1226 | { | 1206 | { |
| 1227 | switch (i->type) { | 1207 | switch (i->type) { |
| @@ -1349,7 +1329,6 @@ static void packet_flush_mclist(struct sock *sk) | |||
| 1349 | } | 1329 | } |
| 1350 | rtnl_unlock(); | 1330 | rtnl_unlock(); |
| 1351 | } | 1331 | } |
| 1352 | #endif | ||
| 1353 | 1332 | ||
| 1354 | static int | 1333 | static int |
| 1355 | packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) | 1334 | packet_setsockopt(struct socket *sock, int level, int optname, char __user *optval, int optlen) |
| @@ -1362,7 +1341,6 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv | |||
| 1362 | return -ENOPROTOOPT; | 1341 | return -ENOPROTOOPT; |
| 1363 | 1342 | ||
| 1364 | switch(optname) { | 1343 | switch(optname) { |
| 1365 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 1366 | case PACKET_ADD_MEMBERSHIP: | 1344 | case PACKET_ADD_MEMBERSHIP: |
| 1367 | case PACKET_DROP_MEMBERSHIP: | 1345 | case PACKET_DROP_MEMBERSHIP: |
| 1368 | { | 1346 | { |
| @@ -1383,7 +1361,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv | |||
| 1383 | ret = packet_mc_drop(sk, &mreq); | 1361 | ret = packet_mc_drop(sk, &mreq); |
| 1384 | return ret; | 1362 | return ret; |
| 1385 | } | 1363 | } |
| 1386 | #endif | 1364 | |
| 1387 | #ifdef CONFIG_PACKET_MMAP | 1365 | #ifdef CONFIG_PACKET_MMAP |
| 1388 | case PACKET_RX_RING: | 1366 | case PACKET_RX_RING: |
| 1389 | { | 1367 | { |
| @@ -1506,11 +1484,10 @@ static int packet_notifier(struct notifier_block *this, unsigned long msg, void | |||
| 1506 | 1484 | ||
| 1507 | switch (msg) { | 1485 | switch (msg) { |
| 1508 | case NETDEV_UNREGISTER: | 1486 | case NETDEV_UNREGISTER: |
| 1509 | #ifdef CONFIG_PACKET_MULTICAST | ||
| 1510 | if (po->mclist) | 1487 | if (po->mclist) |
| 1511 | packet_dev_mclist(dev, po->mclist, -1); | 1488 | packet_dev_mclist(dev, po->mclist, -1); |
| 1512 | // fallthrough | 1489 | /* fallthrough */ |
| 1513 | #endif | 1490 | |
| 1514 | case NETDEV_DOWN: | 1491 | case NETDEV_DOWN: |
| 1515 | if (dev->ifindex == po->ifindex) { | 1492 | if (dev->ifindex == po->ifindex) { |
| 1516 | spin_lock(&po->bind_lock); | 1493 | spin_lock(&po->bind_lock); |
