aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/ipv6.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/ipv6.c')
-rw-r--r--net/sctp/ipv6.c36
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)