diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-15 12:40:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-15 12:40:05 -0400 |
commit | 2ed0e21b30b53d3a94e204196e523e6c8f732b56 (patch) | |
tree | de2635426477d86338a9469ce09ba0626052288f /net/ipv6/ip6mr.c | |
parent | 0fa213310cd8fa7a51071cdcf130e26fa56e9549 (diff) | |
parent | 9cbc1cb8cd46ce1f7645b9de249b2ce8460129bb (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1244 commits)
pkt_sched: Rename PSCHED_US2NS and PSCHED_NS2US
ipv4: Fix fib_trie rebalancing
Bluetooth: Fix issue with uninitialized nsh.type in DTL-1 driver
Bluetooth: Fix Kconfig issue with RFKILL integration
PIM-SM: namespace changes
ipv4: update ARPD help text
net: use a deferred timer in rt_check_expire
ieee802154: fix kconfig bool/tristate muckup
bonding: initialization rework
bonding: use is_zero_ether_addr
bonding: network device names are case sensative
bonding: elminate bad refcount code
bonding: fix style issues
bonding: fix destructor
bonding: remove bonding read/write semaphore
bonding: initialize before registration
bonding: bond_create always called with default parameters
x_tables: Convert printk to pr_err
netfilter: conntrack: optional reliable conntrack event delivery
list_nulls: add hlist_nulls_add_head and hlist_nulls_del
...
Diffstat (limited to 'net/ipv6/ip6mr.c')
-rw-r--r-- | net/ipv6/ip6mr.c | 33 |
1 files changed, 18 insertions, 15 deletions
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 228be551e9c1..c769f155c698 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -398,10 +398,9 @@ static int pim6_rcv(struct sk_buff *skb) | |||
398 | skb->protocol = htons(ETH_P_IPV6); | 398 | skb->protocol = htons(ETH_P_IPV6); |
399 | skb->ip_summed = 0; | 399 | skb->ip_summed = 0; |
400 | skb->pkt_type = PACKET_HOST; | 400 | skb->pkt_type = PACKET_HOST; |
401 | dst_release(skb->dst); | 401 | skb_dst_drop(skb); |
402 | reg_dev->stats.rx_bytes += skb->len; | 402 | reg_dev->stats.rx_bytes += skb->len; |
403 | reg_dev->stats.rx_packets++; | 403 | reg_dev->stats.rx_packets++; |
404 | skb->dst = NULL; | ||
405 | nf_reset(skb); | 404 | nf_reset(skb); |
406 | netif_rx(skb); | 405 | netif_rx(skb); |
407 | dev_put(reg_dev); | 406 | dev_put(reg_dev); |
@@ -442,6 +441,7 @@ static void reg_vif_setup(struct net_device *dev) | |||
442 | dev->flags = IFF_NOARP; | 441 | dev->flags = IFF_NOARP; |
443 | dev->netdev_ops = ®_vif_netdev_ops; | 442 | dev->netdev_ops = ®_vif_netdev_ops; |
444 | dev->destructor = free_netdev; | 443 | dev->destructor = free_netdev; |
444 | dev->features |= NETIF_F_NETNS_LOCAL; | ||
445 | } | 445 | } |
446 | 446 | ||
447 | static struct net_device *ip6mr_reg_vif(struct net *net) | 447 | static struct net_device *ip6mr_reg_vif(struct net *net) |
@@ -849,7 +849,7 @@ static int ip6mr_cache_report(struct net *net, struct sk_buff *pkt, mifi_t mifi, | |||
849 | ipv6_addr_copy(&msg->im6_src, &ipv6_hdr(pkt)->saddr); | 849 | ipv6_addr_copy(&msg->im6_src, &ipv6_hdr(pkt)->saddr); |
850 | ipv6_addr_copy(&msg->im6_dst, &ipv6_hdr(pkt)->daddr); | 850 | ipv6_addr_copy(&msg->im6_dst, &ipv6_hdr(pkt)->daddr); |
851 | 851 | ||
852 | skb->dst = dst_clone(pkt->dst); | 852 | skb_dst_set(skb, dst_clone(skb_dst(pkt))); |
853 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 853 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
854 | } | 854 | } |
855 | 855 | ||
@@ -1078,7 +1078,18 @@ int __init ip6_mr_init(void) | |||
1078 | err = register_netdevice_notifier(&ip6_mr_notifier); | 1078 | err = register_netdevice_notifier(&ip6_mr_notifier); |
1079 | if (err) | 1079 | if (err) |
1080 | goto reg_notif_fail; | 1080 | goto reg_notif_fail; |
1081 | #ifdef CONFIG_IPV6_PIMSM_V2 | ||
1082 | if (inet6_add_protocol(&pim6_protocol, IPPROTO_PIM) < 0) { | ||
1083 | printk(KERN_ERR "ip6_mr_init: can't add PIM protocol\n"); | ||
1084 | err = -EAGAIN; | ||
1085 | goto add_proto_fail; | ||
1086 | } | ||
1087 | #endif | ||
1081 | return 0; | 1088 | return 0; |
1089 | #ifdef CONFIG_IPV6_PIMSM_V2 | ||
1090 | add_proto_fail: | ||
1091 | unregister_netdevice_notifier(&ip6_mr_notifier); | ||
1092 | #endif | ||
1082 | reg_notif_fail: | 1093 | reg_notif_fail: |
1083 | del_timer(&ipmr_expire_timer); | 1094 | del_timer(&ipmr_expire_timer); |
1084 | unregister_pernet_subsys(&ip6mr_net_ops); | 1095 | unregister_pernet_subsys(&ip6mr_net_ops); |
@@ -1364,14 +1375,6 @@ int ip6_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, int | |||
1364 | if (v != net->ipv6.mroute_do_pim) { | 1375 | if (v != net->ipv6.mroute_do_pim) { |
1365 | net->ipv6.mroute_do_pim = v; | 1376 | net->ipv6.mroute_do_pim = v; |
1366 | net->ipv6.mroute_do_assert = v; | 1377 | net->ipv6.mroute_do_assert = v; |
1367 | if (net->ipv6.mroute_do_pim) | ||
1368 | ret = inet6_add_protocol(&pim6_protocol, | ||
1369 | IPPROTO_PIM); | ||
1370 | else | ||
1371 | ret = inet6_del_protocol(&pim6_protocol, | ||
1372 | IPPROTO_PIM); | ||
1373 | if (ret < 0) | ||
1374 | ret = -EAGAIN; | ||
1375 | } | 1378 | } |
1376 | rtnl_unlock(); | 1379 | rtnl_unlock(); |
1377 | return ret; | 1380 | return ret; |
@@ -1487,7 +1490,7 @@ int ip6mr_ioctl(struct sock *sk, int cmd, void __user *arg) | |||
1487 | 1490 | ||
1488 | static inline int ip6mr_forward2_finish(struct sk_buff *skb) | 1491 | static inline int ip6mr_forward2_finish(struct sk_buff *skb) |
1489 | { | 1492 | { |
1490 | IP6_INC_STATS_BH(dev_net(skb->dst->dev), ip6_dst_idev(skb->dst), | 1493 | IP6_INC_STATS_BH(dev_net(skb_dst(skb)->dev), ip6_dst_idev(skb_dst(skb)), |
1491 | IPSTATS_MIB_OUTFORWDATAGRAMS); | 1494 | IPSTATS_MIB_OUTFORWDATAGRAMS); |
1492 | return dst_output(skb); | 1495 | return dst_output(skb); |
1493 | } | 1496 | } |
@@ -1532,8 +1535,8 @@ static int ip6mr_forward2(struct sk_buff *skb, struct mfc6_cache *c, int vifi) | |||
1532 | if (!dst) | 1535 | if (!dst) |
1533 | goto out_free; | 1536 | goto out_free; |
1534 | 1537 | ||
1535 | dst_release(skb->dst); | 1538 | skb_dst_drop(skb); |
1536 | skb->dst = dst; | 1539 | skb_dst_set(skb, dst); |
1537 | 1540 | ||
1538 | /* | 1541 | /* |
1539 | * RFC1584 teaches, that DVMRP/PIM router must deliver packets locally | 1542 | * RFC1584 teaches, that DVMRP/PIM router must deliver packets locally |
@@ -1722,7 +1725,7 @@ int ip6mr_get_route(struct net *net, | |||
1722 | { | 1725 | { |
1723 | int err; | 1726 | int err; |
1724 | struct mfc6_cache *cache; | 1727 | struct mfc6_cache *cache; |
1725 | struct rt6_info *rt = (struct rt6_info *)skb->dst; | 1728 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); |
1726 | 1729 | ||
1727 | read_lock(&mrt_lock); | 1730 | read_lock(&mrt_lock); |
1728 | cache = ip6mr_cache_find(net, &rt->rt6i_src.addr, &rt->rt6i_dst.addr); | 1731 | cache = ip6mr_cache_find(net, &rt->rt6i_src.addr, &rt->rt6i_dst.addr); |