diff options
Diffstat (limited to 'net/sctp/ipv6.c')
-rw-r--r-- | net/sctp/ipv6.c | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index ed7139ea797..ea14cb44529 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -99,6 +99,7 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev, | |||
99 | struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr; | 99 | struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr; |
100 | struct sctp_sockaddr_entry *addr = NULL; | 100 | struct sctp_sockaddr_entry *addr = NULL; |
101 | struct sctp_sockaddr_entry *temp; | 101 | struct sctp_sockaddr_entry *temp; |
102 | struct net *net = dev_net(ifa->idev->dev); | ||
102 | int found = 0; | 103 | int found = 0; |
103 | 104 | ||
104 | switch (ev) { | 105 | switch (ev) { |
@@ -110,27 +111,27 @@ static int sctp_inet6addr_event(struct notifier_block *this, unsigned long ev, | |||
110 | addr->a.v6.sin6_addr = ifa->addr; | 111 | addr->a.v6.sin6_addr = ifa->addr; |
111 | addr->a.v6.sin6_scope_id = ifa->idev->dev->ifindex; | 112 | addr->a.v6.sin6_scope_id = ifa->idev->dev->ifindex; |
112 | addr->valid = 1; | 113 | addr->valid = 1; |
113 | spin_lock_bh(&sctp_local_addr_lock); | 114 | spin_lock_bh(&net->sctp.local_addr_lock); |
114 | list_add_tail_rcu(&addr->list, &sctp_local_addr_list); | 115 | list_add_tail_rcu(&addr->list, &net->sctp.local_addr_list); |
115 | sctp_addr_wq_mgmt(addr, SCTP_ADDR_NEW); | 116 | sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_NEW); |
116 | spin_unlock_bh(&sctp_local_addr_lock); | 117 | spin_unlock_bh(&net->sctp.local_addr_lock); |
117 | } | 118 | } |
118 | break; | 119 | break; |
119 | case NETDEV_DOWN: | 120 | case NETDEV_DOWN: |
120 | spin_lock_bh(&sctp_local_addr_lock); | 121 | spin_lock_bh(&net->sctp.local_addr_lock); |
121 | list_for_each_entry_safe(addr, temp, | 122 | list_for_each_entry_safe(addr, temp, |
122 | &sctp_local_addr_list, list) { | 123 | &net->sctp.local_addr_list, list) { |
123 | if (addr->a.sa.sa_family == AF_INET6 && | 124 | if (addr->a.sa.sa_family == AF_INET6 && |
124 | ipv6_addr_equal(&addr->a.v6.sin6_addr, | 125 | ipv6_addr_equal(&addr->a.v6.sin6_addr, |
125 | &ifa->addr)) { | 126 | &ifa->addr)) { |
126 | sctp_addr_wq_mgmt(addr, SCTP_ADDR_DEL); | 127 | sctp_addr_wq_mgmt(net, addr, SCTP_ADDR_DEL); |
127 | found = 1; | 128 | found = 1; |
128 | addr->valid = 0; | 129 | addr->valid = 0; |
129 | list_del_rcu(&addr->list); | 130 | list_del_rcu(&addr->list); |
130 | break; | 131 | break; |
131 | } | 132 | } |
132 | } | 133 | } |
133 | spin_unlock_bh(&sctp_local_addr_lock); | 134 | spin_unlock_bh(&net->sctp.local_addr_lock); |
134 | if (found) | 135 | if (found) |
135 | kfree_rcu(addr, rcu); | 136 | kfree_rcu(addr, rcu); |
136 | break; | 137 | break; |
@@ -154,6 +155,7 @@ SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
154 | struct ipv6_pinfo *np; | 155 | struct ipv6_pinfo *np; |
155 | sk_buff_data_t saveip, savesctp; | 156 | sk_buff_data_t saveip, savesctp; |
156 | int err; | 157 | int err; |
158 | struct net *net = dev_net(skb->dev); | ||
157 | 159 | ||
158 | idev = in6_dev_get(skb->dev); | 160 | idev = in6_dev_get(skb->dev); |
159 | 161 | ||
@@ -162,12 +164,12 @@ SCTP_STATIC void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
162 | savesctp = skb->transport_header; | 164 | savesctp = skb->transport_header; |
163 | skb_reset_network_header(skb); | 165 | skb_reset_network_header(skb); |
164 | skb_set_transport_header(skb, offset); | 166 | skb_set_transport_header(skb, offset); |
165 | sk = sctp_err_lookup(AF_INET6, skb, sctp_hdr(skb), &asoc, &transport); | 167 | sk = sctp_err_lookup(net, AF_INET6, skb, sctp_hdr(skb), &asoc, &transport); |
166 | /* Put back, the original pointers. */ | 168 | /* Put back, the original pointers. */ |
167 | skb->network_header = saveip; | 169 | skb->network_header = saveip; |
168 | skb->transport_header = savesctp; | 170 | skb->transport_header = savesctp; |
169 | if (!sk) { | 171 | if (!sk) { |
170 | ICMP6_INC_STATS_BH(dev_net(skb->dev), idev, ICMP6_MIB_INERRORS); | 172 | ICMP6_INC_STATS_BH(net, idev, ICMP6_MIB_INERRORS); |
171 | goto out; | 173 | goto out; |
172 | } | 174 | } |
173 | 175 | ||
@@ -241,7 +243,7 @@ static int sctp_v6_xmit(struct sk_buff *skb, struct sctp_transport *transport) | |||
241 | __func__, skb, skb->len, | 243 | __func__, skb, skb->len, |
242 | &fl6.saddr, &fl6.daddr); | 244 | &fl6.saddr, &fl6.daddr); |
243 | 245 | ||
244 | SCTP_INC_STATS(SCTP_MIB_OUTSCTPPACKS); | 246 | SCTP_INC_STATS(sock_net(sk), SCTP_MIB_OUTSCTPPACKS); |
245 | 247 | ||
246 | if (!(transport->param_flags & SPP_PMTUD_ENABLE)) | 248 | if (!(transport->param_flags & SPP_PMTUD_ENABLE)) |
247 | skb->local_df = 1; | 249 | skb->local_df = 1; |
@@ -580,7 +582,7 @@ static int sctp_v6_available(union sctp_addr *addr, struct sctp_sock *sp) | |||
580 | if (!(type & IPV6_ADDR_UNICAST)) | 582 | if (!(type & IPV6_ADDR_UNICAST)) |
581 | return 0; | 583 | return 0; |
582 | 584 | ||
583 | return ipv6_chk_addr(&init_net, in6, NULL, 0); | 585 | return ipv6_chk_addr(sock_net(&sp->inet.sk), in6, NULL, 0); |
584 | } | 586 | } |
585 | 587 | ||
586 | /* This function checks if the address is a valid address to be used for | 588 | /* This function checks if the address is a valid address to be used for |
@@ -857,14 +859,14 @@ static int sctp_inet6_bind_verify(struct sctp_sock *opt, union sctp_addr *addr) | |||
857 | struct net_device *dev; | 859 | struct net_device *dev; |
858 | 860 | ||
859 | if (type & IPV6_ADDR_LINKLOCAL) { | 861 | if (type & IPV6_ADDR_LINKLOCAL) { |
862 | struct net *net; | ||
860 | if (!addr->v6.sin6_scope_id) | 863 | if (!addr->v6.sin6_scope_id) |
861 | return 0; | 864 | return 0; |
865 | net = sock_net(&opt->inet.sk); | ||
862 | rcu_read_lock(); | 866 | rcu_read_lock(); |
863 | dev = dev_get_by_index_rcu(&init_net, | 867 | dev = dev_get_by_index_rcu(net, addr->v6.sin6_scope_id); |
864 | addr->v6.sin6_scope_id); | ||
865 | if (!dev || | 868 | if (!dev || |
866 | !ipv6_chk_addr(&init_net, &addr->v6.sin6_addr, | 869 | !ipv6_chk_addr(net, &addr->v6.sin6_addr, dev, 0)) { |
867 | dev, 0)) { | ||
868 | rcu_read_unlock(); | 870 | rcu_read_unlock(); |
869 | return 0; | 871 | return 0; |
870 | } | 872 | } |
@@ -897,7 +899,7 @@ static int sctp_inet6_send_verify(struct sctp_sock *opt, union sctp_addr *addr) | |||
897 | if (!addr->v6.sin6_scope_id) | 899 | if (!addr->v6.sin6_scope_id) |
898 | return 0; | 900 | return 0; |
899 | rcu_read_lock(); | 901 | rcu_read_lock(); |
900 | dev = dev_get_by_index_rcu(&init_net, | 902 | dev = dev_get_by_index_rcu(sock_net(&opt->inet.sk), |
901 | addr->v6.sin6_scope_id); | 903 | addr->v6.sin6_scope_id); |
902 | rcu_read_unlock(); | 904 | rcu_read_unlock(); |
903 | if (!dev) | 905 | if (!dev) |