diff options
author | David S. Miller <davem@davemloft.net> | 2013-10-23 16:28:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-10-23 16:49:34 -0400 |
commit | c3fa32b9764dc45dcf8a2231b1c110abc4a63e0b (patch) | |
tree | 6cf2896a77b65bec64284681e1c3851eb3263e09 /net | |
parent | 34d92d5315b64a3e5292b7e9511c1bb617227fb6 (diff) | |
parent | 320437af954cbe66478f1f5e8b34cb5a8d072191 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/usb/qmi_wwan.c
include/net/dst.h
Trivial merge conflicts, both were overlapping changes.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
40 files changed, 324 insertions, 169 deletions
diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c index ffd5874f2592..33e8f23acddd 100644 --- a/net/bridge/br_fdb.c +++ b/net/bridge/br_fdb.c | |||
@@ -700,7 +700,7 @@ int br_fdb_add(struct ndmsg *ndm, struct nlattr *tb[], | |||
700 | 700 | ||
701 | vid = nla_get_u16(tb[NDA_VLAN]); | 701 | vid = nla_get_u16(tb[NDA_VLAN]); |
702 | 702 | ||
703 | if (vid >= VLAN_N_VID) { | 703 | if (!vid || vid >= VLAN_VID_MASK) { |
704 | pr_info("bridge: RTM_NEWNEIGH with invalid vlan id %d\n", | 704 | pr_info("bridge: RTM_NEWNEIGH with invalid vlan id %d\n", |
705 | vid); | 705 | vid); |
706 | return -EINVAL; | 706 | return -EINVAL; |
@@ -794,7 +794,7 @@ int br_fdb_delete(struct ndmsg *ndm, struct nlattr *tb[], | |||
794 | 794 | ||
795 | vid = nla_get_u16(tb[NDA_VLAN]); | 795 | vid = nla_get_u16(tb[NDA_VLAN]); |
796 | 796 | ||
797 | if (vid >= VLAN_N_VID) { | 797 | if (!vid || vid >= VLAN_VID_MASK) { |
798 | pr_info("bridge: RTM_NEWNEIGH with invalid vlan id %d\n", | 798 | pr_info("bridge: RTM_NEWNEIGH with invalid vlan id %d\n", |
799 | vid); | 799 | vid); |
800 | return -EINVAL; | 800 | return -EINVAL; |
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index 85a09bb5ca51..b7b1914dfa25 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c | |||
@@ -453,7 +453,7 @@ static int __br_mdb_del(struct net_bridge *br, struct br_mdb_entry *entry) | |||
453 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | 453 | call_rcu_bh(&p->rcu, br_multicast_free_pg); |
454 | err = 0; | 454 | err = 0; |
455 | 455 | ||
456 | if (!mp->ports && !mp->mglist && mp->timer_armed && | 456 | if (!mp->ports && !mp->mglist && |
457 | netif_running(br->dev)) | 457 | netif_running(br->dev)) |
458 | mod_timer(&mp->timer, jiffies); | 458 | mod_timer(&mp->timer, jiffies); |
459 | break; | 459 | break; |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 005d876dd86c..0513ef3ce667 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -272,7 +272,7 @@ static void br_multicast_del_pg(struct net_bridge *br, | |||
272 | del_timer(&p->timer); | 272 | del_timer(&p->timer); |
273 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | 273 | call_rcu_bh(&p->rcu, br_multicast_free_pg); |
274 | 274 | ||
275 | if (!mp->ports && !mp->mglist && mp->timer_armed && | 275 | if (!mp->ports && !mp->mglist && |
276 | netif_running(br->dev)) | 276 | netif_running(br->dev)) |
277 | mod_timer(&mp->timer, jiffies); | 277 | mod_timer(&mp->timer, jiffies); |
278 | 278 | ||
@@ -620,7 +620,6 @@ rehash: | |||
620 | 620 | ||
621 | mp->br = br; | 621 | mp->br = br; |
622 | mp->addr = *group; | 622 | mp->addr = *group; |
623 | |||
624 | setup_timer(&mp->timer, br_multicast_group_expired, | 623 | setup_timer(&mp->timer, br_multicast_group_expired, |
625 | (unsigned long)mp); | 624 | (unsigned long)mp); |
626 | 625 | ||
@@ -660,6 +659,7 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
660 | struct net_bridge_mdb_entry *mp; | 659 | struct net_bridge_mdb_entry *mp; |
661 | struct net_bridge_port_group *p; | 660 | struct net_bridge_port_group *p; |
662 | struct net_bridge_port_group __rcu **pp; | 661 | struct net_bridge_port_group __rcu **pp; |
662 | unsigned long now = jiffies; | ||
663 | int err; | 663 | int err; |
664 | 664 | ||
665 | spin_lock(&br->multicast_lock); | 665 | spin_lock(&br->multicast_lock); |
@@ -674,6 +674,7 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
674 | 674 | ||
675 | if (!port) { | 675 | if (!port) { |
676 | mp->mglist = true; | 676 | mp->mglist = true; |
677 | mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
677 | goto out; | 678 | goto out; |
678 | } | 679 | } |
679 | 680 | ||
@@ -681,7 +682,7 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
681 | (p = mlock_dereference(*pp, br)) != NULL; | 682 | (p = mlock_dereference(*pp, br)) != NULL; |
682 | pp = &p->next) { | 683 | pp = &p->next) { |
683 | if (p->port == port) | 684 | if (p->port == port) |
684 | goto out; | 685 | goto found; |
685 | if ((unsigned long)p->port < (unsigned long)port) | 686 | if ((unsigned long)p->port < (unsigned long)port) |
686 | break; | 687 | break; |
687 | } | 688 | } |
@@ -692,6 +693,8 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
692 | rcu_assign_pointer(*pp, p); | 693 | rcu_assign_pointer(*pp, p); |
693 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); | 694 | br_mdb_notify(br->dev, port, group, RTM_NEWMDB); |
694 | 695 | ||
696 | found: | ||
697 | mod_timer(&p->timer, now + br->multicast_membership_interval); | ||
695 | out: | 698 | out: |
696 | err = 0; | 699 | err = 0; |
697 | 700 | ||
@@ -1191,9 +1194,6 @@ static int br_ip4_multicast_query(struct net_bridge *br, | |||
1191 | if (!mp) | 1194 | if (!mp) |
1192 | goto out; | 1195 | goto out; |
1193 | 1196 | ||
1194 | mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
1195 | mp->timer_armed = true; | ||
1196 | |||
1197 | max_delay *= br->multicast_last_member_count; | 1197 | max_delay *= br->multicast_last_member_count; |
1198 | 1198 | ||
1199 | if (mp->mglist && | 1199 | if (mp->mglist && |
@@ -1270,9 +1270,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, | |||
1270 | if (!mp) | 1270 | if (!mp) |
1271 | goto out; | 1271 | goto out; |
1272 | 1272 | ||
1273 | mod_timer(&mp->timer, now + br->multicast_membership_interval); | ||
1274 | mp->timer_armed = true; | ||
1275 | |||
1276 | max_delay *= br->multicast_last_member_count; | 1273 | max_delay *= br->multicast_last_member_count; |
1277 | if (mp->mglist && | 1274 | if (mp->mglist && |
1278 | (timer_pending(&mp->timer) ? | 1275 | (timer_pending(&mp->timer) ? |
@@ -1358,7 +1355,7 @@ static void br_multicast_leave_group(struct net_bridge *br, | |||
1358 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | 1355 | call_rcu_bh(&p->rcu, br_multicast_free_pg); |
1359 | br_mdb_notify(br->dev, port, group, RTM_DELMDB); | 1356 | br_mdb_notify(br->dev, port, group, RTM_DELMDB); |
1360 | 1357 | ||
1361 | if (!mp->ports && !mp->mglist && mp->timer_armed && | 1358 | if (!mp->ports && !mp->mglist && |
1362 | netif_running(br->dev)) | 1359 | netif_running(br->dev)) |
1363 | mod_timer(&mp->timer, jiffies); | 1360 | mod_timer(&mp->timer, jiffies); |
1364 | } | 1361 | } |
@@ -1370,12 +1367,30 @@ static void br_multicast_leave_group(struct net_bridge *br, | |||
1370 | br->multicast_last_member_interval; | 1367 | br->multicast_last_member_interval; |
1371 | 1368 | ||
1372 | if (!port) { | 1369 | if (!port) { |
1373 | if (mp->mglist && mp->timer_armed && | 1370 | if (mp->mglist && |
1374 | (timer_pending(&mp->timer) ? | 1371 | (timer_pending(&mp->timer) ? |
1375 | time_after(mp->timer.expires, time) : | 1372 | time_after(mp->timer.expires, time) : |
1376 | try_to_del_timer_sync(&mp->timer) >= 0)) { | 1373 | try_to_del_timer_sync(&mp->timer) >= 0)) { |
1377 | mod_timer(&mp->timer, time); | 1374 | mod_timer(&mp->timer, time); |
1378 | } | 1375 | } |
1376 | |||
1377 | goto out; | ||
1378 | } | ||
1379 | |||
1380 | for (p = mlock_dereference(mp->ports, br); | ||
1381 | p != NULL; | ||
1382 | p = mlock_dereference(p->next, br)) { | ||
1383 | if (p->port != port) | ||
1384 | continue; | ||
1385 | |||
1386 | if (!hlist_unhashed(&p->mglist) && | ||
1387 | (timer_pending(&p->timer) ? | ||
1388 | time_after(p->timer.expires, time) : | ||
1389 | try_to_del_timer_sync(&p->timer) >= 0)) { | ||
1390 | mod_timer(&p->timer, time); | ||
1391 | } | ||
1392 | |||
1393 | break; | ||
1379 | } | 1394 | } |
1380 | out: | 1395 | out: |
1381 | spin_unlock(&br->multicast_lock); | 1396 | spin_unlock(&br->multicast_lock); |
@@ -1798,7 +1813,6 @@ void br_multicast_stop(struct net_bridge *br) | |||
1798 | hlist_for_each_entry_safe(mp, n, &mdb->mhash[i], | 1813 | hlist_for_each_entry_safe(mp, n, &mdb->mhash[i], |
1799 | hlist[ver]) { | 1814 | hlist[ver]) { |
1800 | del_timer(&mp->timer); | 1815 | del_timer(&mp->timer); |
1801 | mp->timer_armed = false; | ||
1802 | call_rcu_bh(&mp->rcu, br_multicast_free_group); | 1816 | call_rcu_bh(&mp->rcu, br_multicast_free_group); |
1803 | } | 1817 | } |
1804 | } | 1818 | } |
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index e74ddc1c29a8..f75d92e4f96b 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -243,7 +243,7 @@ static int br_afspec(struct net_bridge *br, | |||
243 | 243 | ||
244 | vinfo = nla_data(tb[IFLA_BRIDGE_VLAN_INFO]); | 244 | vinfo = nla_data(tb[IFLA_BRIDGE_VLAN_INFO]); |
245 | 245 | ||
246 | if (vinfo->vid >= VLAN_N_VID) | 246 | if (!vinfo->vid || vinfo->vid >= VLAN_VID_MASK) |
247 | return -EINVAL; | 247 | return -EINVAL; |
248 | 248 | ||
249 | switch (cmd) { | 249 | switch (cmd) { |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 767c4dad8504..d1ca6d956633 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -126,7 +126,6 @@ struct net_bridge_mdb_entry | |||
126 | struct timer_list timer; | 126 | struct timer_list timer; |
127 | struct br_ip addr; | 127 | struct br_ip addr; |
128 | bool mglist; | 128 | bool mglist; |
129 | bool timer_armed; | ||
130 | }; | 129 | }; |
131 | 130 | ||
132 | struct net_bridge_mdb_htable | 131 | struct net_bridge_mdb_htable |
@@ -624,9 +623,7 @@ static inline u16 br_get_pvid(const struct net_port_vlans *v) | |||
624 | * vid wasn't set | 623 | * vid wasn't set |
625 | */ | 624 | */ |
626 | smp_rmb(); | 625 | smp_rmb(); |
627 | return (v->pvid & VLAN_TAG_PRESENT) ? | 626 | return v->pvid ?: VLAN_N_VID; |
628 | (v->pvid & ~VLAN_TAG_PRESENT) : | ||
629 | VLAN_N_VID; | ||
630 | } | 627 | } |
631 | 628 | ||
632 | #else | 629 | #else |
diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c index 108084a04671..656a6f3e40de 100644 --- a/net/bridge/br_stp_if.c +++ b/net/bridge/br_stp_if.c | |||
@@ -134,7 +134,7 @@ static void br_stp_start(struct net_bridge *br) | |||
134 | 134 | ||
135 | if (br->bridge_forward_delay < BR_MIN_FORWARD_DELAY) | 135 | if (br->bridge_forward_delay < BR_MIN_FORWARD_DELAY) |
136 | __br_set_forward_delay(br, BR_MIN_FORWARD_DELAY); | 136 | __br_set_forward_delay(br, BR_MIN_FORWARD_DELAY); |
137 | else if (br->bridge_forward_delay < BR_MAX_FORWARD_DELAY) | 137 | else if (br->bridge_forward_delay > BR_MAX_FORWARD_DELAY) |
138 | __br_set_forward_delay(br, BR_MAX_FORWARD_DELAY); | 138 | __br_set_forward_delay(br, BR_MAX_FORWARD_DELAY); |
139 | 139 | ||
140 | if (r == 0) { | 140 | if (r == 0) { |
diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c index 9a9ffe7e4019..53f0990eab58 100644 --- a/net/bridge/br_vlan.c +++ b/net/bridge/br_vlan.c | |||
@@ -45,37 +45,34 @@ static int __vlan_add(struct net_port_vlans *v, u16 vid, u16 flags) | |||
45 | return 0; | 45 | return 0; |
46 | } | 46 | } |
47 | 47 | ||
48 | if (vid) { | 48 | if (v->port_idx) { |
49 | if (v->port_idx) { | 49 | p = v->parent.port; |
50 | p = v->parent.port; | 50 | br = p->br; |
51 | br = p->br; | 51 | dev = p->dev; |
52 | dev = p->dev; | 52 | } else { |
53 | } else { | 53 | br = v->parent.br; |
54 | br = v->parent.br; | 54 | dev = br->dev; |
55 | dev = br->dev; | 55 | } |
56 | } | 56 | ops = dev->netdev_ops; |
57 | ops = dev->netdev_ops; | 57 | |
58 | 58 | if (p && (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) { | |
59 | if (p && (dev->features & NETIF_F_HW_VLAN_CTAG_FILTER)) { | 59 | /* Add VLAN to the device filter if it is supported. |
60 | /* Add VLAN to the device filter if it is supported. | 60 | * Stricly speaking, this is not necessary now, since |
61 | * Stricly speaking, this is not necessary now, since | 61 | * devices are made promiscuous by the bridge, but if |
62 | * devices are made promiscuous by the bridge, but if | 62 | * that ever changes this code will allow tagged |
63 | * that ever changes this code will allow tagged | 63 | * traffic to enter the bridge. |
64 | * traffic to enter the bridge. | 64 | */ |
65 | */ | 65 | err = ops->ndo_vlan_rx_add_vid(dev, htons(ETH_P_8021Q), |
66 | err = ops->ndo_vlan_rx_add_vid(dev, htons(ETH_P_8021Q), | 66 | vid); |
67 | vid); | 67 | if (err) |
68 | if (err) | 68 | return err; |
69 | return err; | 69 | } |
70 | } | ||
71 | |||
72 | err = br_fdb_insert(br, p, dev->dev_addr, vid); | ||
73 | if (err) { | ||
74 | br_err(br, "failed insert local address into bridge " | ||
75 | "forwarding table\n"); | ||
76 | goto out_filt; | ||
77 | } | ||
78 | 70 | ||
71 | err = br_fdb_insert(br, p, dev->dev_addr, vid); | ||
72 | if (err) { | ||
73 | br_err(br, "failed insert local address into bridge " | ||
74 | "forwarding table\n"); | ||
75 | goto out_filt; | ||
79 | } | 76 | } |
80 | 77 | ||
81 | set_bit(vid, v->vlan_bitmap); | 78 | set_bit(vid, v->vlan_bitmap); |
@@ -98,7 +95,7 @@ static int __vlan_del(struct net_port_vlans *v, u16 vid) | |||
98 | __vlan_delete_pvid(v, vid); | 95 | __vlan_delete_pvid(v, vid); |
99 | clear_bit(vid, v->untagged_bitmap); | 96 | clear_bit(vid, v->untagged_bitmap); |
100 | 97 | ||
101 | if (v->port_idx && vid) { | 98 | if (v->port_idx) { |
102 | struct net_device *dev = v->parent.port->dev; | 99 | struct net_device *dev = v->parent.port->dev; |
103 | const struct net_device_ops *ops = dev->netdev_ops; | 100 | const struct net_device_ops *ops = dev->netdev_ops; |
104 | 101 | ||
@@ -192,6 +189,8 @@ out: | |||
192 | bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, | 189 | bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, |
193 | struct sk_buff *skb, u16 *vid) | 190 | struct sk_buff *skb, u16 *vid) |
194 | { | 191 | { |
192 | int err; | ||
193 | |||
195 | /* If VLAN filtering is disabled on the bridge, all packets are | 194 | /* If VLAN filtering is disabled on the bridge, all packets are |
196 | * permitted. | 195 | * permitted. |
197 | */ | 196 | */ |
@@ -204,20 +203,32 @@ bool br_allowed_ingress(struct net_bridge *br, struct net_port_vlans *v, | |||
204 | if (!v) | 203 | if (!v) |
205 | return false; | 204 | return false; |
206 | 205 | ||
207 | if (br_vlan_get_tag(skb, vid)) { | 206 | err = br_vlan_get_tag(skb, vid); |
207 | if (!*vid) { | ||
208 | u16 pvid = br_get_pvid(v); | 208 | u16 pvid = br_get_pvid(v); |
209 | 209 | ||
210 | /* Frame did not have a tag. See if pvid is set | 210 | /* Frame had a tag with VID 0 or did not have a tag. |
211 | * on this port. That tells us which vlan untagged | 211 | * See if pvid is set on this port. That tells us which |
212 | * traffic belongs to. | 212 | * vlan untagged or priority-tagged traffic belongs to. |
213 | */ | 213 | */ |
214 | if (pvid == VLAN_N_VID) | 214 | if (pvid == VLAN_N_VID) |
215 | return false; | 215 | return false; |
216 | 216 | ||
217 | /* PVID is set on this port. Any untagged ingress | 217 | /* PVID is set on this port. Any untagged or priority-tagged |
218 | * frame is considered to belong to this vlan. | 218 | * ingress frame is considered to belong to this vlan. |
219 | */ | 219 | */ |
220 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), pvid); | 220 | *vid = pvid; |
221 | if (likely(err)) | ||
222 | /* Untagged Frame. */ | ||
223 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), pvid); | ||
224 | else | ||
225 | /* Priority-tagged Frame. | ||
226 | * At this point, We know that skb->vlan_tci had | ||
227 | * VLAN_TAG_PRESENT bit and its VID field was 0x000. | ||
228 | * We update only VID field and preserve PCP field. | ||
229 | */ | ||
230 | skb->vlan_tci |= pvid; | ||
231 | |||
221 | return true; | 232 | return true; |
222 | } | 233 | } |
223 | 234 | ||
@@ -248,7 +259,9 @@ bool br_allowed_egress(struct net_bridge *br, | |||
248 | return false; | 259 | return false; |
249 | } | 260 | } |
250 | 261 | ||
251 | /* Must be protected by RTNL */ | 262 | /* Must be protected by RTNL. |
263 | * Must be called with vid in range from 1 to 4094 inclusive. | ||
264 | */ | ||
252 | int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags) | 265 | int br_vlan_add(struct net_bridge *br, u16 vid, u16 flags) |
253 | { | 266 | { |
254 | struct net_port_vlans *pv = NULL; | 267 | struct net_port_vlans *pv = NULL; |
@@ -278,7 +291,9 @@ out: | |||
278 | return err; | 291 | return err; |
279 | } | 292 | } |
280 | 293 | ||
281 | /* Must be protected by RTNL */ | 294 | /* Must be protected by RTNL. |
295 | * Must be called with vid in range from 1 to 4094 inclusive. | ||
296 | */ | ||
282 | int br_vlan_delete(struct net_bridge *br, u16 vid) | 297 | int br_vlan_delete(struct net_bridge *br, u16 vid) |
283 | { | 298 | { |
284 | struct net_port_vlans *pv; | 299 | struct net_port_vlans *pv; |
@@ -289,14 +304,9 @@ int br_vlan_delete(struct net_bridge *br, u16 vid) | |||
289 | if (!pv) | 304 | if (!pv) |
290 | return -EINVAL; | 305 | return -EINVAL; |
291 | 306 | ||
292 | if (vid) { | 307 | spin_lock_bh(&br->hash_lock); |
293 | /* If the VID !=0 remove fdb for this vid. VID 0 is special | 308 | fdb_delete_by_addr(br, br->dev->dev_addr, vid); |
294 | * in that it's the default and is always there in the fdb. | 309 | spin_unlock_bh(&br->hash_lock); |
295 | */ | ||
296 | spin_lock_bh(&br->hash_lock); | ||
297 | fdb_delete_by_addr(br, br->dev->dev_addr, vid); | ||
298 | spin_unlock_bh(&br->hash_lock); | ||
299 | } | ||
300 | 310 | ||
301 | __vlan_del(pv, vid); | 311 | __vlan_del(pv, vid); |
302 | return 0; | 312 | return 0; |
@@ -329,7 +339,9 @@ unlock: | |||
329 | return 0; | 339 | return 0; |
330 | } | 340 | } |
331 | 341 | ||
332 | /* Must be protected by RTNL */ | 342 | /* Must be protected by RTNL. |
343 | * Must be called with vid in range from 1 to 4094 inclusive. | ||
344 | */ | ||
333 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) | 345 | int nbp_vlan_add(struct net_bridge_port *port, u16 vid, u16 flags) |
334 | { | 346 | { |
335 | struct net_port_vlans *pv = NULL; | 347 | struct net_port_vlans *pv = NULL; |
@@ -363,7 +375,9 @@ clean_up: | |||
363 | return err; | 375 | return err; |
364 | } | 376 | } |
365 | 377 | ||
366 | /* Must be protected by RTNL */ | 378 | /* Must be protected by RTNL. |
379 | * Must be called with vid in range from 1 to 4094 inclusive. | ||
380 | */ | ||
367 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) | 381 | int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) |
368 | { | 382 | { |
369 | struct net_port_vlans *pv; | 383 | struct net_port_vlans *pv; |
@@ -374,14 +388,9 @@ int nbp_vlan_delete(struct net_bridge_port *port, u16 vid) | |||
374 | if (!pv) | 388 | if (!pv) |
375 | return -EINVAL; | 389 | return -EINVAL; |
376 | 390 | ||
377 | if (vid) { | 391 | spin_lock_bh(&port->br->hash_lock); |
378 | /* If the VID !=0 remove fdb for this vid. VID 0 is special | 392 | fdb_delete_by_addr(port->br, port->dev->dev_addr, vid); |
379 | * in that it's the default and is always there in the fdb. | 393 | spin_unlock_bh(&port->br->hash_lock); |
380 | */ | ||
381 | spin_lock_bh(&port->br->hash_lock); | ||
382 | fdb_delete_by_addr(port->br, port->dev->dev_addr, vid); | ||
383 | spin_unlock_bh(&port->br->hash_lock); | ||
384 | } | ||
385 | 394 | ||
386 | return __vlan_del(pv, vid); | 395 | return __vlan_del(pv, vid); |
387 | } | 396 | } |
diff --git a/net/core/secure_seq.c b/net/core/secure_seq.c index 90e8a8250255..897da56f3aff 100644 --- a/net/core/secure_seq.c +++ b/net/core/secure_seq.c | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <net/secure_seq.h> | 12 | #include <net/secure_seq.h> |
13 | 13 | ||
14 | #if IS_ENABLED(CONFIG_IPV6) || IS_ENABLED(CONFIG_INET) | ||
14 | #define NET_SECRET_SIZE (MD5_MESSAGE_BYTES / 4) | 15 | #define NET_SECRET_SIZE (MD5_MESSAGE_BYTES / 4) |
15 | 16 | ||
16 | static u32 net_secret[NET_SECRET_SIZE] ____cacheline_aligned; | 17 | static u32 net_secret[NET_SECRET_SIZE] ____cacheline_aligned; |
@@ -19,6 +20,7 @@ static __always_inline void net_secret_init(void) | |||
19 | { | 20 | { |
20 | net_get_random_once(net_secret, sizeof(net_secret)); | 21 | net_get_random_once(net_secret, sizeof(net_secret)); |
21 | } | 22 | } |
23 | #endif | ||
22 | 24 | ||
23 | #ifdef CONFIG_INET | 25 | #ifdef CONFIG_INET |
24 | static u32 seq_scale(u32 seq) | 26 | static u32 seq_scale(u32 seq) |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7d8357bb2ba6..8fbac7de1e1b 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -772,15 +772,20 @@ static inline int ip_ufo_append_data(struct sock *sk, | |||
772 | /* initialize protocol header pointer */ | 772 | /* initialize protocol header pointer */ |
773 | skb->transport_header = skb->network_header + fragheaderlen; | 773 | skb->transport_header = skb->network_header + fragheaderlen; |
774 | 774 | ||
775 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
776 | skb->csum = 0; | 775 | skb->csum = 0; |
777 | 776 | ||
778 | /* specify the length of each IP datagram fragment */ | 777 | |
779 | skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; | ||
780 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
781 | __skb_queue_tail(queue, skb); | 778 | __skb_queue_tail(queue, skb); |
779 | } else if (skb_is_gso(skb)) { | ||
780 | goto append; | ||
782 | } | 781 | } |
783 | 782 | ||
783 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
784 | /* specify the length of each IP datagram fragment */ | ||
785 | skb_shinfo(skb)->gso_size = maxfraglen - fragheaderlen; | ||
786 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
787 | |||
788 | append: | ||
784 | return skb_append_datato_frags(sk, skb, getfrag, from, | 789 | return skb_append_datato_frags(sk, skb, getfrag, from, |
785 | (length - transhdrlen)); | 790 | (length - transhdrlen)); |
786 | } | 791 | } |
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 91f69bc883fe..5d9c845d288a 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
@@ -61,8 +61,17 @@ static int vti_rcv(struct sk_buff *skb) | |||
61 | iph->saddr, iph->daddr, 0); | 61 | iph->saddr, iph->daddr, 0); |
62 | if (tunnel != NULL) { | 62 | if (tunnel != NULL) { |
63 | struct pcpu_tstats *tstats; | 63 | struct pcpu_tstats *tstats; |
64 | u32 oldmark = skb->mark; | ||
65 | int ret; | ||
64 | 66 | ||
65 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | 67 | |
68 | /* temporarily mark the skb with the tunnel o_key, to | ||
69 | * only match policies with this mark. | ||
70 | */ | ||
71 | skb->mark = be32_to_cpu(tunnel->parms.o_key); | ||
72 | ret = xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb); | ||
73 | skb->mark = oldmark; | ||
74 | if (!ret) | ||
66 | return -1; | 75 | return -1; |
67 | 76 | ||
68 | tstats = this_cpu_ptr(tunnel->dev->tstats); | 77 | tstats = this_cpu_ptr(tunnel->dev->tstats); |
@@ -71,7 +80,6 @@ static int vti_rcv(struct sk_buff *skb) | |||
71 | tstats->rx_bytes += skb->len; | 80 | tstats->rx_bytes += skb->len; |
72 | u64_stats_update_end(&tstats->syncp); | 81 | u64_stats_update_end(&tstats->syncp); |
73 | 82 | ||
74 | skb->mark = 0; | ||
75 | secpath_reset(skb); | 83 | secpath_reset(skb); |
76 | skb->dev = tunnel->dev; | 84 | skb->dev = tunnel->dev; |
77 | return 1; | 85 | return 1; |
@@ -103,7 +111,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
103 | 111 | ||
104 | memset(&fl4, 0, sizeof(fl4)); | 112 | memset(&fl4, 0, sizeof(fl4)); |
105 | flowi4_init_output(&fl4, tunnel->parms.link, | 113 | flowi4_init_output(&fl4, tunnel->parms.link, |
106 | be32_to_cpu(tunnel->parms.i_key), RT_TOS(tos), | 114 | be32_to_cpu(tunnel->parms.o_key), RT_TOS(tos), |
107 | RT_SCOPE_UNIVERSE, | 115 | RT_SCOPE_UNIVERSE, |
108 | IPPROTO_IPIP, 0, | 116 | IPPROTO_IPIP, 0, |
109 | dst, tiph->saddr, 0, 0); | 117 | dst, tiph->saddr, 0, 0); |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index eb651a069a6c..b935397c703c 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -3338,7 +3338,7 @@ static void tcp_process_tlp_ack(struct sock *sk, u32 ack, int flag) | |||
3338 | tcp_init_cwnd_reduction(sk, true); | 3338 | tcp_init_cwnd_reduction(sk, true); |
3339 | tcp_set_ca_state(sk, TCP_CA_CWR); | 3339 | tcp_set_ca_state(sk, TCP_CA_CWR); |
3340 | tcp_end_cwnd_reduction(sk); | 3340 | tcp_end_cwnd_reduction(sk); |
3341 | tcp_set_ca_state(sk, TCP_CA_Open); | 3341 | tcp_try_keep_open(sk); |
3342 | NET_INC_STATS_BH(sock_net(sk), | 3342 | NET_INC_STATS_BH(sock_net(sk), |
3343 | LINUX_MIB_TCPLOSSPROBERECOVERY); | 3343 | LINUX_MIB_TCPLOSSPROBERECOVERY); |
3344 | } | 3344 | } |
@@ -5751,6 +5751,8 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb, | |||
5751 | } else | 5751 | } else |
5752 | tcp_init_metrics(sk); | 5752 | tcp_init_metrics(sk); |
5753 | 5753 | ||
5754 | tcp_update_pacing_rate(sk); | ||
5755 | |||
5754 | /* Prevent spurious tcp_cwnd_restart() on first data packet */ | 5756 | /* Prevent spurious tcp_cwnd_restart() on first data packet */ |
5755 | tp->lsndtime = tcp_time_stamp; | 5757 | tp->lsndtime = tcp_time_stamp; |
5756 | 5758 | ||
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index ce7c4d9d9195..672854664ff5 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -986,8 +986,10 @@ static void tcp_queue_skb(struct sock *sk, struct sk_buff *skb) | |||
986 | static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb, | 986 | static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb, |
987 | unsigned int mss_now) | 987 | unsigned int mss_now) |
988 | { | 988 | { |
989 | if (skb->len <= mss_now || !sk_can_gso(sk) || | 989 | /* Make sure we own this skb before messing gso_size/gso_segs */ |
990 | skb->ip_summed == CHECKSUM_NONE) { | 990 | WARN_ON_ONCE(skb_cloned(skb)); |
991 | |||
992 | if (skb->len <= mss_now || skb->ip_summed == CHECKSUM_NONE) { | ||
991 | /* Avoid the costly divide in the normal | 993 | /* Avoid the costly divide in the normal |
992 | * non-TSO case. | 994 | * non-TSO case. |
993 | */ | 995 | */ |
@@ -1067,9 +1069,7 @@ int tcp_fragment(struct sock *sk, struct sk_buff *skb, u32 len, | |||
1067 | if (nsize < 0) | 1069 | if (nsize < 0) |
1068 | nsize = 0; | 1070 | nsize = 0; |
1069 | 1071 | ||
1070 | if (skb_cloned(skb) && | 1072 | if (skb_unclone(skb, GFP_ATOMIC)) |
1071 | skb_is_nonlinear(skb) && | ||
1072 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | ||
1073 | return -ENOMEM; | 1073 | return -ENOMEM; |
1074 | 1074 | ||
1075 | /* Get a new skb... force flag on. */ | 1075 | /* Get a new skb... force flag on. */ |
@@ -2344,6 +2344,8 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
2344 | int oldpcount = tcp_skb_pcount(skb); | 2344 | int oldpcount = tcp_skb_pcount(skb); |
2345 | 2345 | ||
2346 | if (unlikely(oldpcount > 1)) { | 2346 | if (unlikely(oldpcount > 1)) { |
2347 | if (skb_unclone(skb, GFP_ATOMIC)) | ||
2348 | return -ENOMEM; | ||
2347 | tcp_init_tso_segs(sk, skb, cur_mss); | 2349 | tcp_init_tso_segs(sk, skb, cur_mss); |
2348 | tcp_adjust_pcount(sk, skb, oldpcount - tcp_skb_pcount(skb)); | 2350 | tcp_adjust_pcount(sk, skb, oldpcount - tcp_skb_pcount(skb)); |
2349 | } | 2351 | } |
diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c index 9a459be24af7..ccde54248c8c 100644 --- a/net/ipv4/xfrm4_policy.c +++ b/net/ipv4/xfrm4_policy.c | |||
@@ -107,6 +107,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
107 | 107 | ||
108 | memset(fl4, 0, sizeof(struct flowi4)); | 108 | memset(fl4, 0, sizeof(struct flowi4)); |
109 | fl4->flowi4_mark = skb->mark; | 109 | fl4->flowi4_mark = skb->mark; |
110 | fl4->flowi4_oif = skb_dst(skb)->dev->ifindex; | ||
110 | 111 | ||
111 | if (!ip_is_fragment(iph)) { | 112 | if (!ip_is_fragment(iph)) { |
112 | switch (iph->protocol) { | 113 | switch (iph->protocol) { |
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index 73784c3d4642..82e1da3a40b9 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -618,8 +618,7 @@ static void ah6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
618 | struct ip_auth_hdr *ah = (struct ip_auth_hdr*)(skb->data+offset); | 618 | struct ip_auth_hdr *ah = (struct ip_auth_hdr*)(skb->data+offset); |
619 | struct xfrm_state *x; | 619 | struct xfrm_state *x; |
620 | 620 | ||
621 | if (type != ICMPV6_DEST_UNREACH && | 621 | if (type != ICMPV6_PKT_TOOBIG && |
622 | type != ICMPV6_PKT_TOOBIG && | ||
623 | type != NDISC_REDIRECT) | 622 | type != NDISC_REDIRECT) |
624 | return; | 623 | return; |
625 | 624 | ||
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index d3618a78fcac..e67e63f9858d 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
@@ -436,8 +436,7 @@ static void esp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
436 | struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset); | 436 | struct ip_esp_hdr *esph = (struct ip_esp_hdr *)(skb->data + offset); |
437 | struct xfrm_state *x; | 437 | struct xfrm_state *x; |
438 | 438 | ||
439 | if (type != ICMPV6_DEST_UNREACH && | 439 | if (type != ICMPV6_PKT_TOOBIG && |
440 | type != ICMPV6_PKT_TOOBIG && | ||
441 | type != NDISC_REDIRECT) | 440 | type != NDISC_REDIRECT) |
442 | return; | 441 | return; |
443 | 442 | ||
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 1ef1fa2b22a6..bf4a9a084de5 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
@@ -976,6 +976,7 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu) | |||
976 | if (t->parms.o_flags&GRE_SEQ) | 976 | if (t->parms.o_flags&GRE_SEQ) |
977 | addend += 4; | 977 | addend += 4; |
978 | } | 978 | } |
979 | t->hlen = addend; | ||
979 | 980 | ||
980 | if (p->flags & IP6_TNL_F_CAP_XMIT) { | 981 | if (p->flags & IP6_TNL_F_CAP_XMIT) { |
981 | int strict = (ipv6_addr_type(&p->raddr) & | 982 | int strict = (ipv6_addr_type(&p->raddr) & |
@@ -1002,8 +1003,6 @@ static void ip6gre_tnl_link_config(struct ip6_tnl *t, int set_mtu) | |||
1002 | } | 1003 | } |
1003 | ip6_rt_put(rt); | 1004 | ip6_rt_put(rt); |
1004 | } | 1005 | } |
1005 | |||
1006 | t->hlen = addend; | ||
1007 | } | 1006 | } |
1008 | 1007 | ||
1009 | static int ip6gre_tnl_change(struct ip6_tnl *t, | 1008 | static int ip6gre_tnl_change(struct ip6_tnl *t, |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a54c45ce4a48..91fb4e8212f5 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -105,7 +105,7 @@ static int ip6_finish_output2(struct sk_buff *skb) | |||
105 | } | 105 | } |
106 | 106 | ||
107 | rcu_read_lock_bh(); | 107 | rcu_read_lock_bh(); |
108 | nexthop = rt6_nexthop((struct rt6_info *)dst, &ipv6_hdr(skb)->daddr); | 108 | nexthop = rt6_nexthop((struct rt6_info *)dst); |
109 | neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop); | 109 | neigh = __ipv6_neigh_lookup_noref(dst->dev, nexthop); |
110 | if (unlikely(!neigh)) | 110 | if (unlikely(!neigh)) |
111 | neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false); | 111 | neigh = __neigh_create(&nd_tbl, nexthop, dst->dev, false); |
@@ -874,7 +874,7 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
874 | */ | 874 | */ |
875 | rt = (struct rt6_info *) *dst; | 875 | rt = (struct rt6_info *) *dst; |
876 | rcu_read_lock_bh(); | 876 | rcu_read_lock_bh(); |
877 | n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt, &fl6->daddr)); | 877 | n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt)); |
878 | err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0; | 878 | err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0; |
879 | rcu_read_unlock_bh(); | 879 | rcu_read_unlock_bh(); |
880 | 880 | ||
@@ -1008,6 +1008,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1008 | 1008 | ||
1009 | { | 1009 | { |
1010 | struct sk_buff *skb; | 1010 | struct sk_buff *skb; |
1011 | struct frag_hdr fhdr; | ||
1011 | int err; | 1012 | int err; |
1012 | 1013 | ||
1013 | /* There is support for UDP large send offload by network | 1014 | /* There is support for UDP large send offload by network |
@@ -1015,8 +1016,6 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1015 | * udp datagram | 1016 | * udp datagram |
1016 | */ | 1017 | */ |
1017 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) { | 1018 | if ((skb = skb_peek_tail(&sk->sk_write_queue)) == NULL) { |
1018 | struct frag_hdr fhdr; | ||
1019 | |||
1020 | skb = sock_alloc_send_skb(sk, | 1019 | skb = sock_alloc_send_skb(sk, |
1021 | hh_len + fragheaderlen + transhdrlen + 20, | 1020 | hh_len + fragheaderlen + transhdrlen + 20, |
1022 | (flags & MSG_DONTWAIT), &err); | 1021 | (flags & MSG_DONTWAIT), &err); |
@@ -1036,20 +1035,24 @@ static inline int ip6_ufo_append_data(struct sock *sk, | |||
1036 | skb->transport_header = skb->network_header + fragheaderlen; | 1035 | skb->transport_header = skb->network_header + fragheaderlen; |
1037 | 1036 | ||
1038 | skb->protocol = htons(ETH_P_IPV6); | 1037 | skb->protocol = htons(ETH_P_IPV6); |
1039 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
1040 | skb->csum = 0; | 1038 | skb->csum = 0; |
1041 | 1039 | ||
1042 | /* Specify the length of each IPv6 datagram fragment. | ||
1043 | * It has to be a multiple of 8. | ||
1044 | */ | ||
1045 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - | ||
1046 | sizeof(struct frag_hdr)) & ~7; | ||
1047 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
1048 | ipv6_select_ident(&fhdr, rt); | ||
1049 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; | ||
1050 | __skb_queue_tail(&sk->sk_write_queue, skb); | 1040 | __skb_queue_tail(&sk->sk_write_queue, skb); |
1041 | } else if (skb_is_gso(skb)) { | ||
1042 | goto append; | ||
1051 | } | 1043 | } |
1052 | 1044 | ||
1045 | skb->ip_summed = CHECKSUM_PARTIAL; | ||
1046 | /* Specify the length of each IPv6 datagram fragment. | ||
1047 | * It has to be a multiple of 8. | ||
1048 | */ | ||
1049 | skb_shinfo(skb)->gso_size = (mtu - fragheaderlen - | ||
1050 | sizeof(struct frag_hdr)) & ~7; | ||
1051 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
1052 | ipv6_select_ident(&fhdr, rt); | ||
1053 | skb_shinfo(skb)->ip6_frag_id = fhdr.identification; | ||
1054 | |||
1055 | append: | ||
1053 | return skb_append_datato_frags(sk, skb, getfrag, from, | 1056 | return skb_append_datato_frags(sk, skb, getfrag, from, |
1054 | (length - transhdrlen)); | 1057 | (length - transhdrlen)); |
1055 | } | 1058 | } |
diff --git a/net/ipv6/ipcomp6.c b/net/ipv6/ipcomp6.c index 5636a912074a..ce507d9e1c90 100644 --- a/net/ipv6/ipcomp6.c +++ b/net/ipv6/ipcomp6.c | |||
@@ -64,8 +64,7 @@ static void ipcomp6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
64 | (struct ip_comp_hdr *)(skb->data + offset); | 64 | (struct ip_comp_hdr *)(skb->data + offset); |
65 | struct xfrm_state *x; | 65 | struct xfrm_state *x; |
66 | 66 | ||
67 | if (type != ICMPV6_DEST_UNREACH && | 67 | if (type != ICMPV6_PKT_TOOBIG && |
68 | type != ICMPV6_PKT_TOOBIG && | ||
69 | type != NDISC_REDIRECT) | 68 | type != NDISC_REDIRECT) |
70 | return; | 69 | return; |
71 | 70 | ||
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index c3130ffc3bca..5dc6ca6b6686 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -476,6 +476,24 @@ out: | |||
476 | } | 476 | } |
477 | 477 | ||
478 | #ifdef CONFIG_IPV6_ROUTER_PREF | 478 | #ifdef CONFIG_IPV6_ROUTER_PREF |
479 | struct __rt6_probe_work { | ||
480 | struct work_struct work; | ||
481 | struct in6_addr target; | ||
482 | struct net_device *dev; | ||
483 | }; | ||
484 | |||
485 | static void rt6_probe_deferred(struct work_struct *w) | ||
486 | { | ||
487 | struct in6_addr mcaddr; | ||
488 | struct __rt6_probe_work *work = | ||
489 | container_of(w, struct __rt6_probe_work, work); | ||
490 | |||
491 | addrconf_addr_solict_mult(&work->target, &mcaddr); | ||
492 | ndisc_send_ns(work->dev, NULL, &work->target, &mcaddr, NULL); | ||
493 | dev_put(work->dev); | ||
494 | kfree(w); | ||
495 | } | ||
496 | |||
479 | static void rt6_probe(struct rt6_info *rt) | 497 | static void rt6_probe(struct rt6_info *rt) |
480 | { | 498 | { |
481 | struct neighbour *neigh; | 499 | struct neighbour *neigh; |
@@ -499,17 +517,23 @@ static void rt6_probe(struct rt6_info *rt) | |||
499 | 517 | ||
500 | if (!neigh || | 518 | if (!neigh || |
501 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { | 519 | time_after(jiffies, neigh->updated + rt->rt6i_idev->cnf.rtr_probe_interval)) { |
502 | struct in6_addr mcaddr; | 520 | struct __rt6_probe_work *work; |
503 | struct in6_addr *target; | ||
504 | 521 | ||
505 | if (neigh) { | 522 | work = kmalloc(sizeof(*work), GFP_ATOMIC); |
523 | |||
524 | if (neigh && work) | ||
506 | neigh->updated = jiffies; | 525 | neigh->updated = jiffies; |
526 | |||
527 | if (neigh) | ||
507 | write_unlock(&neigh->lock); | 528 | write_unlock(&neigh->lock); |
508 | } | ||
509 | 529 | ||
510 | target = (struct in6_addr *)&rt->rt6i_gateway; | 530 | if (work) { |
511 | addrconf_addr_solict_mult(target, &mcaddr); | 531 | INIT_WORK(&work->work, rt6_probe_deferred); |
512 | ndisc_send_ns(rt->dst.dev, NULL, target, &mcaddr, NULL); | 532 | work->target = rt->rt6i_gateway; |
533 | dev_hold(rt->dst.dev); | ||
534 | work->dev = rt->dst.dev; | ||
535 | schedule_work(&work->work); | ||
536 | } | ||
513 | } else { | 537 | } else { |
514 | out: | 538 | out: |
515 | write_unlock(&neigh->lock); | 539 | write_unlock(&neigh->lock); |
@@ -851,7 +875,6 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, | |||
851 | if (ort->rt6i_dst.plen != 128 && | 875 | if (ort->rt6i_dst.plen != 128 && |
852 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) | 876 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) |
853 | rt->rt6i_flags |= RTF_ANYCAST; | 877 | rt->rt6i_flags |= RTF_ANYCAST; |
854 | rt->rt6i_gateway = *daddr; | ||
855 | } | 878 | } |
856 | 879 | ||
857 | rt->rt6i_flags |= RTF_CACHE; | 880 | rt->rt6i_flags |= RTF_CACHE; |
@@ -1335,6 +1358,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
1335 | rt->dst.flags |= DST_HOST; | 1358 | rt->dst.flags |= DST_HOST; |
1336 | rt->dst.output = ip6_output; | 1359 | rt->dst.output = ip6_output; |
1337 | atomic_set(&rt->dst.__refcnt, 1); | 1360 | atomic_set(&rt->dst.__refcnt, 1); |
1361 | rt->rt6i_gateway = fl6->daddr; | ||
1338 | rt->rt6i_dst.addr = fl6->daddr; | 1362 | rt->rt6i_dst.addr = fl6->daddr; |
1339 | rt->rt6i_dst.plen = 128; | 1363 | rt->rt6i_dst.plen = 128; |
1340 | rt->rt6i_idev = idev; | 1364 | rt->rt6i_idev = idev; |
@@ -1870,7 +1894,10 @@ static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, | |||
1870 | in6_dev_hold(rt->rt6i_idev); | 1894 | in6_dev_hold(rt->rt6i_idev); |
1871 | rt->dst.lastuse = jiffies; | 1895 | rt->dst.lastuse = jiffies; |
1872 | 1896 | ||
1873 | rt->rt6i_gateway = ort->rt6i_gateway; | 1897 | if (ort->rt6i_flags & RTF_GATEWAY) |
1898 | rt->rt6i_gateway = ort->rt6i_gateway; | ||
1899 | else | ||
1900 | rt->rt6i_gateway = *dest; | ||
1874 | rt->rt6i_flags = ort->rt6i_flags; | 1901 | rt->rt6i_flags = ort->rt6i_flags; |
1875 | if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) == | 1902 | if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) == |
1876 | (RTF_DEFAULT | RTF_ADDRCONF)) | 1903 | (RTF_DEFAULT | RTF_ADDRCONF)) |
@@ -2157,6 +2184,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
2157 | else | 2184 | else |
2158 | rt->rt6i_flags |= RTF_LOCAL; | 2185 | rt->rt6i_flags |= RTF_LOCAL; |
2159 | 2186 | ||
2187 | rt->rt6i_gateway = *addr; | ||
2160 | rt->rt6i_dst.addr = *addr; | 2188 | rt->rt6i_dst.addr = *addr; |
2161 | rt->rt6i_dst.plen = 128; | 2189 | rt->rt6i_dst.plen = 128; |
2162 | rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); | 2190 | rt->rt6i_table = fib6_get_table(net, RT6_TABLE_LOCAL); |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 44fc4e3d661f..f3893e897f72 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -1243,9 +1243,6 @@ do_udp_sendmsg: | |||
1243 | if (tclass < 0) | 1243 | if (tclass < 0) |
1244 | tclass = np->tclass; | 1244 | tclass = np->tclass; |
1245 | 1245 | ||
1246 | if (dontfrag < 0) | ||
1247 | dontfrag = np->dontfrag; | ||
1248 | |||
1249 | if (msg->msg_flags&MSG_CONFIRM) | 1246 | if (msg->msg_flags&MSG_CONFIRM) |
1250 | goto do_confirm; | 1247 | goto do_confirm; |
1251 | back_from_confirm: | 1248 | back_from_confirm: |
@@ -1264,6 +1261,8 @@ back_from_confirm: | |||
1264 | up->pending = AF_INET6; | 1261 | up->pending = AF_INET6; |
1265 | 1262 | ||
1266 | do_append_data: | 1263 | do_append_data: |
1264 | if (dontfrag < 0) | ||
1265 | dontfrag = np->dontfrag; | ||
1267 | up->len += ulen; | 1266 | up->len += ulen; |
1268 | getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; | 1267 | getfrag = is_udplite ? udplite_getfrag : ip_generic_getfrag; |
1269 | err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen, | 1268 | err = ip6_append_data(sk, getfrag, msg->msg_iov, ulen, |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 23ed03d786c8..08ed2772b7aa 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -138,6 +138,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
138 | 138 | ||
139 | memset(fl6, 0, sizeof(struct flowi6)); | 139 | memset(fl6, 0, sizeof(struct flowi6)); |
140 | fl6->flowi6_mark = skb->mark; | 140 | fl6->flowi6_mark = skb->mark; |
141 | fl6->flowi6_oif = skb_dst(skb)->dev->ifindex; | ||
141 | 142 | ||
142 | fl6->daddr = reverse ? hdr->saddr : hdr->daddr; | 143 | fl6->daddr = reverse ? hdr->saddr : hdr->daddr; |
143 | fl6->saddr = reverse ? hdr->daddr : hdr->saddr; | 144 | fl6->saddr = reverse ? hdr->daddr : hdr->saddr; |
diff --git a/net/key/af_key.c b/net/key/af_key.c index 9d585370c5b4..911ef03bf8fb 100644 --- a/net/key/af_key.c +++ b/net/key/af_key.c | |||
@@ -1098,7 +1098,8 @@ static struct xfrm_state * pfkey_msg2xfrm_state(struct net *net, | |||
1098 | 1098 | ||
1099 | x->id.proto = proto; | 1099 | x->id.proto = proto; |
1100 | x->id.spi = sa->sadb_sa_spi; | 1100 | x->id.spi = sa->sadb_sa_spi; |
1101 | x->props.replay_window = sa->sadb_sa_replay; | 1101 | x->props.replay_window = min_t(unsigned int, sa->sadb_sa_replay, |
1102 | (sizeof(x->replay.bitmap) * 8)); | ||
1102 | if (sa->sadb_sa_flags & SADB_SAFLAGS_NOECN) | 1103 | if (sa->sadb_sa_flags & SADB_SAFLAGS_NOECN) |
1103 | x->props.flags |= XFRM_STATE_NOECN; | 1104 | x->props.flags |= XFRM_STATE_NOECN; |
1104 | if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP) | 1105 | if (sa->sadb_sa_flags & SADB_SAFLAGS_DECAP_DSCP) |
diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c index f0a7adaef2ea..ffda81ef1a70 100644 --- a/net/l2tp/l2tp_ppp.c +++ b/net/l2tp/l2tp_ppp.c | |||
@@ -353,7 +353,9 @@ static int pppol2tp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msgh | |||
353 | goto error_put_sess_tun; | 353 | goto error_put_sess_tun; |
354 | } | 354 | } |
355 | 355 | ||
356 | local_bh_disable(); | ||
356 | l2tp_xmit_skb(session, skb, session->hdr_len); | 357 | l2tp_xmit_skb(session, skb, session->hdr_len); |
358 | local_bh_enable(); | ||
357 | 359 | ||
358 | sock_put(ps->tunnel_sock); | 360 | sock_put(ps->tunnel_sock); |
359 | sock_put(sk); | 361 | sock_put(sk); |
@@ -422,7 +424,9 @@ static int pppol2tp_xmit(struct ppp_channel *chan, struct sk_buff *skb) | |||
422 | skb->data[0] = ppph[0]; | 424 | skb->data[0] = ppph[0]; |
423 | skb->data[1] = ppph[1]; | 425 | skb->data[1] = ppph[1]; |
424 | 426 | ||
427 | local_bh_disable(); | ||
425 | l2tp_xmit_skb(session, skb, session->hdr_len); | 428 | l2tp_xmit_skb(session, skb, session->hdr_len); |
429 | local_bh_enable(); | ||
426 | 430 | ||
427 | sock_put(sk_tun); | 431 | sock_put(sk_tun); |
428 | sock_put(sk); | 432 | sock_put(sk); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index ac28af74a414..b0a651cc389f 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -3564,7 +3564,7 @@ static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev, | |||
3564 | return -EINVAL; | 3564 | return -EINVAL; |
3565 | } | 3565 | } |
3566 | band = chanctx_conf->def.chan->band; | 3566 | band = chanctx_conf->def.chan->band; |
3567 | sta = sta_info_get(sdata, peer); | 3567 | sta = sta_info_get_bss(sdata, peer); |
3568 | if (sta) { | 3568 | if (sta) { |
3569 | qos = test_sta_flag(sta, WLAN_STA_WME); | 3569 | qos = test_sta_flag(sta, WLAN_STA_WME); |
3570 | } else { | 3570 | } else { |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 3a87c8976a32..e73cd0637f3b 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -893,6 +893,8 @@ struct tpt_led_trigger { | |||
893 | * that the scan completed. | 893 | * that the scan completed. |
894 | * @SCAN_ABORTED: Set for our scan work function when the driver reported | 894 | * @SCAN_ABORTED: Set for our scan work function when the driver reported |
895 | * a scan complete for an aborted scan. | 895 | * a scan complete for an aborted scan. |
896 | * @SCAN_HW_CANCELLED: Set for our scan work function when the scan is being | ||
897 | * cancelled. | ||
896 | */ | 898 | */ |
897 | enum { | 899 | enum { |
898 | SCAN_SW_SCANNING, | 900 | SCAN_SW_SCANNING, |
@@ -900,6 +902,7 @@ enum { | |||
900 | SCAN_ONCHANNEL_SCANNING, | 902 | SCAN_ONCHANNEL_SCANNING, |
901 | SCAN_COMPLETED, | 903 | SCAN_COMPLETED, |
902 | SCAN_ABORTED, | 904 | SCAN_ABORTED, |
905 | SCAN_HW_CANCELLED, | ||
903 | }; | 906 | }; |
904 | 907 | ||
905 | /** | 908 | /** |
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c index acd1f71adc03..0c2a29484c07 100644 --- a/net/mac80211/offchannel.c +++ b/net/mac80211/offchannel.c | |||
@@ -394,6 +394,8 @@ void ieee80211_sw_roc_work(struct work_struct *work) | |||
394 | 394 | ||
395 | if (started) | 395 | if (started) |
396 | ieee80211_start_next_roc(local); | 396 | ieee80211_start_next_roc(local); |
397 | else if (list_empty(&local->roc_list)) | ||
398 | ieee80211_run_deferred_scan(local); | ||
397 | } | 399 | } |
398 | 400 | ||
399 | out_unlock: | 401 | out_unlock: |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index ecb57b0bf74a..5ad66a83ef7f 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -238,6 +238,9 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local) | |||
238 | enum ieee80211_band band; | 238 | enum ieee80211_band band; |
239 | int i, ielen, n_chans; | 239 | int i, ielen, n_chans; |
240 | 240 | ||
241 | if (test_bit(SCAN_HW_CANCELLED, &local->scanning)) | ||
242 | return false; | ||
243 | |||
241 | do { | 244 | do { |
242 | if (local->hw_scan_band == IEEE80211_NUM_BANDS) | 245 | if (local->hw_scan_band == IEEE80211_NUM_BANDS) |
243 | return false; | 246 | return false; |
@@ -939,7 +942,23 @@ void ieee80211_scan_cancel(struct ieee80211_local *local) | |||
939 | if (!local->scan_req) | 942 | if (!local->scan_req) |
940 | goto out; | 943 | goto out; |
941 | 944 | ||
945 | /* | ||
946 | * We have a scan running and the driver already reported completion, | ||
947 | * but the worker hasn't run yet or is stuck on the mutex - mark it as | ||
948 | * cancelled. | ||
949 | */ | ||
950 | if (test_bit(SCAN_HW_SCANNING, &local->scanning) && | ||
951 | test_bit(SCAN_COMPLETED, &local->scanning)) { | ||
952 | set_bit(SCAN_HW_CANCELLED, &local->scanning); | ||
953 | goto out; | ||
954 | } | ||
955 | |||
942 | if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { | 956 | if (test_bit(SCAN_HW_SCANNING, &local->scanning)) { |
957 | /* | ||
958 | * Make sure that __ieee80211_scan_completed doesn't trigger a | ||
959 | * scan on another band. | ||
960 | */ | ||
961 | set_bit(SCAN_HW_CANCELLED, &local->scanning); | ||
943 | if (local->ops->cancel_hw_scan) | 962 | if (local->ops->cancel_hw_scan) |
944 | drv_cancel_hw_scan(local, | 963 | drv_cancel_hw_scan(local, |
945 | rcu_dereference_protected(local->scan_sdata, | 964 | rcu_dereference_protected(local->scan_sdata, |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 368837fe3b80..78dc2e99027e 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
@@ -180,6 +180,9 @@ static void ieee80211_frame_acked(struct sta_info *sta, struct sk_buff *skb) | |||
180 | struct ieee80211_local *local = sta->local; | 180 | struct ieee80211_local *local = sta->local; |
181 | struct ieee80211_sub_if_data *sdata = sta->sdata; | 181 | struct ieee80211_sub_if_data *sdata = sta->sdata; |
182 | 182 | ||
183 | if (local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) | ||
184 | sta->last_rx = jiffies; | ||
185 | |||
183 | if (ieee80211_is_data_qos(mgmt->frame_control)) { | 186 | if (ieee80211_is_data_qos(mgmt->frame_control)) { |
184 | struct ieee80211_hdr *hdr = (void *) skb->data; | 187 | struct ieee80211_hdr *hdr = (void *) skb->data; |
185 | u8 *qc = ieee80211_get_qos_ctl(hdr); | 188 | u8 *qc = ieee80211_get_qos_ctl(hdr); |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 4fcbf634b548..9993fcb19ecd 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -1120,7 +1120,8 @@ ieee80211_tx_prepare(struct ieee80211_sub_if_data *sdata, | |||
1120 | tx->sta = rcu_dereference(sdata->u.vlan.sta); | 1120 | tx->sta = rcu_dereference(sdata->u.vlan.sta); |
1121 | if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr) | 1121 | if (!tx->sta && sdata->dev->ieee80211_ptr->use_4addr) |
1122 | return TX_DROP; | 1122 | return TX_DROP; |
1123 | } else if (info->flags & IEEE80211_TX_CTL_INJECTED || | 1123 | } else if (info->flags & (IEEE80211_TX_CTL_INJECTED | |
1124 | IEEE80211_TX_INTFL_NL80211_FRAME_TX) || | ||
1124 | tx->sdata->control_port_protocol == tx->skb->protocol) { | 1125 | tx->sdata->control_port_protocol == tx->skb->protocol) { |
1125 | tx->sta = sta_info_get_bss(sdata, hdr->addr1); | 1126 | tx->sta = sta_info_get_bss(sdata, hdr->addr1); |
1126 | } | 1127 | } |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 1220f5afdb7e..aefb9d5b9620 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -2236,6 +2236,10 @@ u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local, | |||
2236 | } | 2236 | } |
2237 | 2237 | ||
2238 | rate = cfg80211_calculate_bitrate(&ri); | 2238 | rate = cfg80211_calculate_bitrate(&ri); |
2239 | if (WARN_ONCE(!rate, | ||
2240 | "Invalid bitrate: flags=0x%x, idx=%d, vht_nss=%d\n", | ||
2241 | status->flag, status->rate_idx, status->vht_nss)) | ||
2242 | return 0; | ||
2239 | 2243 | ||
2240 | /* rewind from end of MPDU */ | 2244 | /* rewind from end of MPDU */ |
2241 | if (status->flag & RX_FLAG_MACTIME_END) | 2245 | if (status->flag & RX_FLAG_MACTIME_END) |
diff --git a/net/netfilter/nf_conntrack_h323_main.c b/net/netfilter/nf_conntrack_h323_main.c index bdebd03bc8cd..70866d192efc 100644 --- a/net/netfilter/nf_conntrack_h323_main.c +++ b/net/netfilter/nf_conntrack_h323_main.c | |||
@@ -778,8 +778,8 @@ static int callforward_do_filter(const union nf_inet_addr *src, | |||
778 | flowi6_to_flowi(&fl1), false)) { | 778 | flowi6_to_flowi(&fl1), false)) { |
779 | if (!afinfo->route(&init_net, (struct dst_entry **)&rt2, | 779 | if (!afinfo->route(&init_net, (struct dst_entry **)&rt2, |
780 | flowi6_to_flowi(&fl2), false)) { | 780 | flowi6_to_flowi(&fl2), false)) { |
781 | if (!memcmp(&rt1->rt6i_gateway, &rt2->rt6i_gateway, | 781 | if (ipv6_addr_equal(rt6_nexthop(rt1), |
782 | sizeof(rt1->rt6i_gateway)) && | 782 | rt6_nexthop(rt2)) && |
783 | rt1->dst.dev == rt2->dst.dev) | 783 | rt1->dst.dev == rt2->dst.dev) |
784 | ret = 1; | 784 | ret = 1; |
785 | dst_release(&rt2->dst); | 785 | dst_release(&rt2->dst); |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index a6d788d45216..b87e83d07478 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -358,6 +358,21 @@ static psched_time_t packet_len_2_sched_time(unsigned int len, struct netem_sche | |||
358 | return PSCHED_NS2TICKS(ticks); | 358 | return PSCHED_NS2TICKS(ticks); |
359 | } | 359 | } |
360 | 360 | ||
361 | static void tfifo_reset(struct Qdisc *sch) | ||
362 | { | ||
363 | struct netem_sched_data *q = qdisc_priv(sch); | ||
364 | struct rb_node *p; | ||
365 | |||
366 | while ((p = rb_first(&q->t_root))) { | ||
367 | struct sk_buff *skb = netem_rb_to_skb(p); | ||
368 | |||
369 | rb_erase(p, &q->t_root); | ||
370 | skb->next = NULL; | ||
371 | skb->prev = NULL; | ||
372 | kfree_skb(skb); | ||
373 | } | ||
374 | } | ||
375 | |||
361 | static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | 376 | static void tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) |
362 | { | 377 | { |
363 | struct netem_sched_data *q = qdisc_priv(sch); | 378 | struct netem_sched_data *q = qdisc_priv(sch); |
@@ -520,6 +535,7 @@ static unsigned int netem_drop(struct Qdisc *sch) | |||
520 | skb->next = NULL; | 535 | skb->next = NULL; |
521 | skb->prev = NULL; | 536 | skb->prev = NULL; |
522 | len = qdisc_pkt_len(skb); | 537 | len = qdisc_pkt_len(skb); |
538 | sch->qstats.backlog -= len; | ||
523 | kfree_skb(skb); | 539 | kfree_skb(skb); |
524 | } | 540 | } |
525 | } | 541 | } |
@@ -609,6 +625,7 @@ static void netem_reset(struct Qdisc *sch) | |||
609 | struct netem_sched_data *q = qdisc_priv(sch); | 625 | struct netem_sched_data *q = qdisc_priv(sch); |
610 | 626 | ||
611 | qdisc_reset_queue(sch); | 627 | qdisc_reset_queue(sch); |
628 | tfifo_reset(sch); | ||
612 | if (q->qdisc) | 629 | if (q->qdisc) |
613 | qdisc_reset(q->qdisc); | 630 | qdisc_reset(q->qdisc); |
614 | qdisc_watchdog_cancel(&q->watchdog); | 631 | qdisc_watchdog_cancel(&q->watchdog); |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 0ac3a65daccb..319137340d15 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -536,7 +536,8 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
536 | * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. | 536 | * by CRC32-C as described in <draft-ietf-tsvwg-sctpcsum-02.txt>. |
537 | */ | 537 | */ |
538 | if (!sctp_checksum_disable) { | 538 | if (!sctp_checksum_disable) { |
539 | if (!(dst->dev->features & NETIF_F_SCTP_CSUM)) { | 539 | if (!(dst->dev->features & NETIF_F_SCTP_CSUM) || |
540 | (dst_xfrm(dst) != NULL) || packet->ipfragok) { | ||
540 | __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); | 541 | __u32 crc32 = sctp_start_cksum((__u8 *)sh, cksum_buf_len); |
541 | 542 | ||
542 | /* 3) Put the resultant value into the checksum field in the | 543 | /* 3) Put the resultant value into the checksum field in the |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 86de99ad2976..c1f403bed683 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1246,6 +1246,15 @@ static int unix_socketpair(struct socket *socka, struct socket *sockb) | |||
1246 | return 0; | 1246 | return 0; |
1247 | } | 1247 | } |
1248 | 1248 | ||
1249 | static void unix_sock_inherit_flags(const struct socket *old, | ||
1250 | struct socket *new) | ||
1251 | { | ||
1252 | if (test_bit(SOCK_PASSCRED, &old->flags)) | ||
1253 | set_bit(SOCK_PASSCRED, &new->flags); | ||
1254 | if (test_bit(SOCK_PASSSEC, &old->flags)) | ||
1255 | set_bit(SOCK_PASSSEC, &new->flags); | ||
1256 | } | ||
1257 | |||
1249 | static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | 1258 | static int unix_accept(struct socket *sock, struct socket *newsock, int flags) |
1250 | { | 1259 | { |
1251 | struct sock *sk = sock->sk; | 1260 | struct sock *sk = sock->sk; |
@@ -1280,6 +1289,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags) | |||
1280 | /* attach accepted sock to socket */ | 1289 | /* attach accepted sock to socket */ |
1281 | unix_state_lock(tsk); | 1290 | unix_state_lock(tsk); |
1282 | newsock->state = SS_CONNECTED; | 1291 | newsock->state = SS_CONNECTED; |
1292 | unix_sock_inherit_flags(sock, newsock); | ||
1283 | sock_graft(tsk, newsock); | 1293 | sock_graft(tsk, newsock); |
1284 | unix_state_unlock(tsk); | 1294 | unix_state_unlock(tsk); |
1285 | return 0; | 1295 | return 0; |
diff --git a/net/wireless/core.c b/net/wireless/core.c index fe8d4f2be49b..aff959e5a1b3 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c | |||
@@ -958,8 +958,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb, | |||
958 | case NETDEV_PRE_UP: | 958 | case NETDEV_PRE_UP: |
959 | if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) | 959 | if (!(wdev->wiphy->interface_modes & BIT(wdev->iftype))) |
960 | return notifier_from_errno(-EOPNOTSUPP); | 960 | return notifier_from_errno(-EOPNOTSUPP); |
961 | if (rfkill_blocked(rdev->rfkill)) | ||
962 | return notifier_from_errno(-ERFKILL); | ||
963 | ret = cfg80211_can_add_interface(rdev, wdev->iftype); | 961 | ret = cfg80211_can_add_interface(rdev, wdev->iftype); |
964 | if (ret) | 962 | if (ret) |
965 | return notifier_from_errno(ret); | 963 | return notifier_from_errno(ret); |
diff --git a/net/wireless/core.h b/net/wireless/core.h index 74beff1e926f..af10e59af2d8 100644 --- a/net/wireless/core.h +++ b/net/wireless/core.h | |||
@@ -402,6 +402,9 @@ static inline int | |||
402 | cfg80211_can_add_interface(struct cfg80211_registered_device *rdev, | 402 | cfg80211_can_add_interface(struct cfg80211_registered_device *rdev, |
403 | enum nl80211_iftype iftype) | 403 | enum nl80211_iftype iftype) |
404 | { | 404 | { |
405 | if (rfkill_blocked(rdev->rfkill)) | ||
406 | return -ERFKILL; | ||
407 | |||
405 | return cfg80211_can_change_interface(rdev, NULL, iftype); | 408 | return cfg80211_can_change_interface(rdev, NULL, iftype); |
406 | } | 409 | } |
407 | 410 | ||
diff --git a/net/wireless/radiotap.c b/net/wireless/radiotap.c index 7d604c06c3dc..a271c27fac77 100644 --- a/net/wireless/radiotap.c +++ b/net/wireless/radiotap.c | |||
@@ -97,6 +97,10 @@ int ieee80211_radiotap_iterator_init( | |||
97 | struct ieee80211_radiotap_header *radiotap_header, | 97 | struct ieee80211_radiotap_header *radiotap_header, |
98 | int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns) | 98 | int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns) |
99 | { | 99 | { |
100 | /* check the radiotap header can actually be present */ | ||
101 | if (max_length < sizeof(struct ieee80211_radiotap_header)) | ||
102 | return -EINVAL; | ||
103 | |||
100 | /* Linux only supports version 0 radiotap format */ | 104 | /* Linux only supports version 0 radiotap format */ |
101 | if (radiotap_header->it_version) | 105 | if (radiotap_header->it_version) |
102 | return -EINVAL; | 106 | return -EINVAL; |
@@ -131,7 +135,8 @@ int ieee80211_radiotap_iterator_init( | |||
131 | */ | 135 | */ |
132 | 136 | ||
133 | if ((unsigned long)iterator->_arg - | 137 | if ((unsigned long)iterator->_arg - |
134 | (unsigned long)iterator->_rtheader > | 138 | (unsigned long)iterator->_rtheader + |
139 | sizeof(uint32_t) > | ||
135 | (unsigned long)iterator->_max_length) | 140 | (unsigned long)iterator->_max_length) |
136 | return -EINVAL; | 141 | return -EINVAL; |
137 | } | 142 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index ed38d5d81f9e..76e1873811d4 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -334,7 +334,8 @@ static void xfrm_policy_kill(struct xfrm_policy *policy) | |||
334 | 334 | ||
335 | atomic_inc(&policy->genid); | 335 | atomic_inc(&policy->genid); |
336 | 336 | ||
337 | del_timer(&policy->polq.hold_timer); | 337 | if (del_timer(&policy->polq.hold_timer)) |
338 | xfrm_pol_put(policy); | ||
338 | xfrm_queue_purge(&policy->polq.hold_queue); | 339 | xfrm_queue_purge(&policy->polq.hold_queue); |
339 | 340 | ||
340 | if (del_timer(&policy->timer)) | 341 | if (del_timer(&policy->timer)) |
@@ -589,7 +590,8 @@ static void xfrm_policy_requeue(struct xfrm_policy *old, | |||
589 | 590 | ||
590 | spin_lock_bh(&pq->hold_queue.lock); | 591 | spin_lock_bh(&pq->hold_queue.lock); |
591 | skb_queue_splice_init(&pq->hold_queue, &list); | 592 | skb_queue_splice_init(&pq->hold_queue, &list); |
592 | del_timer(&pq->hold_timer); | 593 | if (del_timer(&pq->hold_timer)) |
594 | xfrm_pol_put(old); | ||
593 | spin_unlock_bh(&pq->hold_queue.lock); | 595 | spin_unlock_bh(&pq->hold_queue.lock); |
594 | 596 | ||
595 | if (skb_queue_empty(&list)) | 597 | if (skb_queue_empty(&list)) |
@@ -600,7 +602,8 @@ static void xfrm_policy_requeue(struct xfrm_policy *old, | |||
600 | spin_lock_bh(&pq->hold_queue.lock); | 602 | spin_lock_bh(&pq->hold_queue.lock); |
601 | skb_queue_splice(&list, &pq->hold_queue); | 603 | skb_queue_splice(&list, &pq->hold_queue); |
602 | pq->timeout = XFRM_QUEUE_TMO_MIN; | 604 | pq->timeout = XFRM_QUEUE_TMO_MIN; |
603 | mod_timer(&pq->hold_timer, jiffies); | 605 | if (!mod_timer(&pq->hold_timer, jiffies)) |
606 | xfrm_pol_hold(new); | ||
604 | spin_unlock_bh(&pq->hold_queue.lock); | 607 | spin_unlock_bh(&pq->hold_queue.lock); |
605 | } | 608 | } |
606 | 609 | ||
@@ -1769,6 +1772,10 @@ static void xfrm_policy_queue_process(unsigned long arg) | |||
1769 | 1772 | ||
1770 | spin_lock(&pq->hold_queue.lock); | 1773 | spin_lock(&pq->hold_queue.lock); |
1771 | skb = skb_peek(&pq->hold_queue); | 1774 | skb = skb_peek(&pq->hold_queue); |
1775 | if (!skb) { | ||
1776 | spin_unlock(&pq->hold_queue.lock); | ||
1777 | goto out; | ||
1778 | } | ||
1772 | dst = skb_dst(skb); | 1779 | dst = skb_dst(skb); |
1773 | sk = skb->sk; | 1780 | sk = skb->sk; |
1774 | xfrm_decode_session(skb, &fl, dst->ops->family); | 1781 | xfrm_decode_session(skb, &fl, dst->ops->family); |
@@ -1787,8 +1794,9 @@ static void xfrm_policy_queue_process(unsigned long arg) | |||
1787 | goto purge_queue; | 1794 | goto purge_queue; |
1788 | 1795 | ||
1789 | pq->timeout = pq->timeout << 1; | 1796 | pq->timeout = pq->timeout << 1; |
1790 | mod_timer(&pq->hold_timer, jiffies + pq->timeout); | 1797 | if (!mod_timer(&pq->hold_timer, jiffies + pq->timeout)) |
1791 | return; | 1798 | xfrm_pol_hold(pol); |
1799 | goto out; | ||
1792 | } | 1800 | } |
1793 | 1801 | ||
1794 | dst_release(dst); | 1802 | dst_release(dst); |
@@ -1819,11 +1827,14 @@ static void xfrm_policy_queue_process(unsigned long arg) | |||
1819 | err = dst_output(skb); | 1827 | err = dst_output(skb); |
1820 | } | 1828 | } |
1821 | 1829 | ||
1830 | out: | ||
1831 | xfrm_pol_put(pol); | ||
1822 | return; | 1832 | return; |
1823 | 1833 | ||
1824 | purge_queue: | 1834 | purge_queue: |
1825 | pq->timeout = 0; | 1835 | pq->timeout = 0; |
1826 | xfrm_queue_purge(&pq->hold_queue); | 1836 | xfrm_queue_purge(&pq->hold_queue); |
1837 | xfrm_pol_put(pol); | ||
1827 | } | 1838 | } |
1828 | 1839 | ||
1829 | static int xdst_queue_output(struct sk_buff *skb) | 1840 | static int xdst_queue_output(struct sk_buff *skb) |
@@ -1831,7 +1842,8 @@ static int xdst_queue_output(struct sk_buff *skb) | |||
1831 | unsigned long sched_next; | 1842 | unsigned long sched_next; |
1832 | struct dst_entry *dst = skb_dst(skb); | 1843 | struct dst_entry *dst = skb_dst(skb); |
1833 | struct xfrm_dst *xdst = (struct xfrm_dst *) dst; | 1844 | struct xfrm_dst *xdst = (struct xfrm_dst *) dst; |
1834 | struct xfrm_policy_queue *pq = &xdst->pols[0]->polq; | 1845 | struct xfrm_policy *pol = xdst->pols[0]; |
1846 | struct xfrm_policy_queue *pq = &pol->polq; | ||
1835 | 1847 | ||
1836 | if (pq->hold_queue.qlen > XFRM_MAX_QUEUE_LEN) { | 1848 | if (pq->hold_queue.qlen > XFRM_MAX_QUEUE_LEN) { |
1837 | kfree_skb(skb); | 1849 | kfree_skb(skb); |
@@ -1850,10 +1862,12 @@ static int xdst_queue_output(struct sk_buff *skb) | |||
1850 | if (del_timer(&pq->hold_timer)) { | 1862 | if (del_timer(&pq->hold_timer)) { |
1851 | if (time_before(pq->hold_timer.expires, sched_next)) | 1863 | if (time_before(pq->hold_timer.expires, sched_next)) |
1852 | sched_next = pq->hold_timer.expires; | 1864 | sched_next = pq->hold_timer.expires; |
1865 | xfrm_pol_put(pol); | ||
1853 | } | 1866 | } |
1854 | 1867 | ||
1855 | __skb_queue_tail(&pq->hold_queue, skb); | 1868 | __skb_queue_tail(&pq->hold_queue, skb); |
1856 | mod_timer(&pq->hold_timer, sched_next); | 1869 | if (!mod_timer(&pq->hold_timer, sched_next)) |
1870 | xfrm_pol_hold(pol); | ||
1857 | 1871 | ||
1858 | spin_unlock_bh(&pq->hold_queue.lock); | 1872 | spin_unlock_bh(&pq->hold_queue.lock); |
1859 | 1873 | ||
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 8dafe6d3c6e4..dab57daae408 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c | |||
@@ -61,9 +61,9 @@ static void xfrm_replay_notify(struct xfrm_state *x, int event) | |||
61 | 61 | ||
62 | switch (event) { | 62 | switch (event) { |
63 | case XFRM_REPLAY_UPDATE: | 63 | case XFRM_REPLAY_UPDATE: |
64 | if (x->replay_maxdiff && | 64 | if (!x->replay_maxdiff || |
65 | (x->replay.seq - x->preplay.seq < x->replay_maxdiff) && | 65 | ((x->replay.seq - x->preplay.seq < x->replay_maxdiff) && |
66 | (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff)) { | 66 | (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff))) { |
67 | if (x->xflags & XFRM_TIME_DEFER) | 67 | if (x->xflags & XFRM_TIME_DEFER) |
68 | event = XFRM_REPLAY_TIMEOUT; | 68 | event = XFRM_REPLAY_TIMEOUT; |
69 | else | 69 | else |
@@ -129,8 +129,7 @@ static int xfrm_replay_check(struct xfrm_state *x, | |||
129 | return 0; | 129 | return 0; |
130 | 130 | ||
131 | diff = x->replay.seq - seq; | 131 | diff = x->replay.seq - seq; |
132 | if (diff >= min_t(unsigned int, x->props.replay_window, | 132 | if (diff >= x->props.replay_window) { |
133 | sizeof(x->replay.bitmap) * 8)) { | ||
134 | x->stats.replay_window++; | 133 | x->stats.replay_window++; |
135 | goto err; | 134 | goto err; |
136 | } | 135 | } |
@@ -302,9 +301,10 @@ static void xfrm_replay_notify_bmp(struct xfrm_state *x, int event) | |||
302 | 301 | ||
303 | switch (event) { | 302 | switch (event) { |
304 | case XFRM_REPLAY_UPDATE: | 303 | case XFRM_REPLAY_UPDATE: |
305 | if (x->replay_maxdiff && | 304 | if (!x->replay_maxdiff || |
306 | (replay_esn->seq - preplay_esn->seq < x->replay_maxdiff) && | 305 | ((replay_esn->seq - preplay_esn->seq < x->replay_maxdiff) && |
307 | (replay_esn->oseq - preplay_esn->oseq < x->replay_maxdiff)) { | 306 | (replay_esn->oseq - preplay_esn->oseq |
307 | < x->replay_maxdiff))) { | ||
308 | if (x->xflags & XFRM_TIME_DEFER) | 308 | if (x->xflags & XFRM_TIME_DEFER) |
309 | event = XFRM_REPLAY_TIMEOUT; | 309 | event = XFRM_REPLAY_TIMEOUT; |
310 | else | 310 | else |
@@ -353,28 +353,30 @@ static void xfrm_replay_notify_esn(struct xfrm_state *x, int event) | |||
353 | 353 | ||
354 | switch (event) { | 354 | switch (event) { |
355 | case XFRM_REPLAY_UPDATE: | 355 | case XFRM_REPLAY_UPDATE: |
356 | if (!x->replay_maxdiff) | 356 | if (x->replay_maxdiff) { |
357 | break; | 357 | if (replay_esn->seq_hi == preplay_esn->seq_hi) |
358 | 358 | seq_diff = replay_esn->seq - preplay_esn->seq; | |
359 | if (replay_esn->seq_hi == preplay_esn->seq_hi) | 359 | else |
360 | seq_diff = replay_esn->seq - preplay_esn->seq; | 360 | seq_diff = ~preplay_esn->seq + replay_esn->seq |
361 | else | 361 | + 1; |
362 | seq_diff = ~preplay_esn->seq + replay_esn->seq + 1; | ||
363 | |||
364 | if (replay_esn->oseq_hi == preplay_esn->oseq_hi) | ||
365 | oseq_diff = replay_esn->oseq - preplay_esn->oseq; | ||
366 | else | ||
367 | oseq_diff = ~preplay_esn->oseq + replay_esn->oseq + 1; | ||
368 | |||
369 | if (seq_diff < x->replay_maxdiff && | ||
370 | oseq_diff < x->replay_maxdiff) { | ||
371 | 362 | ||
372 | if (x->xflags & XFRM_TIME_DEFER) | 363 | if (replay_esn->oseq_hi == preplay_esn->oseq_hi) |
373 | event = XFRM_REPLAY_TIMEOUT; | 364 | oseq_diff = replay_esn->oseq |
365 | - preplay_esn->oseq; | ||
374 | else | 366 | else |
375 | return; | 367 | oseq_diff = ~preplay_esn->oseq |
368 | + replay_esn->oseq + 1; | ||
369 | |||
370 | if (seq_diff >= x->replay_maxdiff || | ||
371 | oseq_diff >= x->replay_maxdiff) | ||
372 | break; | ||
376 | } | 373 | } |
377 | 374 | ||
375 | if (x->xflags & XFRM_TIME_DEFER) | ||
376 | event = XFRM_REPLAY_TIMEOUT; | ||
377 | else | ||
378 | return; | ||
379 | |||
378 | break; | 380 | break; |
379 | 381 | ||
380 | case XFRM_REPLAY_TIMEOUT: | 382 | case XFRM_REPLAY_TIMEOUT: |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 3f565e495ac6..f964d4c00ffb 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
@@ -446,7 +446,8 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info * | |||
446 | memcpy(&x->sel, &p->sel, sizeof(x->sel)); | 446 | memcpy(&x->sel, &p->sel, sizeof(x->sel)); |
447 | memcpy(&x->lft, &p->lft, sizeof(x->lft)); | 447 | memcpy(&x->lft, &p->lft, sizeof(x->lft)); |
448 | x->props.mode = p->mode; | 448 | x->props.mode = p->mode; |
449 | x->props.replay_window = p->replay_window; | 449 | x->props.replay_window = min_t(unsigned int, p->replay_window, |
450 | sizeof(x->replay.bitmap) * 8); | ||
450 | x->props.reqid = p->reqid; | 451 | x->props.reqid = p->reqid; |
451 | x->props.family = p->family; | 452 | x->props.family = p->family; |
452 | memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); | 453 | memcpy(&x->props.saddr, &p->saddr, sizeof(x->props.saddr)); |
@@ -1856,7 +1857,7 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
1856 | if (x->km.state != XFRM_STATE_VALID) | 1857 | if (x->km.state != XFRM_STATE_VALID) |
1857 | goto out; | 1858 | goto out; |
1858 | 1859 | ||
1859 | err = xfrm_replay_verify_len(x->replay_esn, rp); | 1860 | err = xfrm_replay_verify_len(x->replay_esn, re); |
1860 | if (err) | 1861 | if (err) |
1861 | goto out; | 1862 | goto out; |
1862 | 1863 | ||