aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/arp.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/ipv4/arp.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'net/ipv4/arp.c')
-rw-r--r--net/ipv4/arp.c286
1 files changed, 154 insertions, 132 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index 96c1955b3e2f..1b74d3b64371 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -55,7 +55,7 @@
55 * Stuart Cheshire : Metricom and grat arp fixes 55 * Stuart Cheshire : Metricom and grat arp fixes
56 * *** FOR 2.1 clean this up *** 56 * *** FOR 2.1 clean this up ***
57 * Lawrence V. Stefani: (08/12/96) Added FDDI support. 57 * Lawrence V. Stefani: (08/12/96) Added FDDI support.
58 * Alan Cox : Took the AP1000 nasty FDDI hack and 58 * Alan Cox : Took the AP1000 nasty FDDI hack and
59 * folded into the mainstream FDDI code. 59 * folded into the mainstream FDDI code.
60 * Ack spit, Linus how did you allow that 60 * Ack spit, Linus how did you allow that
61 * one in... 61 * one in...
@@ -120,14 +120,14 @@ EXPORT_SYMBOL(clip_tbl_hook);
120#endif 120#endif
121 121
122#include <asm/system.h> 122#include <asm/system.h>
123#include <asm/uaccess.h> 123#include <linux/uaccess.h>
124 124
125#include <linux/netfilter_arp.h> 125#include <linux/netfilter_arp.h>
126 126
127/* 127/*
128 * Interface to generic neighbour cache. 128 * Interface to generic neighbour cache.
129 */ 129 */
130static u32 arp_hash(const void *pkey, const struct net_device *dev); 130static u32 arp_hash(const void *pkey, const struct net_device *dev, __u32 rnd);
131static int arp_constructor(struct neighbour *neigh); 131static int arp_constructor(struct neighbour *neigh);
132static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb); 132static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb);
133static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb); 133static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb);
@@ -161,7 +161,7 @@ static const struct neigh_ops arp_direct_ops = {
161 .queue_xmit = dev_queue_xmit, 161 .queue_xmit = dev_queue_xmit,
162}; 162};
163 163
164const struct neigh_ops arp_broken_ops = { 164static const struct neigh_ops arp_broken_ops = {
165 .family = AF_INET, 165 .family = AF_INET,
166 .solicit = arp_solicit, 166 .solicit = arp_solicit,
167 .error_report = arp_error_report, 167 .error_report = arp_error_report,
@@ -170,35 +170,34 @@ const struct neigh_ops arp_broken_ops = {
170 .hh_output = dev_queue_xmit, 170 .hh_output = dev_queue_xmit,
171 .queue_xmit = dev_queue_xmit, 171 .queue_xmit = dev_queue_xmit,
172}; 172};
173EXPORT_SYMBOL(arp_broken_ops);
174 173
175struct neigh_table arp_tbl = { 174struct neigh_table arp_tbl = {
176 .family = AF_INET, 175 .family = AF_INET,
177 .entry_size = sizeof(struct neighbour) + 4, 176 .entry_size = sizeof(struct neighbour) + 4,
178 .key_len = 4, 177 .key_len = 4,
179 .hash = arp_hash, 178 .hash = arp_hash,
180 .constructor = arp_constructor, 179 .constructor = arp_constructor,
181 .proxy_redo = parp_redo, 180 .proxy_redo = parp_redo,
182 .id = "arp_cache", 181 .id = "arp_cache",
183 .parms = { 182 .parms = {
184 .tbl = &arp_tbl, 183 .tbl = &arp_tbl,
185 .base_reachable_time = 30 * HZ, 184 .base_reachable_time = 30 * HZ,
186 .retrans_time = 1 * HZ, 185 .retrans_time = 1 * HZ,
187 .gc_staletime = 60 * HZ, 186 .gc_staletime = 60 * HZ,
188 .reachable_time = 30 * HZ, 187 .reachable_time = 30 * HZ,
189 .delay_probe_time = 5 * HZ, 188 .delay_probe_time = 5 * HZ,
190 .queue_len = 3, 189 .queue_len = 3,
191 .ucast_probes = 3, 190 .ucast_probes = 3,
192 .mcast_probes = 3, 191 .mcast_probes = 3,
193 .anycast_delay = 1 * HZ, 192 .anycast_delay = 1 * HZ,
194 .proxy_delay = (8 * HZ) / 10, 193 .proxy_delay = (8 * HZ) / 10,
195 .proxy_qlen = 64, 194 .proxy_qlen = 64,
196 .locktime = 1 * HZ, 195 .locktime = 1 * HZ,
197 }, 196 },
198 .gc_interval = 30 * HZ, 197 .gc_interval = 30 * HZ,
199 .gc_thresh1 = 128, 198 .gc_thresh1 = 128,
200 .gc_thresh2 = 512, 199 .gc_thresh2 = 512,
201 .gc_thresh3 = 1024, 200 .gc_thresh3 = 1024,
202}; 201};
203EXPORT_SYMBOL(arp_tbl); 202EXPORT_SYMBOL(arp_tbl);
204 203
@@ -216,6 +215,9 @@ int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir)
216 case ARPHRD_INFINIBAND: 215 case ARPHRD_INFINIBAND:
217 ip_ib_mc_map(addr, dev->broadcast, haddr); 216 ip_ib_mc_map(addr, dev->broadcast, haddr);
218 return 0; 217 return 0;
218 case ARPHRD_IPGRE:
219 ip_ipgre_mc_map(addr, dev->broadcast, haddr);
220 return 0;
219 default: 221 default:
220 if (dir) { 222 if (dir) {
221 memcpy(haddr, dev->broadcast, dev->addr_len); 223 memcpy(haddr, dev->broadcast, dev->addr_len);
@@ -226,14 +228,16 @@ int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir)
226} 228}
227 229
228 230
229static u32 arp_hash(const void *pkey, const struct net_device *dev) 231static u32 arp_hash(const void *pkey,
232 const struct net_device *dev,
233 __u32 hash_rnd)
230{ 234{
231 return jhash_2words(*(u32 *)pkey, dev->ifindex, arp_tbl.hash_rnd); 235 return jhash_2words(*(u32 *)pkey, dev->ifindex, hash_rnd);
232} 236}
233 237
234static int arp_constructor(struct neighbour *neigh) 238static int arp_constructor(struct neighbour *neigh)
235{ 239{
236 __be32 addr = *(__be32*)neigh->primary_key; 240 __be32 addr = *(__be32 *)neigh->primary_key;
237 struct net_device *dev = neigh->dev; 241 struct net_device *dev = neigh->dev;
238 struct in_device *in_dev; 242 struct in_device *in_dev;
239 struct neigh_parms *parms; 243 struct neigh_parms *parms;
@@ -296,16 +300,19 @@ static int arp_constructor(struct neighbour *neigh)
296 neigh->ops = &arp_broken_ops; 300 neigh->ops = &arp_broken_ops;
297 neigh->output = neigh->ops->output; 301 neigh->output = neigh->ops->output;
298 return 0; 302 return 0;
303#else
304 break;
299#endif 305#endif
300 ;} 306 }
301#endif 307#endif
302 if (neigh->type == RTN_MULTICAST) { 308 if (neigh->type == RTN_MULTICAST) {
303 neigh->nud_state = NUD_NOARP; 309 neigh->nud_state = NUD_NOARP;
304 arp_mc_map(addr, neigh->ha, dev, 1); 310 arp_mc_map(addr, neigh->ha, dev, 1);
305 } else if (dev->flags&(IFF_NOARP|IFF_LOOPBACK)) { 311 } else if (dev->flags & (IFF_NOARP | IFF_LOOPBACK)) {
306 neigh->nud_state = NUD_NOARP; 312 neigh->nud_state = NUD_NOARP;
307 memcpy(neigh->ha, dev->dev_addr, dev->addr_len); 313 memcpy(neigh->ha, dev->dev_addr, dev->addr_len);
308 } else if (neigh->type == RTN_BROADCAST || dev->flags&IFF_POINTOPOINT) { 314 } else if (neigh->type == RTN_BROADCAST ||
315 (dev->flags & IFF_POINTOPOINT)) {
309 neigh->nud_state = NUD_NOARP; 316 neigh->nud_state = NUD_NOARP;
310 memcpy(neigh->ha, dev->broadcast, dev->addr_len); 317 memcpy(neigh->ha, dev->broadcast, dev->addr_len);
311 } 318 }
@@ -315,7 +322,7 @@ static int arp_constructor(struct neighbour *neigh)
315 else 322 else
316 neigh->ops = &arp_generic_ops; 323 neigh->ops = &arp_generic_ops;
317 324
318 if (neigh->nud_state&NUD_VALID) 325 if (neigh->nud_state & NUD_VALID)
319 neigh->output = neigh->ops->connected_output; 326 neigh->output = neigh->ops->connected_output;
320 else 327 else
321 neigh->output = neigh->ops->output; 328 neigh->output = neigh->ops->output;
@@ -334,7 +341,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
334 __be32 saddr = 0; 341 __be32 saddr = 0;
335 u8 *dst_ha = NULL; 342 u8 *dst_ha = NULL;
336 struct net_device *dev = neigh->dev; 343 struct net_device *dev = neigh->dev;
337 __be32 target = *(__be32*)neigh->primary_key; 344 __be32 target = *(__be32 *)neigh->primary_key;
338 int probes = atomic_read(&neigh->probes); 345 int probes = atomic_read(&neigh->probes);
339 struct in_device *in_dev; 346 struct in_device *in_dev;
340 347
@@ -347,7 +354,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
347 switch (IN_DEV_ARP_ANNOUNCE(in_dev)) { 354 switch (IN_DEV_ARP_ANNOUNCE(in_dev)) {
348 default: 355 default:
349 case 0: /* By default announce any local IP */ 356 case 0: /* By default announce any local IP */
350 if (skb && inet_addr_type(dev_net(dev), ip_hdr(skb)->saddr) == RTN_LOCAL) 357 if (skb && inet_addr_type(dev_net(dev),
358 ip_hdr(skb)->saddr) == RTN_LOCAL)
351 saddr = ip_hdr(skb)->saddr; 359 saddr = ip_hdr(skb)->saddr;
352 break; 360 break;
353 case 1: /* Restrict announcements of saddr in same subnet */ 361 case 1: /* Restrict announcements of saddr in same subnet */
@@ -369,16 +377,21 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb)
369 if (!saddr) 377 if (!saddr)
370 saddr = inet_select_addr(dev, target, RT_SCOPE_LINK); 378 saddr = inet_select_addr(dev, target, RT_SCOPE_LINK);
371 379
372 if ((probes -= neigh->parms->ucast_probes) < 0) { 380 probes -= neigh->parms->ucast_probes;
373 if (!(neigh->nud_state&NUD_VALID)) 381 if (probes < 0) {
374 printk(KERN_DEBUG "trying to ucast probe in NUD_INVALID\n"); 382 if (!(neigh->nud_state & NUD_VALID))
383 printk(KERN_DEBUG
384 "trying to ucast probe in NUD_INVALID\n");
375 dst_ha = neigh->ha; 385 dst_ha = neigh->ha;
376 read_lock_bh(&neigh->lock); 386 read_lock_bh(&neigh->lock);
377 } else if ((probes -= neigh->parms->app_probes) < 0) { 387 } else {
388 probes -= neigh->parms->app_probes;
389 if (probes < 0) {
378#ifdef CONFIG_ARPD 390#ifdef CONFIG_ARPD
379 neigh_app_ns(neigh); 391 neigh_app_ns(neigh);
380#endif 392#endif
381 return; 393 return;
394 }
382 } 395 }
383 396
384 arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr, 397 arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr,
@@ -423,14 +436,13 @@ static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip)
423 436
424static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev) 437static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
425{ 438{
426 struct flowi fl = { .nl_u = { .ip4_u = { .daddr = sip,
427 .saddr = tip } } };
428 struct rtable *rt; 439 struct rtable *rt;
429 int flag = 0; 440 int flag = 0;
430 /*unsigned long now; */ 441 /*unsigned long now; */
431 struct net *net = dev_net(dev); 442 struct net *net = dev_net(dev);
432 443
433 if (ip_route_output_key(net, &rt, &fl) < 0) 444 rt = ip_route_output(net, sip, tip, 0, 0);
445 if (IS_ERR(rt))
434 return 1; 446 return 1;
435 if (rt->dst.dev != dev) { 447 if (rt->dst.dev != dev) {
436 NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER); 448 NET_INC_STATS_BH(net, LINUX_MIB_ARPFILTER);
@@ -451,7 +463,8 @@ static int arp_filter(__be32 sip, __be32 tip, struct net_device *dev)
451 * is allowed to use this function, it is scheduled to be removed. --ANK 463 * is allowed to use this function, it is scheduled to be removed. --ANK
452 */ 464 */
453 465
454static int arp_set_predefined(int addr_hint, unsigned char * haddr, __be32 paddr, struct net_device * dev) 466static int arp_set_predefined(int addr_hint, unsigned char *haddr,
467 __be32 paddr, struct net_device *dev)
455{ 468{
456 switch (addr_hint) { 469 switch (addr_hint) {
457 case RTN_LOCAL: 470 case RTN_LOCAL:
@@ -483,17 +496,16 @@ int arp_find(unsigned char *haddr, struct sk_buff *skb)
483 496
484 paddr = skb_rtable(skb)->rt_gateway; 497 paddr = skb_rtable(skb)->rt_gateway;
485 498
486 if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr, paddr, dev)) 499 if (arp_set_predefined(inet_addr_type(dev_net(dev), paddr), haddr,
500 paddr, dev))
487 return 0; 501 return 0;
488 502
489 n = __neigh_lookup(&arp_tbl, &paddr, dev, 1); 503 n = __neigh_lookup(&arp_tbl, &paddr, dev, 1);
490 504
491 if (n) { 505 if (n) {
492 n->used = jiffies; 506 n->used = jiffies;
493 if (n->nud_state&NUD_VALID || neigh_event_send(n, skb) == 0) { 507 if (n->nud_state & NUD_VALID || neigh_event_send(n, skb) == 0) {
494 read_lock_bh(&n->lock); 508 neigh_ha_snapshot(haddr, n, dev);
495 memcpy(haddr, n->ha, dev->addr_len);
496 read_unlock_bh(&n->lock);
497 neigh_release(n); 509 neigh_release(n);
498 return 0; 510 return 0;
499 } 511 }
@@ -515,13 +527,14 @@ int arp_bind_neighbour(struct dst_entry *dst)
515 return -EINVAL; 527 return -EINVAL;
516 if (n == NULL) { 528 if (n == NULL) {
517 __be32 nexthop = ((struct rtable *)dst)->rt_gateway; 529 __be32 nexthop = ((struct rtable *)dst)->rt_gateway;
518 if (dev->flags&(IFF_LOOPBACK|IFF_POINTOPOINT)) 530 if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
519 nexthop = 0; 531 nexthop = 0;
520 n = __neigh_lookup_errno( 532 n = __neigh_lookup_errno(
521#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE) 533#if defined(CONFIG_ATM_CLIP) || defined(CONFIG_ATM_CLIP_MODULE)
522 dev->type == ARPHRD_ATM ? clip_tbl_hook : 534 dev->type == ARPHRD_ATM ?
535 clip_tbl_hook :
523#endif 536#endif
524 &arp_tbl, &nexthop, dev); 537 &arp_tbl, &nexthop, dev);
525 if (IS_ERR(n)) 538 if (IS_ERR(n))
526 return PTR_ERR(n); 539 return PTR_ERR(n);
527 dst->neighbour = n; 540 dst->neighbour = n;
@@ -543,8 +556,8 @@ static inline int arp_fwd_proxy(struct in_device *in_dev,
543 556
544 if (!IN_DEV_PROXY_ARP(in_dev)) 557 if (!IN_DEV_PROXY_ARP(in_dev))
545 return 0; 558 return 0;
546 559 imi = IN_DEV_MEDIUM_ID(in_dev);
547 if ((imi = IN_DEV_MEDIUM_ID(in_dev)) == 0) 560 if (imi == 0)
548 return 1; 561 return 1;
549 if (imi == -1) 562 if (imi == -1)
550 return 0; 563 return 0;
@@ -555,7 +568,7 @@ static inline int arp_fwd_proxy(struct in_device *in_dev,
555 if (out_dev) 568 if (out_dev)
556 omi = IN_DEV_MEDIUM_ID(out_dev); 569 omi = IN_DEV_MEDIUM_ID(out_dev);
557 570
558 return (omi != imi && omi != -1); 571 return omi != imi && omi != -1;
559} 572}
560 573
561/* 574/*
@@ -685,7 +698,7 @@ struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
685 arp->ar_pln = 4; 698 arp->ar_pln = 4;
686 arp->ar_op = htons(type); 699 arp->ar_op = htons(type);
687 700
688 arp_ptr=(unsigned char *)(arp+1); 701 arp_ptr = (unsigned char *)(arp + 1);
689 702
690 memcpy(arp_ptr, src_hw, dev->addr_len); 703 memcpy(arp_ptr, src_hw, dev->addr_len);
691 arp_ptr += dev->addr_len; 704 arp_ptr += dev->addr_len;
@@ -735,9 +748,8 @@ void arp_send(int type, int ptype, __be32 dest_ip,
735 748
736 skb = arp_create(type, ptype, dest_ip, dev, src_ip, 749 skb = arp_create(type, ptype, dest_ip, dev, src_ip,
737 dest_hw, src_hw, target_hw); 750 dest_hw, src_hw, target_hw);
738 if (skb == NULL) { 751 if (skb == NULL)
739 return; 752 return;
740 }
741 753
742 arp_xmit(skb); 754 arp_xmit(skb);
743} 755}
@@ -815,7 +827,7 @@ static int arp_process(struct sk_buff *skb)
815/* 827/*
816 * Extract fields 828 * Extract fields
817 */ 829 */
818 arp_ptr= (unsigned char *)(arp+1); 830 arp_ptr = (unsigned char *)(arp + 1);
819 sha = arp_ptr; 831 sha = arp_ptr;
820 arp_ptr += dev->addr_len; 832 arp_ptr += dev->addr_len;
821 memcpy(&sip, arp_ptr, 4); 833 memcpy(&sip, arp_ptr, 4);
@@ -869,16 +881,17 @@ static int arp_process(struct sk_buff *skb)
869 addr_type = rt->rt_type; 881 addr_type = rt->rt_type;
870 882
871 if (addr_type == RTN_LOCAL) { 883 if (addr_type == RTN_LOCAL) {
872 int dont_send = 0; 884 int dont_send;
873 885
874 if (!dont_send) 886 dont_send = arp_ignore(in_dev, sip, tip);
875 dont_send |= arp_ignore(in_dev,sip,tip);
876 if (!dont_send && IN_DEV_ARPFILTER(in_dev)) 887 if (!dont_send && IN_DEV_ARPFILTER(in_dev))
877 dont_send |= arp_filter(sip,tip,dev); 888 dont_send = arp_filter(sip, tip, dev);
878 if (!dont_send) { 889 if (!dont_send) {
879 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); 890 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
880 if (n) { 891 if (n) {
881 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); 892 arp_send(ARPOP_REPLY, ETH_P_ARP, sip,
893 dev, tip, sha, dev->dev_addr,
894 sha);
882 neigh_release(n); 895 neigh_release(n);
883 } 896 }
884 } 897 }
@@ -887,8 +900,7 @@ static int arp_process(struct sk_buff *skb)
887 if (addr_type == RTN_UNICAST && 900 if (addr_type == RTN_UNICAST &&
888 (arp_fwd_proxy(in_dev, dev, rt) || 901 (arp_fwd_proxy(in_dev, dev, rt) ||
889 arp_fwd_pvlan(in_dev, dev, rt, sip, tip) || 902 arp_fwd_pvlan(in_dev, dev, rt, sip, tip) ||
890 pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) 903 pneigh_lookup(&arp_tbl, net, &tip, dev, 0))) {
891 {
892 n = neigh_event_ns(&arp_tbl, sha, &sip, dev); 904 n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
893 if (n) 905 if (n)
894 neigh_release(n); 906 neigh_release(n);
@@ -896,9 +908,12 @@ static int arp_process(struct sk_buff *skb)
896 if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED || 908 if (NEIGH_CB(skb)->flags & LOCALLY_ENQUEUED ||
897 skb->pkt_type == PACKET_HOST || 909 skb->pkt_type == PACKET_HOST ||
898 in_dev->arp_parms->proxy_delay == 0) { 910 in_dev->arp_parms->proxy_delay == 0) {
899 arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha); 911 arp_send(ARPOP_REPLY, ETH_P_ARP, sip,
912 dev, tip, sha, dev->dev_addr,
913 sha);
900 } else { 914 } else {
901 pneigh_enqueue(&arp_tbl, in_dev->arp_parms, skb); 915 pneigh_enqueue(&arp_tbl,
916 in_dev->arp_parms, skb);
902 return 0; 917 return 0;
903 } 918 }
904 goto out; 919 goto out;
@@ -939,7 +954,8 @@ static int arp_process(struct sk_buff *skb)
939 if (arp->ar_op != htons(ARPOP_REPLY) || 954 if (arp->ar_op != htons(ARPOP_REPLY) ||
940 skb->pkt_type != PACKET_HOST) 955 skb->pkt_type != PACKET_HOST)
941 state = NUD_STALE; 956 state = NUD_STALE;
942 neigh_update(n, sha, state, override ? NEIGH_UPDATE_F_OVERRIDE : 0); 957 neigh_update(n, sha, state,
958 override ? NEIGH_UPDATE_F_OVERRIDE : 0);
943 neigh_release(n); 959 neigh_release(n);
944 } 960 }
945 961
@@ -975,7 +991,8 @@ static int arp_rcv(struct sk_buff *skb, struct net_device *dev,
975 arp->ar_pln != 4) 991 arp->ar_pln != 4)
976 goto freeskb; 992 goto freeskb;
977 993
978 if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) 994 skb = skb_share_check(skb, GFP_ATOMIC);
995 if (skb == NULL)
979 goto out_of_mem; 996 goto out_of_mem;
980 997
981 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb)); 998 memset(NEIGH_CB(skb), 0, sizeof(struct neighbour_cb));
@@ -1018,8 +1035,8 @@ static int arp_req_set_public(struct net *net, struct arpreq *r,
1018 if (mask && mask != htonl(0xFFFFFFFF)) 1035 if (mask && mask != htonl(0xFFFFFFFF))
1019 return -EINVAL; 1036 return -EINVAL;
1020 if (!dev && (r->arp_flags & ATF_COM)) { 1037 if (!dev && (r->arp_flags & ATF_COM)) {
1021 dev = dev_getbyhwaddr(net, r->arp_ha.sa_family, 1038 dev = dev_getbyhwaddr_rcu(net, r->arp_ha.sa_family,
1022 r->arp_ha.sa_data); 1039 r->arp_ha.sa_data);
1023 if (!dev) 1040 if (!dev)
1024 return -ENODEV; 1041 return -ENODEV;
1025 } 1042 }
@@ -1033,7 +1050,7 @@ static int arp_req_set_public(struct net *net, struct arpreq *r,
1033} 1050}
1034 1051
1035static int arp_req_set(struct net *net, struct arpreq *r, 1052static int arp_req_set(struct net *net, struct arpreq *r,
1036 struct net_device * dev) 1053 struct net_device *dev)
1037{ 1054{
1038 __be32 ip; 1055 __be32 ip;
1039 struct neighbour *neigh; 1056 struct neighbour *neigh;
@@ -1046,11 +1063,10 @@ static int arp_req_set(struct net *net, struct arpreq *r,
1046 if (r->arp_flags & ATF_PERM) 1063 if (r->arp_flags & ATF_PERM)
1047 r->arp_flags |= ATF_COM; 1064 r->arp_flags |= ATF_COM;
1048 if (dev == NULL) { 1065 if (dev == NULL) {
1049 struct flowi fl = { .nl_u = { .ip4_u = { .daddr = ip, 1066 struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
1050 .tos = RTO_ONLINK } } }; 1067
1051 struct rtable * rt; 1068 if (IS_ERR(rt))
1052 if ((err = ip_route_output_key(net, &rt, &fl)) != 0) 1069 return PTR_ERR(rt);
1053 return err;
1054 dev = rt->dst.dev; 1070 dev = rt->dst.dev;
1055 ip_rt_put(rt); 1071 ip_rt_put(rt);
1056 if (!dev) 1072 if (!dev)
@@ -1083,9 +1099,9 @@ static int arp_req_set(struct net *net, struct arpreq *r,
1083 unsigned state = NUD_STALE; 1099 unsigned state = NUD_STALE;
1084 if (r->arp_flags & ATF_PERM) 1100 if (r->arp_flags & ATF_PERM)
1085 state = NUD_PERMANENT; 1101 state = NUD_PERMANENT;
1086 err = neigh_update(neigh, (r->arp_flags&ATF_COM) ? 1102 err = neigh_update(neigh, (r->arp_flags & ATF_COM) ?
1087 r->arp_ha.sa_data : NULL, state, 1103 r->arp_ha.sa_data : NULL, state,
1088 NEIGH_UPDATE_F_OVERRIDE| 1104 NEIGH_UPDATE_F_OVERRIDE |
1089 NEIGH_UPDATE_F_ADMIN); 1105 NEIGH_UPDATE_F_ADMIN);
1090 neigh_release(neigh); 1106 neigh_release(neigh);
1091 } 1107 }
@@ -1094,12 +1110,12 @@ static int arp_req_set(struct net *net, struct arpreq *r,
1094 1110
1095static unsigned arp_state_to_flags(struct neighbour *neigh) 1111static unsigned arp_state_to_flags(struct neighbour *neigh)
1096{ 1112{
1097 unsigned flags = 0;
1098 if (neigh->nud_state&NUD_PERMANENT) 1113 if (neigh->nud_state&NUD_PERMANENT)
1099 flags = ATF_PERM|ATF_COM; 1114 return ATF_PERM | ATF_COM;
1100 else if (neigh->nud_state&NUD_VALID) 1115 else if (neigh->nud_state&NUD_VALID)
1101 flags = ATF_COM; 1116 return ATF_COM;
1102 return flags; 1117 else
1118 return 0;
1103} 1119}
1104 1120
1105/* 1121/*
@@ -1126,6 +1142,23 @@ static int arp_req_get(struct arpreq *r, struct net_device *dev)
1126 return err; 1142 return err;
1127} 1143}
1128 1144
1145int arp_invalidate(struct net_device *dev, __be32 ip)
1146{
1147 struct neighbour *neigh = neigh_lookup(&arp_tbl, &ip, dev);
1148 int err = -ENXIO;
1149
1150 if (neigh) {
1151 if (neigh->nud_state & ~NUD_NOARP)
1152 err = neigh_update(neigh, NULL, NUD_FAILED,
1153 NEIGH_UPDATE_F_OVERRIDE|
1154 NEIGH_UPDATE_F_ADMIN);
1155 neigh_release(neigh);
1156 }
1157
1158 return err;
1159}
1160EXPORT_SYMBOL(arp_invalidate);
1161
1129static int arp_req_delete_public(struct net *net, struct arpreq *r, 1162static int arp_req_delete_public(struct net *net, struct arpreq *r,
1130 struct net_device *dev) 1163 struct net_device *dev)
1131{ 1164{
@@ -1142,37 +1175,24 @@ static int arp_req_delete_public(struct net *net, struct arpreq *r,
1142} 1175}
1143 1176
1144static int arp_req_delete(struct net *net, struct arpreq *r, 1177static int arp_req_delete(struct net *net, struct arpreq *r,
1145 struct net_device * dev) 1178 struct net_device *dev)
1146{ 1179{
1147 int err;
1148 __be32 ip; 1180 __be32 ip;
1149 struct neighbour *neigh;
1150 1181
1151 if (r->arp_flags & ATF_PUBL) 1182 if (r->arp_flags & ATF_PUBL)
1152 return arp_req_delete_public(net, r, dev); 1183 return arp_req_delete_public(net, r, dev);
1153 1184
1154 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr; 1185 ip = ((struct sockaddr_in *)&r->arp_pa)->sin_addr.s_addr;
1155 if (dev == NULL) { 1186 if (dev == NULL) {
1156 struct flowi fl = { .nl_u = { .ip4_u = { .daddr = ip, 1187 struct rtable *rt = ip_route_output(net, ip, 0, RTO_ONLINK, 0);
1157 .tos = RTO_ONLINK } } }; 1188 if (IS_ERR(rt))
1158 struct rtable * rt; 1189 return PTR_ERR(rt);
1159 if ((err = ip_route_output_key(net, &rt, &fl)) != 0)
1160 return err;
1161 dev = rt->dst.dev; 1190 dev = rt->dst.dev;
1162 ip_rt_put(rt); 1191 ip_rt_put(rt);
1163 if (!dev) 1192 if (!dev)
1164 return -EINVAL; 1193 return -EINVAL;
1165 } 1194 }
1166 err = -ENXIO; 1195 return arp_invalidate(dev, ip);
1167 neigh = neigh_lookup(&arp_tbl, &ip, dev);
1168 if (neigh) {
1169 if (neigh->nud_state&~NUD_NOARP)
1170 err = neigh_update(neigh, NULL, NUD_FAILED,
1171 NEIGH_UPDATE_F_OVERRIDE|
1172 NEIGH_UPDATE_F_ADMIN);
1173 neigh_release(neigh);
1174 }
1175 return err;
1176} 1196}
1177 1197
1178/* 1198/*
@@ -1186,24 +1206,24 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1186 struct net_device *dev = NULL; 1206 struct net_device *dev = NULL;
1187 1207
1188 switch (cmd) { 1208 switch (cmd) {
1189 case SIOCDARP: 1209 case SIOCDARP:
1190 case SIOCSARP: 1210 case SIOCSARP:
1191 if (!capable(CAP_NET_ADMIN)) 1211 if (!capable(CAP_NET_ADMIN))
1192 return -EPERM; 1212 return -EPERM;
1193 case SIOCGARP: 1213 case SIOCGARP:
1194 err = copy_from_user(&r, arg, sizeof(struct arpreq)); 1214 err = copy_from_user(&r, arg, sizeof(struct arpreq));
1195 if (err) 1215 if (err)
1196 return -EFAULT; 1216 return -EFAULT;
1197 break; 1217 break;
1198 default: 1218 default:
1199 return -EINVAL; 1219 return -EINVAL;
1200 } 1220 }
1201 1221
1202 if (r.arp_pa.sa_family != AF_INET) 1222 if (r.arp_pa.sa_family != AF_INET)
1203 return -EPFNOSUPPORT; 1223 return -EPFNOSUPPORT;
1204 1224
1205 if (!(r.arp_flags & ATF_PUBL) && 1225 if (!(r.arp_flags & ATF_PUBL) &&
1206 (r.arp_flags & (ATF_NETMASK|ATF_DONTPUB))) 1226 (r.arp_flags & (ATF_NETMASK | ATF_DONTPUB)))
1207 return -EINVAL; 1227 return -EINVAL;
1208 if (!(r.arp_flags & ATF_NETMASK)) 1228 if (!(r.arp_flags & ATF_NETMASK))
1209 ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr = 1229 ((struct sockaddr_in *)&r.arp_netmask)->sin_addr.s_addr =
@@ -1211,7 +1231,8 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1211 rtnl_lock(); 1231 rtnl_lock();
1212 if (r.arp_dev[0]) { 1232 if (r.arp_dev[0]) {
1213 err = -ENODEV; 1233 err = -ENODEV;
1214 if ((dev = __dev_get_by_name(net, r.arp_dev)) == NULL) 1234 dev = __dev_get_by_name(net, r.arp_dev);
1235 if (dev == NULL)
1215 goto out; 1236 goto out;
1216 1237
1217 /* Mmmm... It is wrong... ARPHRD_NETROM==0 */ 1238 /* Mmmm... It is wrong... ARPHRD_NETROM==0 */
@@ -1234,16 +1255,17 @@ int arp_ioctl(struct net *net, unsigned int cmd, void __user *arg)
1234 break; 1255 break;
1235 case SIOCGARP: 1256 case SIOCGARP:
1236 err = arp_req_get(&r, dev); 1257 err = arp_req_get(&r, dev);
1237 if (!err && copy_to_user(arg, &r, sizeof(r)))
1238 err = -EFAULT;
1239 break; 1258 break;
1240 } 1259 }
1241out: 1260out:
1242 rtnl_unlock(); 1261 rtnl_unlock();
1262 if (cmd == SIOCGARP && !err && copy_to_user(arg, &r, sizeof(r)))
1263 err = -EFAULT;
1243 return err; 1264 return err;
1244} 1265}
1245 1266
1246static int arp_netdev_event(struct notifier_block *this, unsigned long event, void *ptr) 1267static int arp_netdev_event(struct notifier_block *this, unsigned long event,
1268 void *ptr)
1247{ 1269{
1248 struct net_device *dev = ptr; 1270 struct net_device *dev = ptr;
1249 1271
@@ -1311,12 +1333,13 @@ static char *ax2asc2(ax25_address *a, char *buf)
1311 for (n = 0, s = buf; n < 6; n++) { 1333 for (n = 0, s = buf; n < 6; n++) {
1312 c = (a->ax25_call[n] >> 1) & 0x7F; 1334 c = (a->ax25_call[n] >> 1) & 0x7F;
1313 1335
1314 if (c != ' ') *s++ = c; 1336 if (c != ' ')
1337 *s++ = c;
1315 } 1338 }
1316 1339
1317 *s++ = '-'; 1340 *s++ = '-';
1318 1341 n = (a->ax25_call[6] >> 1) & 0x0F;
1319 if ((n = ((a->ax25_call[6] >> 1) & 0x0F)) > 9) { 1342 if (n > 9) {
1320 *s++ = '1'; 1343 *s++ = '1';
1321 n -= 10; 1344 n -= 10;
1322 } 1345 }
@@ -1325,10 +1348,9 @@ static char *ax2asc2(ax25_address *a, char *buf)
1325 *s++ = '\0'; 1348 *s++ = '\0';
1326 1349
1327 if (*buf == '\0' || *buf == '-') 1350 if (*buf == '\0' || *buf == '-')
1328 return "*"; 1351 return "*";
1329 1352
1330 return buf; 1353 return buf;
1331
1332} 1354}
1333#endif /* CONFIG_AX25 */ 1355#endif /* CONFIG_AX25 */
1334 1356
@@ -1408,10 +1430,10 @@ static void *arp_seq_start(struct seq_file *seq, loff_t *pos)
1408/* ------------------------------------------------------------------------ */ 1430/* ------------------------------------------------------------------------ */
1409 1431
1410static const struct seq_operations arp_seq_ops = { 1432static const struct seq_operations arp_seq_ops = {
1411 .start = arp_seq_start, 1433 .start = arp_seq_start,
1412 .next = neigh_seq_next, 1434 .next = neigh_seq_next,
1413 .stop = neigh_seq_stop, 1435 .stop = neigh_seq_stop,
1414 .show = arp_seq_show, 1436 .show = arp_seq_show,
1415}; 1437};
1416 1438
1417static int arp_seq_open(struct inode *inode, struct file *file) 1439static int arp_seq_open(struct inode *inode, struct file *file)