diff options
author | David S. Miller <davem@davemloft.net> | 2017-12-22 11:16:31 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-22 11:16:31 -0500 |
commit | fba961ab29e5ffb055592442808bb0f7962e05da (patch) | |
tree | 5180c384b79399c469e0ed88211114e6ab249484 /net | |
parent | 0a80f0c26bf5a131892b91db5318eb67608006d2 (diff) | |
parent | ead68f216110170ec729e2c4dec0aad6d38259d7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Lots of overlapping changes. Also on the net-next side
the XDP state management is handled more in the generic
layers so undo the 'net' nfp fix which isn't applicable
in net-next.
Include a necessary change by Jakub Kicinski, with log message:
====================
cls_bpf no longer takes care of offload tracking. Make sure
netdevsim performs necessary checks. This fixes a warning
caused by TC trying to remove a filter it has not added.
Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Quentin Monnet <quentin.monnet@netronome.com>
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_netlink.c | 11 | ||||
-rw-r--r-- | net/core/dev.c | 2 | ||||
-rw-r--r-- | net/core/net_namespace.c | 2 | ||||
-rw-r--r-- | net/core/skbuff.c | 7 | ||||
-rw-r--r-- | net/ipv4/fib_frontend.c | 9 | ||||
-rw-r--r-- | net/ipv4/fib_semantics.c | 8 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 1 | ||||
-rw-r--r-- | net/ipv6/af_inet6.c | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_gre.c | 1 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 12 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 9 | ||||
-rw-r--r-- | net/ipv6/ipv6_sockglue.c | 1 | ||||
-rw-r--r-- | net/ipv6/route.c | 19 | ||||
-rw-r--r-- | net/openvswitch/flow.c | 15 | ||||
-rw-r--r-- | net/sched/cls_bpf.c | 93 | ||||
-rw-r--r-- | net/sctp/debug.c | 3 | ||||
-rw-r--r-- | net/sctp/ulpqueue.c | 24 | ||||
-rw-r--r-- | net/tipc/group.c | 16 | ||||
-rw-r--r-- | net/wireless/Makefile | 31 | ||||
-rw-r--r-- | net/wireless/certs/sforshee.hex | 86 | ||||
-rw-r--r-- | net/wireless/certs/sforshee.x509 | bin | 680 -> 0 bytes | |||
-rw-r--r-- | net/wireless/nl80211.c | 6 |
22 files changed, 225 insertions, 132 deletions
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index d0ef0a8e8831..015f465c514b 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c | |||
@@ -1262,19 +1262,20 @@ static int br_dev_newlink(struct net *src_net, struct net_device *dev, | |||
1262 | struct net_bridge *br = netdev_priv(dev); | 1262 | struct net_bridge *br = netdev_priv(dev); |
1263 | int err; | 1263 | int err; |
1264 | 1264 | ||
1265 | err = register_netdevice(dev); | ||
1266 | if (err) | ||
1267 | return err; | ||
1268 | |||
1265 | if (tb[IFLA_ADDRESS]) { | 1269 | if (tb[IFLA_ADDRESS]) { |
1266 | spin_lock_bh(&br->lock); | 1270 | spin_lock_bh(&br->lock); |
1267 | br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); | 1271 | br_stp_change_bridge_id(br, nla_data(tb[IFLA_ADDRESS])); |
1268 | spin_unlock_bh(&br->lock); | 1272 | spin_unlock_bh(&br->lock); |
1269 | } | 1273 | } |
1270 | 1274 | ||
1271 | err = register_netdevice(dev); | ||
1272 | if (err) | ||
1273 | return err; | ||
1274 | |||
1275 | err = br_changelink(dev, tb, data, extack); | 1275 | err = br_changelink(dev, tb, data, extack); |
1276 | if (err) | 1276 | if (err) |
1277 | unregister_netdevice(dev); | 1277 | br_dev_delete(dev, NULL); |
1278 | |||
1278 | return err; | 1279 | return err; |
1279 | } | 1280 | } |
1280 | 1281 | ||
diff --git a/net/core/dev.c b/net/core/dev.c index c7db39926769..59ead3910ab7 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -3937,7 +3937,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, | |||
3937 | hroom > 0 ? ALIGN(hroom, NET_SKB_PAD) : 0, | 3937 | hroom > 0 ? ALIGN(hroom, NET_SKB_PAD) : 0, |
3938 | troom > 0 ? troom + 128 : 0, GFP_ATOMIC)) | 3938 | troom > 0 ? troom + 128 : 0, GFP_ATOMIC)) |
3939 | goto do_drop; | 3939 | goto do_drop; |
3940 | if (troom > 0 && __skb_linearize(skb)) | 3940 | if (skb_linearize(skb)) |
3941 | goto do_drop; | 3941 | goto do_drop; |
3942 | } | 3942 | } |
3943 | 3943 | ||
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c index b797832565d3..60a71be75aea 100644 --- a/net/core/net_namespace.c +++ b/net/core/net_namespace.c | |||
@@ -267,7 +267,7 @@ struct net *get_net_ns_by_id(struct net *net, int id) | |||
267 | spin_lock_bh(&net->nsid_lock); | 267 | spin_lock_bh(&net->nsid_lock); |
268 | peer = idr_find(&net->netns_ids, id); | 268 | peer = idr_find(&net->netns_ids, id); |
269 | if (peer) | 269 | if (peer) |
270 | get_net(peer); | 270 | peer = maybe_get_net(peer); |
271 | spin_unlock_bh(&net->nsid_lock); | 271 | spin_unlock_bh(&net->nsid_lock); |
272 | rcu_read_unlock(); | 272 | rcu_read_unlock(); |
273 | 273 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index a592ca025fc4..a3cb0be4c6f3 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -1178,7 +1178,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask) | |||
1178 | u32 d_off; | 1178 | u32 d_off; |
1179 | 1179 | ||
1180 | if (!num_frags) | 1180 | if (!num_frags) |
1181 | return 0; | 1181 | goto release; |
1182 | 1182 | ||
1183 | if (skb_shared(skb) || skb_unclone(skb, gfp_mask)) | 1183 | if (skb_shared(skb) || skb_unclone(skb, gfp_mask)) |
1184 | return -EINVAL; | 1184 | return -EINVAL; |
@@ -1238,6 +1238,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask) | |||
1238 | __skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off); | 1238 | __skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off); |
1239 | skb_shinfo(skb)->nr_frags = new_frags; | 1239 | skb_shinfo(skb)->nr_frags = new_frags; |
1240 | 1240 | ||
1241 | release: | ||
1241 | skb_zcopy_clear(skb, false); | 1242 | skb_zcopy_clear(skb, false); |
1242 | return 0; | 1243 | return 0; |
1243 | } | 1244 | } |
@@ -3654,8 +3655,6 @@ normal: | |||
3654 | 3655 | ||
3655 | skb_shinfo(nskb)->tx_flags |= skb_shinfo(head_skb)->tx_flags & | 3656 | skb_shinfo(nskb)->tx_flags |= skb_shinfo(head_skb)->tx_flags & |
3656 | SKBTX_SHARED_FRAG; | 3657 | SKBTX_SHARED_FRAG; |
3657 | if (skb_zerocopy_clone(nskb, head_skb, GFP_ATOMIC)) | ||
3658 | goto err; | ||
3659 | 3658 | ||
3660 | while (pos < offset + len) { | 3659 | while (pos < offset + len) { |
3661 | if (i >= nfrags) { | 3660 | if (i >= nfrags) { |
@@ -3681,6 +3680,8 @@ normal: | |||
3681 | 3680 | ||
3682 | if (unlikely(skb_orphan_frags(frag_skb, GFP_ATOMIC))) | 3681 | if (unlikely(skb_orphan_frags(frag_skb, GFP_ATOMIC))) |
3683 | goto err; | 3682 | goto err; |
3683 | if (skb_zerocopy_clone(nskb, frag_skb, GFP_ATOMIC)) | ||
3684 | goto err; | ||
3684 | 3685 | ||
3685 | *nskb_frag = *frag; | 3686 | *nskb_frag = *frag; |
3686 | __skb_frag_ref(nskb_frag); | 3687 | __skb_frag_ref(nskb_frag); |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index f52d27a422c3..08259d078b1c 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
@@ -1298,14 +1298,19 @@ err_table_hash_alloc: | |||
1298 | 1298 | ||
1299 | static void ip_fib_net_exit(struct net *net) | 1299 | static void ip_fib_net_exit(struct net *net) |
1300 | { | 1300 | { |
1301 | unsigned int i; | 1301 | int i; |
1302 | 1302 | ||
1303 | rtnl_lock(); | 1303 | rtnl_lock(); |
1304 | #ifdef CONFIG_IP_MULTIPLE_TABLES | 1304 | #ifdef CONFIG_IP_MULTIPLE_TABLES |
1305 | RCU_INIT_POINTER(net->ipv4.fib_main, NULL); | 1305 | RCU_INIT_POINTER(net->ipv4.fib_main, NULL); |
1306 | RCU_INIT_POINTER(net->ipv4.fib_default, NULL); | 1306 | RCU_INIT_POINTER(net->ipv4.fib_default, NULL); |
1307 | #endif | 1307 | #endif |
1308 | for (i = 0; i < FIB_TABLE_HASHSZ; i++) { | 1308 | /* Destroy the tables in reverse order to guarantee that the |
1309 | * local table, ID 255, is destroyed before the main table, ID | ||
1310 | * 254. This is necessary as the local table may contain | ||
1311 | * references to data contained in the main table. | ||
1312 | */ | ||
1313 | for (i = FIB_TABLE_HASHSZ - 1; i >= 0; i--) { | ||
1309 | struct hlist_head *head = &net->ipv4.fib_table_hash[i]; | 1314 | struct hlist_head *head = &net->ipv4.fib_table_hash[i]; |
1310 | struct hlist_node *tmp; | 1315 | struct hlist_node *tmp; |
1311 | struct fib_table *tb; | 1316 | struct fib_table *tb; |
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index f04d944f8abe..c586597da20d 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c | |||
@@ -698,7 +698,7 @@ bool fib_metrics_match(struct fib_config *cfg, struct fib_info *fi) | |||
698 | 698 | ||
699 | nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) { | 699 | nla_for_each_attr(nla, cfg->fc_mx, cfg->fc_mx_len, remaining) { |
700 | int type = nla_type(nla); | 700 | int type = nla_type(nla); |
701 | u32 val; | 701 | u32 fi_val, val; |
702 | 702 | ||
703 | if (!type) | 703 | if (!type) |
704 | continue; | 704 | continue; |
@@ -715,7 +715,11 @@ bool fib_metrics_match(struct fib_config *cfg, struct fib_info *fi) | |||
715 | val = nla_get_u32(nla); | 715 | val = nla_get_u32(nla); |
716 | } | 716 | } |
717 | 717 | ||
718 | if (fi->fib_metrics->metrics[type - 1] != val) | 718 | fi_val = fi->fib_metrics->metrics[type - 1]; |
719 | if (type == RTAX_FEATURES) | ||
720 | fi_val &= ~DST_FEATURE_ECN_CA; | ||
721 | |||
722 | if (fi_val != val) | ||
719 | return false; | 723 | return false; |
720 | } | 724 | } |
721 | 725 | ||
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index 90c912307814..78365094f56c 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -1336,6 +1336,7 @@ static const struct net_device_ops erspan_netdev_ops = { | |||
1336 | static void ipgre_tap_setup(struct net_device *dev) | 1336 | static void ipgre_tap_setup(struct net_device *dev) |
1337 | { | 1337 | { |
1338 | ether_setup(dev); | 1338 | ether_setup(dev); |
1339 | dev->max_mtu = 0; | ||
1339 | dev->netdev_ops = &gre_tap_netdev_ops; | 1340 | dev->netdev_ops = &gre_tap_netdev_ops; |
1340 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; | 1341 | dev->priv_flags &= ~IFF_TX_SKB_SHARING; |
1341 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | 1342 | dev->priv_flags |= IFF_LIVE_ADDR_CHANGE; |
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index c26f71234b9c..c9441ca45399 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -210,7 +210,6 @@ lookup_protocol: | |||
210 | np->mcast_hops = IPV6_DEFAULT_MCASTHOPS; | 210 | np->mcast_hops = IPV6_DEFAULT_MCASTHOPS; |
211 | np->mc_loop = 1; | 211 | np->mc_loop = 1; |
212 | np->pmtudisc = IPV6_PMTUDISC_WANT; | 212 | np->pmtudisc = IPV6_PMTUDISC_WANT; |
213 | np->autoflowlabel = ip6_default_np_autolabel(net); | ||
214 | np->repflow = net->ipv6.sysctl.flowlabel_reflect; | 213 | np->repflow = net->ipv6.sysctl.flowlabel_reflect; |
215 | sk->sk_ipv6only = net->ipv6.sysctl.bindv6only; | 214 | sk->sk_ipv6only = net->ipv6.sysctl.bindv6only; |
216 | 215 | ||
diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 8451d00b210b..97f148f15429 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c | |||
@@ -1772,6 +1772,7 @@ static void ip6gre_tap_setup(struct net_device *dev) | |||
1772 | 1772 | ||
1773 | ether_setup(dev); | 1773 | ether_setup(dev); |
1774 | 1774 | ||
1775 | dev->max_mtu = 0; | ||
1775 | dev->netdev_ops = &ip6gre_tap_netdev_ops; | 1776 | dev->netdev_ops = &ip6gre_tap_netdev_ops; |
1776 | dev->needs_free_netdev = true; | 1777 | dev->needs_free_netdev = true; |
1777 | dev->priv_destructor = ip6gre_dev_free; | 1778 | dev->priv_destructor = ip6gre_dev_free; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 176d74fb3b4d..ece2781a31b2 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -166,6 +166,14 @@ int ip6_output(struct net *net, struct sock *sk, struct sk_buff *skb) | |||
166 | !(IP6CB(skb)->flags & IP6SKB_REROUTED)); | 166 | !(IP6CB(skb)->flags & IP6SKB_REROUTED)); |
167 | } | 167 | } |
168 | 168 | ||
169 | static bool ip6_autoflowlabel(struct net *net, const struct ipv6_pinfo *np) | ||
170 | { | ||
171 | if (!np->autoflowlabel_set) | ||
172 | return ip6_default_np_autolabel(net); | ||
173 | else | ||
174 | return np->autoflowlabel; | ||
175 | } | ||
176 | |||
169 | /* | 177 | /* |
170 | * xmit an sk_buff (used by TCP, SCTP and DCCP) | 178 | * xmit an sk_buff (used by TCP, SCTP and DCCP) |
171 | * Note : socket lock is not held for SYNACK packets, but might be modified | 179 | * Note : socket lock is not held for SYNACK packets, but might be modified |
@@ -230,7 +238,7 @@ int ip6_xmit(const struct sock *sk, struct sk_buff *skb, struct flowi6 *fl6, | |||
230 | hlimit = ip6_dst_hoplimit(dst); | 238 | hlimit = ip6_dst_hoplimit(dst); |
231 | 239 | ||
232 | ip6_flow_hdr(hdr, tclass, ip6_make_flowlabel(net, skb, fl6->flowlabel, | 240 | ip6_flow_hdr(hdr, tclass, ip6_make_flowlabel(net, skb, fl6->flowlabel, |
233 | np->autoflowlabel, fl6)); | 241 | ip6_autoflowlabel(net, np), fl6)); |
234 | 242 | ||
235 | hdr->payload_len = htons(seg_len); | 243 | hdr->payload_len = htons(seg_len); |
236 | hdr->nexthdr = proto; | 244 | hdr->nexthdr = proto; |
@@ -1626,7 +1634,7 @@ struct sk_buff *__ip6_make_skb(struct sock *sk, | |||
1626 | 1634 | ||
1627 | ip6_flow_hdr(hdr, v6_cork->tclass, | 1635 | ip6_flow_hdr(hdr, v6_cork->tclass, |
1628 | ip6_make_flowlabel(net, skb, fl6->flowlabel, | 1636 | ip6_make_flowlabel(net, skb, fl6->flowlabel, |
1629 | np->autoflowlabel, fl6)); | 1637 | ip6_autoflowlabel(net, np), fl6)); |
1630 | hdr->hop_limit = v6_cork->hop_limit; | 1638 | hdr->hop_limit = v6_cork->hop_limit; |
1631 | hdr->nexthdr = proto; | 1639 | hdr->nexthdr = proto; |
1632 | hdr->saddr = fl6->saddr; | 1640 | hdr->saddr = fl6->saddr; |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 6ff2f21ae3fc..8a4610e84e58 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -1126,8 +1126,13 @@ route_lookup: | |||
1126 | max_headroom += 8; | 1126 | max_headroom += 8; |
1127 | mtu -= 8; | 1127 | mtu -= 8; |
1128 | } | 1128 | } |
1129 | if (mtu < IPV6_MIN_MTU) | 1129 | if (skb->protocol == htons(ETH_P_IPV6)) { |
1130 | mtu = IPV6_MIN_MTU; | 1130 | if (mtu < IPV6_MIN_MTU) |
1131 | mtu = IPV6_MIN_MTU; | ||
1132 | } else if (mtu < 576) { | ||
1133 | mtu = 576; | ||
1134 | } | ||
1135 | |||
1131 | if (skb_dst(skb) && !t->parms.collect_md) | 1136 | if (skb_dst(skb) && !t->parms.collect_md) |
1132 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu); | 1137 | skb_dst(skb)->ops->update_pmtu(skb_dst(skb), NULL, skb, mtu); |
1133 | if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) { | 1138 | if (skb->len - t->tun_hlen - eth_hlen > mtu && !skb_is_gso(skb)) { |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index b9404feabd78..2d4680e0376f 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -886,6 +886,7 @@ pref_skip_coa: | |||
886 | break; | 886 | break; |
887 | case IPV6_AUTOFLOWLABEL: | 887 | case IPV6_AUTOFLOWLABEL: |
888 | np->autoflowlabel = valbool; | 888 | np->autoflowlabel = valbool; |
889 | np->autoflowlabel_set = 1; | ||
889 | retv = 0; | 890 | retv = 0; |
890 | break; | 891 | break; |
891 | case IPV6_RECVFRAGSIZE: | 892 | case IPV6_RECVFRAGSIZE: |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index b3f4d19b3ca5..2490280b3394 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -2336,6 +2336,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev, | |||
2336 | } | 2336 | } |
2337 | 2337 | ||
2338 | rt->dst.flags |= DST_HOST; | 2338 | rt->dst.flags |= DST_HOST; |
2339 | rt->dst.input = ip6_input; | ||
2339 | rt->dst.output = ip6_output; | 2340 | rt->dst.output = ip6_output; |
2340 | rt->rt6i_gateway = fl6->daddr; | 2341 | rt->rt6i_gateway = fl6->daddr; |
2341 | rt->rt6i_dst.addr = fl6->daddr; | 2342 | rt->rt6i_dst.addr = fl6->daddr; |
@@ -4297,19 +4298,13 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, | |||
4297 | if (!ipv6_addr_any(&fl6.saddr)) | 4298 | if (!ipv6_addr_any(&fl6.saddr)) |
4298 | flags |= RT6_LOOKUP_F_HAS_SADDR; | 4299 | flags |= RT6_LOOKUP_F_HAS_SADDR; |
4299 | 4300 | ||
4300 | if (!fibmatch) | 4301 | dst = ip6_route_input_lookup(net, dev, &fl6, flags); |
4301 | dst = ip6_route_input_lookup(net, dev, &fl6, flags); | ||
4302 | else | ||
4303 | dst = ip6_route_lookup(net, &fl6, 0); | ||
4304 | 4302 | ||
4305 | rcu_read_unlock(); | 4303 | rcu_read_unlock(); |
4306 | } else { | 4304 | } else { |
4307 | fl6.flowi6_oif = oif; | 4305 | fl6.flowi6_oif = oif; |
4308 | 4306 | ||
4309 | if (!fibmatch) | 4307 | dst = ip6_route_output(net, NULL, &fl6); |
4310 | dst = ip6_route_output(net, NULL, &fl6); | ||
4311 | else | ||
4312 | dst = ip6_route_lookup(net, &fl6, 0); | ||
4313 | } | 4308 | } |
4314 | 4309 | ||
4315 | 4310 | ||
@@ -4326,6 +4321,14 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, | |||
4326 | goto errout; | 4321 | goto errout; |
4327 | } | 4322 | } |
4328 | 4323 | ||
4324 | if (fibmatch && rt->from) { | ||
4325 | struct rt6_info *ort = rt->from; | ||
4326 | |||
4327 | dst_hold(&ort->dst); | ||
4328 | ip6_rt_put(rt); | ||
4329 | rt = ort; | ||
4330 | } | ||
4331 | |||
4329 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); | 4332 | skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL); |
4330 | if (!skb) { | 4333 | if (!skb) { |
4331 | ip6_rt_put(rt); | 4334 | ip6_rt_put(rt); |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index 76d050aba7a4..56b8e7167790 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -579,6 +579,7 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
579 | return -EINVAL; | 579 | return -EINVAL; |
580 | 580 | ||
581 | skb_reset_network_header(skb); | 581 | skb_reset_network_header(skb); |
582 | key->eth.type = skb->protocol; | ||
582 | } else { | 583 | } else { |
583 | eth = eth_hdr(skb); | 584 | eth = eth_hdr(skb); |
584 | ether_addr_copy(key->eth.src, eth->h_source); | 585 | ether_addr_copy(key->eth.src, eth->h_source); |
@@ -592,15 +593,23 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
592 | if (unlikely(parse_vlan(skb, key))) | 593 | if (unlikely(parse_vlan(skb, key))) |
593 | return -ENOMEM; | 594 | return -ENOMEM; |
594 | 595 | ||
595 | skb->protocol = parse_ethertype(skb); | 596 | key->eth.type = parse_ethertype(skb); |
596 | if (unlikely(skb->protocol == htons(0))) | 597 | if (unlikely(key->eth.type == htons(0))) |
597 | return -ENOMEM; | 598 | return -ENOMEM; |
598 | 599 | ||
600 | /* Multiple tagged packets need to retain TPID to satisfy | ||
601 | * skb_vlan_pop(), which will later shift the ethertype into | ||
602 | * skb->protocol. | ||
603 | */ | ||
604 | if (key->eth.cvlan.tci & htons(VLAN_TAG_PRESENT)) | ||
605 | skb->protocol = key->eth.cvlan.tpid; | ||
606 | else | ||
607 | skb->protocol = key->eth.type; | ||
608 | |||
599 | skb_reset_network_header(skb); | 609 | skb_reset_network_header(skb); |
600 | __skb_push(skb, skb->data - skb_mac_header(skb)); | 610 | __skb_push(skb, skb->data - skb_mac_header(skb)); |
601 | } | 611 | } |
602 | skb_reset_mac_len(skb); | 612 | skb_reset_mac_len(skb); |
603 | key->eth.type = skb->protocol; | ||
604 | 613 | ||
605 | /* Network layer. */ | 614 | /* Network layer. */ |
606 | if (key->eth.type == htons(ETH_P_IP)) { | 615 | if (key->eth.type == htons(ETH_P_IP)) { |
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c index 6fe798c2df1a..8d78e7f4ecc3 100644 --- a/net/sched/cls_bpf.c +++ b/net/sched/cls_bpf.c | |||
@@ -42,7 +42,6 @@ struct cls_bpf_prog { | |||
42 | struct list_head link; | 42 | struct list_head link; |
43 | struct tcf_result res; | 43 | struct tcf_result res; |
44 | bool exts_integrated; | 44 | bool exts_integrated; |
45 | bool offloaded; | ||
46 | u32 gen_flags; | 45 | u32 gen_flags; |
47 | struct tcf_exts exts; | 46 | struct tcf_exts exts; |
48 | u32 handle; | 47 | u32 handle; |
@@ -148,33 +147,37 @@ static bool cls_bpf_is_ebpf(const struct cls_bpf_prog *prog) | |||
148 | } | 147 | } |
149 | 148 | ||
150 | static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog, | 149 | static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog, |
151 | enum tc_clsbpf_command cmd) | 150 | struct cls_bpf_prog *oldprog) |
152 | { | 151 | { |
153 | bool addorrep = cmd == TC_CLSBPF_ADD || cmd == TC_CLSBPF_REPLACE; | ||
154 | struct tcf_block *block = tp->chain->block; | 152 | struct tcf_block *block = tp->chain->block; |
155 | bool skip_sw = tc_skip_sw(prog->gen_flags); | ||
156 | struct tc_cls_bpf_offload cls_bpf = {}; | 153 | struct tc_cls_bpf_offload cls_bpf = {}; |
154 | struct cls_bpf_prog *obj; | ||
155 | bool skip_sw; | ||
157 | int err; | 156 | int err; |
158 | 157 | ||
158 | skip_sw = prog && tc_skip_sw(prog->gen_flags); | ||
159 | obj = prog ?: oldprog; | ||
160 | |||
159 | tc_cls_common_offload_init(&cls_bpf.common, tp); | 161 | tc_cls_common_offload_init(&cls_bpf.common, tp); |
160 | cls_bpf.command = cmd; | 162 | cls_bpf.command = TC_CLSBPF_OFFLOAD; |
161 | cls_bpf.exts = &prog->exts; | 163 | cls_bpf.exts = &obj->exts; |
162 | cls_bpf.prog = prog->filter; | 164 | cls_bpf.prog = prog ? prog->filter : NULL; |
163 | cls_bpf.name = prog->bpf_name; | 165 | cls_bpf.oldprog = oldprog ? oldprog->filter : NULL; |
164 | cls_bpf.exts_integrated = prog->exts_integrated; | 166 | cls_bpf.name = obj->bpf_name; |
165 | cls_bpf.gen_flags = prog->gen_flags; | 167 | cls_bpf.exts_integrated = obj->exts_integrated; |
168 | cls_bpf.gen_flags = obj->gen_flags; | ||
166 | 169 | ||
167 | err = tc_setup_cb_call(block, NULL, TC_SETUP_CLSBPF, &cls_bpf, skip_sw); | 170 | err = tc_setup_cb_call(block, NULL, TC_SETUP_CLSBPF, &cls_bpf, skip_sw); |
168 | if (addorrep) { | 171 | if (prog) { |
169 | if (err < 0) { | 172 | if (err < 0) { |
170 | cls_bpf_offload_cmd(tp, prog, TC_CLSBPF_DESTROY); | 173 | cls_bpf_offload_cmd(tp, oldprog, prog); |
171 | return err; | 174 | return err; |
172 | } else if (err > 0) { | 175 | } else if (err > 0) { |
173 | prog->gen_flags |= TCA_CLS_FLAGS_IN_HW; | 176 | prog->gen_flags |= TCA_CLS_FLAGS_IN_HW; |
174 | } | 177 | } |
175 | } | 178 | } |
176 | 179 | ||
177 | if (addorrep && skip_sw && !(prog->gen_flags & TCA_CLS_FLAGS_IN_HW)) | 180 | if (prog && skip_sw && !(prog->gen_flags & TCA_CLS_FLAGS_IN_HW)) |
178 | return -EINVAL; | 181 | return -EINVAL; |
179 | 182 | ||
180 | return 0; | 183 | return 0; |
@@ -183,38 +186,17 @@ static int cls_bpf_offload_cmd(struct tcf_proto *tp, struct cls_bpf_prog *prog, | |||
183 | static int cls_bpf_offload(struct tcf_proto *tp, struct cls_bpf_prog *prog, | 186 | static int cls_bpf_offload(struct tcf_proto *tp, struct cls_bpf_prog *prog, |
184 | struct cls_bpf_prog *oldprog) | 187 | struct cls_bpf_prog *oldprog) |
185 | { | 188 | { |
186 | struct cls_bpf_prog *obj = prog; | 189 | if (prog && oldprog && prog->gen_flags != oldprog->gen_flags) |
187 | enum tc_clsbpf_command cmd; | 190 | return -EINVAL; |
188 | bool skip_sw; | ||
189 | int ret; | ||
190 | |||
191 | skip_sw = tc_skip_sw(prog->gen_flags) || | ||
192 | (oldprog && tc_skip_sw(oldprog->gen_flags)); | ||
193 | |||
194 | if (oldprog && oldprog->offloaded) { | ||
195 | if (!tc_skip_hw(prog->gen_flags)) { | ||
196 | cmd = TC_CLSBPF_REPLACE; | ||
197 | } else if (!tc_skip_sw(prog->gen_flags)) { | ||
198 | obj = oldprog; | ||
199 | cmd = TC_CLSBPF_DESTROY; | ||
200 | } else { | ||
201 | return -EINVAL; | ||
202 | } | ||
203 | } else { | ||
204 | if (tc_skip_hw(prog->gen_flags)) | ||
205 | return skip_sw ? -EINVAL : 0; | ||
206 | cmd = TC_CLSBPF_ADD; | ||
207 | } | ||
208 | |||
209 | ret = cls_bpf_offload_cmd(tp, obj, cmd); | ||
210 | if (ret) | ||
211 | return ret; | ||
212 | 191 | ||
213 | obj->offloaded = true; | 192 | if (prog && tc_skip_hw(prog->gen_flags)) |
214 | if (oldprog) | 193 | prog = NULL; |
215 | oldprog->offloaded = false; | 194 | if (oldprog && tc_skip_hw(oldprog->gen_flags)) |
195 | oldprog = NULL; | ||
196 | if (!prog && !oldprog) | ||
197 | return 0; | ||
216 | 198 | ||
217 | return 0; | 199 | return cls_bpf_offload_cmd(tp, prog, oldprog); |
218 | } | 200 | } |
219 | 201 | ||
220 | static void cls_bpf_stop_offload(struct tcf_proto *tp, | 202 | static void cls_bpf_stop_offload(struct tcf_proto *tp, |
@@ -222,25 +204,26 @@ static void cls_bpf_stop_offload(struct tcf_proto *tp, | |||
222 | { | 204 | { |
223 | int err; | 205 | int err; |
224 | 206 | ||
225 | if (!prog->offloaded) | 207 | err = cls_bpf_offload_cmd(tp, NULL, prog); |
226 | return; | 208 | if (err) |
227 | |||
228 | err = cls_bpf_offload_cmd(tp, prog, TC_CLSBPF_DESTROY); | ||
229 | if (err) { | ||
230 | pr_err("Stopping hardware offload failed: %d\n", err); | 209 | pr_err("Stopping hardware offload failed: %d\n", err); |
231 | return; | ||
232 | } | ||
233 | |||
234 | prog->offloaded = false; | ||
235 | } | 210 | } |
236 | 211 | ||
237 | static void cls_bpf_offload_update_stats(struct tcf_proto *tp, | 212 | static void cls_bpf_offload_update_stats(struct tcf_proto *tp, |
238 | struct cls_bpf_prog *prog) | 213 | struct cls_bpf_prog *prog) |
239 | { | 214 | { |
240 | if (!prog->offloaded) | 215 | struct tcf_block *block = tp->chain->block; |
241 | return; | 216 | struct tc_cls_bpf_offload cls_bpf = {}; |
217 | |||
218 | tc_cls_common_offload_init(&cls_bpf.common, tp); | ||
219 | cls_bpf.command = TC_CLSBPF_STATS; | ||
220 | cls_bpf.exts = &prog->exts; | ||
221 | cls_bpf.prog = prog->filter; | ||
222 | cls_bpf.name = prog->bpf_name; | ||
223 | cls_bpf.exts_integrated = prog->exts_integrated; | ||
224 | cls_bpf.gen_flags = prog->gen_flags; | ||
242 | 225 | ||
243 | cls_bpf_offload_cmd(tp, prog, TC_CLSBPF_STATS); | 226 | tc_setup_cb_call(block, NULL, TC_SETUP_CLSBPF, &cls_bpf, false); |
244 | } | 227 | } |
245 | 228 | ||
246 | static int cls_bpf_init(struct tcf_proto *tp) | 229 | static int cls_bpf_init(struct tcf_proto *tp) |
diff --git a/net/sctp/debug.c b/net/sctp/debug.c index 3f619fdcbf0a..291c97b07058 100644 --- a/net/sctp/debug.c +++ b/net/sctp/debug.c | |||
@@ -78,6 +78,9 @@ const char *sctp_cname(const union sctp_subtype cid) | |||
78 | case SCTP_CID_AUTH: | 78 | case SCTP_CID_AUTH: |
79 | return "AUTH"; | 79 | return "AUTH"; |
80 | 80 | ||
81 | case SCTP_CID_RECONF: | ||
82 | return "RECONF"; | ||
83 | |||
81 | default: | 84 | default: |
82 | break; | 85 | break; |
83 | } | 86 | } |
diff --git a/net/sctp/ulpqueue.c b/net/sctp/ulpqueue.c index 97fae53310e0..0b427100b0d4 100644 --- a/net/sctp/ulpqueue.c +++ b/net/sctp/ulpqueue.c | |||
@@ -1093,29 +1093,21 @@ void sctp_ulpq_partial_delivery(struct sctp_ulpq *ulpq, | |||
1093 | void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, | 1093 | void sctp_ulpq_renege(struct sctp_ulpq *ulpq, struct sctp_chunk *chunk, |
1094 | gfp_t gfp) | 1094 | gfp_t gfp) |
1095 | { | 1095 | { |
1096 | struct sctp_association *asoc; | 1096 | struct sctp_association *asoc = ulpq->asoc; |
1097 | __u16 needed, freed; | 1097 | __u32 freed = 0; |
1098 | 1098 | __u16 needed; | |
1099 | asoc = ulpq->asoc; | ||
1100 | 1099 | ||
1101 | if (chunk) { | 1100 | needed = ntohs(chunk->chunk_hdr->length) - |
1102 | needed = ntohs(chunk->chunk_hdr->length); | 1101 | sizeof(struct sctp_data_chunk); |
1103 | needed -= sizeof(struct sctp_data_chunk); | ||
1104 | } else | ||
1105 | needed = SCTP_DEFAULT_MAXWINDOW; | ||
1106 | |||
1107 | freed = 0; | ||
1108 | 1102 | ||
1109 | if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { | 1103 | if (skb_queue_empty(&asoc->base.sk->sk_receive_queue)) { |
1110 | freed = sctp_ulpq_renege_order(ulpq, needed); | 1104 | freed = sctp_ulpq_renege_order(ulpq, needed); |
1111 | if (freed < needed) { | 1105 | if (freed < needed) |
1112 | freed += sctp_ulpq_renege_frags(ulpq, needed - freed); | 1106 | freed += sctp_ulpq_renege_frags(ulpq, needed - freed); |
1113 | } | ||
1114 | } | 1107 | } |
1115 | /* If able to free enough room, accept this chunk. */ | 1108 | /* If able to free enough room, accept this chunk. */ |
1116 | if (chunk && (freed >= needed)) { | 1109 | if (freed >= needed) { |
1117 | int retval; | 1110 | int retval = sctp_ulpq_tail_data(ulpq, chunk, gfp); |
1118 | retval = sctp_ulpq_tail_data(ulpq, chunk, gfp); | ||
1119 | /* | 1111 | /* |
1120 | * Enter partial delivery if chunk has not been | 1112 | * Enter partial delivery if chunk has not been |
1121 | * delivered; otherwise, drain the reassembly queue. | 1113 | * delivered; otherwise, drain the reassembly queue. |
diff --git a/net/tipc/group.c b/net/tipc/group.c index 95fec2c057d6..7ebbdeb2a90e 100644 --- a/net/tipc/group.c +++ b/net/tipc/group.c | |||
@@ -351,8 +351,7 @@ void tipc_group_update_member(struct tipc_member *m, int len) | |||
351 | if (m->window >= ADV_IDLE) | 351 | if (m->window >= ADV_IDLE) |
352 | return; | 352 | return; |
353 | 353 | ||
354 | if (!list_empty(&m->congested)) | 354 | list_del_init(&m->congested); |
355 | return; | ||
356 | 355 | ||
357 | /* Sort member into congested members' list */ | 356 | /* Sort member into congested members' list */ |
358 | list_for_each_entry_safe(_m, tmp, &grp->congested, congested) { | 357 | list_for_each_entry_safe(_m, tmp, &grp->congested, congested) { |
@@ -648,6 +647,7 @@ static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m, | |||
648 | } else if (mtyp == GRP_REMIT_MSG) { | 647 | } else if (mtyp == GRP_REMIT_MSG) { |
649 | msg_set_grp_remitted(hdr, m->window); | 648 | msg_set_grp_remitted(hdr, m->window); |
650 | } | 649 | } |
650 | msg_set_dest_droppable(hdr, true); | ||
651 | __skb_queue_tail(xmitq, skb); | 651 | __skb_queue_tail(xmitq, skb); |
652 | } | 652 | } |
653 | 653 | ||
@@ -689,15 +689,16 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup, | |||
689 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); | 689 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); |
690 | __skb_queue_tail(inputq, m->event_msg); | 690 | __skb_queue_tail(inputq, m->event_msg); |
691 | } | 691 | } |
692 | if (m->window < ADV_IDLE) | 692 | list_del_init(&m->congested); |
693 | tipc_group_update_member(m, 0); | 693 | tipc_group_update_member(m, 0); |
694 | else | ||
695 | list_del_init(&m->congested); | ||
696 | return; | 694 | return; |
697 | case GRP_LEAVE_MSG: | 695 | case GRP_LEAVE_MSG: |
698 | if (!m) | 696 | if (!m) |
699 | return; | 697 | return; |
700 | m->bc_syncpt = msg_grp_bc_syncpt(hdr); | 698 | m->bc_syncpt = msg_grp_bc_syncpt(hdr); |
699 | list_del_init(&m->list); | ||
700 | list_del_init(&m->congested); | ||
701 | *usr_wakeup = true; | ||
701 | 702 | ||
702 | /* Wait until WITHDRAW event is received */ | 703 | /* Wait until WITHDRAW event is received */ |
703 | if (m->state != MBR_LEAVING) { | 704 | if (m->state != MBR_LEAVING) { |
@@ -709,8 +710,6 @@ void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup, | |||
709 | ehdr = buf_msg(m->event_msg); | 710 | ehdr = buf_msg(m->event_msg); |
710 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); | 711 | msg_set_grp_bc_seqno(ehdr, m->bc_syncpt); |
711 | __skb_queue_tail(inputq, m->event_msg); | 712 | __skb_queue_tail(inputq, m->event_msg); |
712 | *usr_wakeup = true; | ||
713 | list_del_init(&m->congested); | ||
714 | return; | 713 | return; |
715 | case GRP_ADV_MSG: | 714 | case GRP_ADV_MSG: |
716 | if (!m) | 715 | if (!m) |
@@ -862,6 +861,7 @@ void tipc_group_member_evt(struct tipc_group *grp, | |||
862 | msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt); | 861 | msg_set_grp_bc_seqno(hdr, m->bc_rcv_nxt); |
863 | __skb_queue_tail(inputq, skb); | 862 | __skb_queue_tail(inputq, skb); |
864 | } | 863 | } |
864 | list_del_init(&m->list); | ||
865 | list_del_init(&m->congested); | 865 | list_del_init(&m->congested); |
866 | } | 866 | } |
867 | *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); | 867 | *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); |
diff --git a/net/wireless/Makefile b/net/wireless/Makefile index d7d6cb00c47b..1d84f91bbfb0 100644 --- a/net/wireless/Makefile +++ b/net/wireless/Makefile | |||
@@ -23,27 +23,14 @@ ifneq ($(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR),) | |||
23 | cfg80211-y += extra-certs.o | 23 | cfg80211-y += extra-certs.o |
24 | endif | 24 | endif |
25 | 25 | ||
26 | $(obj)/shipped-certs.c: $(wildcard $(srctree)/$(src)/certs/*.x509) | 26 | $(obj)/shipped-certs.c: $(wildcard $(srctree)/$(src)/certs/*.hex) |
27 | @$(kecho) " GEN $@" | 27 | @$(kecho) " GEN $@" |
28 | @(set -e; \ | 28 | @(echo '#include "reg.h"'; \ |
29 | allf=""; \ | 29 | echo 'const u8 shipped_regdb_certs[] = {'; \ |
30 | for f in $^ ; do \ | 30 | cat $^ ; \ |
31 | # similar to hexdump -v -e '1/1 "0x%.2x," "\n"' \ | 31 | echo '};'; \ |
32 | thisf=$$(od -An -v -tx1 < $$f | \ | 32 | echo 'unsigned int shipped_regdb_certs_len = sizeof(shipped_regdb_certs);'; \ |
33 | sed -e 's/ /\n/g' | \ | 33 | ) > $@ |
34 | sed -e 's/^[0-9a-f]\+$$/\0/;t;d' | \ | ||
35 | sed -e 's/^/0x/;s/$$/,/'); \ | ||
36 | # file should not be empty - maybe command substitution failed? \ | ||
37 | test ! -z "$$thisf";\ | ||
38 | allf=$$allf$$thisf;\ | ||
39 | done; \ | ||
40 | ( \ | ||
41 | echo '#include "reg.h"'; \ | ||
42 | echo 'const u8 shipped_regdb_certs[] = {'; \ | ||
43 | echo "$$allf"; \ | ||
44 | echo '};'; \ | ||
45 | echo 'unsigned int shipped_regdb_certs_len = sizeof(shipped_regdb_certs);'; \ | ||
46 | ) >> $@) | ||
47 | 34 | ||
48 | $(obj)/extra-certs.c: $(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR:"%"=%) \ | 35 | $(obj)/extra-certs.c: $(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR:"%"=%) \ |
49 | $(wildcard $(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR:"%"=%)/*.x509) | 36 | $(wildcard $(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR:"%"=%)/*.x509) |
@@ -66,4 +53,6 @@ $(obj)/extra-certs.c: $(CONFIG_CFG80211_EXTRA_REGDB_KEYDIR:"%"=%) \ | |||
66 | echo "$$allf"; \ | 53 | echo "$$allf"; \ |
67 | echo '};'; \ | 54 | echo '};'; \ |
68 | echo 'unsigned int extra_regdb_certs_len = sizeof(extra_regdb_certs);'; \ | 55 | echo 'unsigned int extra_regdb_certs_len = sizeof(extra_regdb_certs);'; \ |
69 | ) >> $@) | 56 | ) > $@) |
57 | |||
58 | clean-files += shipped-certs.c extra-certs.c | ||
diff --git a/net/wireless/certs/sforshee.hex b/net/wireless/certs/sforshee.hex new file mode 100644 index 000000000000..14ea66643ffa --- /dev/null +++ b/net/wireless/certs/sforshee.hex | |||
@@ -0,0 +1,86 @@ | |||
1 | /* Seth Forshee's regdb certificate */ | ||
2 | 0x30, 0x82, 0x02, 0xa4, 0x30, 0x82, 0x01, 0x8c, | ||
3 | 0x02, 0x09, 0x00, 0xb2, 0x8d, 0xdf, 0x47, 0xae, | ||
4 | 0xf9, 0xce, 0xa7, 0x30, 0x0d, 0x06, 0x09, 0x2a, | ||
5 | 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, | ||
6 | 0x05, 0x00, 0x30, 0x13, 0x31, 0x11, 0x30, 0x0f, | ||
7 | 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x73, | ||
8 | 0x66, 0x6f, 0x72, 0x73, 0x68, 0x65, 0x65, 0x30, | ||
9 | 0x20, 0x17, 0x0d, 0x31, 0x37, 0x31, 0x30, 0x30, | ||
10 | 0x36, 0x31, 0x39, 0x34, 0x30, 0x33, 0x35, 0x5a, | ||
11 | 0x18, 0x0f, 0x32, 0x31, 0x31, 0x37, 0x30, 0x39, | ||
12 | 0x31, 0x32, 0x31, 0x39, 0x34, 0x30, 0x33, 0x35, | ||
13 | 0x5a, 0x30, 0x13, 0x31, 0x11, 0x30, 0x0f, 0x06, | ||
14 | 0x03, 0x55, 0x04, 0x03, 0x0c, 0x08, 0x73, 0x66, | ||
15 | 0x6f, 0x72, 0x73, 0x68, 0x65, 0x65, 0x30, 0x82, | ||
16 | 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, | ||
17 | 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, | ||
18 | 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, | ||
19 | 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb5, | ||
20 | 0x40, 0xe3, 0x9c, 0x28, 0x84, 0x39, 0x03, 0xf2, | ||
21 | 0x39, 0xd7, 0x66, 0x2c, 0x41, 0x38, 0x15, 0xac, | ||
22 | 0x7e, 0xa5, 0x83, 0x71, 0x25, 0x7e, 0x90, 0x7c, | ||
23 | 0x68, 0xdd, 0x6f, 0x3f, 0xd9, 0xd7, 0x59, 0x38, | ||
24 | 0x9f, 0x7c, 0x6a, 0x52, 0xc2, 0x03, 0x2a, 0x2d, | ||
25 | 0x7e, 0x66, 0xf4, 0x1e, 0xb3, 0x12, 0x70, 0x20, | ||
26 | 0x5b, 0xd4, 0x97, 0x32, 0x3d, 0x71, 0x8b, 0x3b, | ||
27 | 0x1b, 0x08, 0x17, 0x14, 0x6b, 0x61, 0xc4, 0x57, | ||
28 | 0x8b, 0x96, 0x16, 0x1c, 0xfd, 0x24, 0xd5, 0x0b, | ||
29 | 0x09, 0xf9, 0x68, 0x11, 0x84, 0xfb, 0xca, 0x51, | ||
30 | 0x0c, 0xd1, 0x45, 0x19, 0xda, 0x10, 0x44, 0x8a, | ||
31 | 0xd9, 0xfe, 0x76, 0xa9, 0xfd, 0x60, 0x2d, 0x18, | ||
32 | 0x0b, 0x28, 0x95, 0xb2, 0x2d, 0xea, 0x88, 0x98, | ||
33 | 0xb8, 0xd1, 0x56, 0x21, 0xf0, 0x53, 0x1f, 0xf1, | ||
34 | 0x02, 0x6f, 0xe9, 0x46, 0x9b, 0x93, 0x5f, 0x28, | ||
35 | 0x90, 0x0f, 0xac, 0x36, 0xfa, 0x68, 0x23, 0x71, | ||
36 | 0x57, 0x56, 0xf6, 0xcc, 0xd3, 0xdf, 0x7d, 0x2a, | ||
37 | 0xd9, 0x1b, 0x73, 0x45, 0xeb, 0xba, 0x27, 0x85, | ||
38 | 0xef, 0x7a, 0x7f, 0xa5, 0xcb, 0x80, 0xc7, 0x30, | ||
39 | 0x36, 0xd2, 0x53, 0xee, 0xec, 0xac, 0x1e, 0xe7, | ||
40 | 0x31, 0xf1, 0x36, 0xa2, 0x9c, 0x63, 0xc6, 0x65, | ||
41 | 0x5b, 0x7f, 0x25, 0x75, 0x68, 0xa1, 0xea, 0xd3, | ||
42 | 0x7e, 0x00, 0x5c, 0x9a, 0x5e, 0xd8, 0x20, 0x18, | ||
43 | 0x32, 0x77, 0x07, 0x29, 0x12, 0x66, 0x1e, 0x36, | ||
44 | 0x73, 0xe7, 0x97, 0x04, 0x41, 0x37, 0xb1, 0xb1, | ||
45 | 0x72, 0x2b, 0xf4, 0xa1, 0x29, 0x20, 0x7c, 0x96, | ||
46 | 0x79, 0x0b, 0x2b, 0xd0, 0xd8, 0xde, 0xc8, 0x6c, | ||
47 | 0x3f, 0x93, 0xfb, 0xc5, 0xee, 0x78, 0x52, 0x11, | ||
48 | 0x15, 0x1b, 0x7a, 0xf6, 0xe2, 0x68, 0x99, 0xe7, | ||
49 | 0xfb, 0x46, 0x16, 0x84, 0xe3, 0xc7, 0xa1, 0xe6, | ||
50 | 0xe0, 0xd2, 0x46, 0xd5, 0xe1, 0xc4, 0x5f, 0xa0, | ||
51 | 0x66, 0xf4, 0xda, 0xc4, 0xff, 0x95, 0x1d, 0x02, | ||
52 | 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, | ||
53 | 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, | ||
54 | 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, | ||
55 | 0x87, 0x03, 0xda, 0xf2, 0x82, 0xc2, 0xdd, 0xaf, | ||
56 | 0x7c, 0x44, 0x2f, 0x86, 0xd3, 0x5f, 0x4c, 0x93, | ||
57 | 0x48, 0xb9, 0xfe, 0x07, 0x17, 0xbb, 0x21, 0xf7, | ||
58 | 0x25, 0x23, 0x4e, 0xaa, 0x22, 0x0c, 0x16, 0xb9, | ||
59 | 0x73, 0xae, 0x9d, 0x46, 0x7c, 0x75, 0xd9, 0xc3, | ||
60 | 0x49, 0x57, 0x47, 0xbf, 0x33, 0xb7, 0x97, 0xec, | ||
61 | 0xf5, 0x40, 0x75, 0xc0, 0x46, 0x22, 0xf0, 0xa0, | ||
62 | 0x5d, 0x9c, 0x79, 0x13, 0xa1, 0xff, 0xb8, 0xa3, | ||
63 | 0x2f, 0x7b, 0x8e, 0x06, 0x3f, 0xc8, 0xb6, 0xe4, | ||
64 | 0x6a, 0x28, 0xf2, 0x34, 0x5c, 0x23, 0x3f, 0x32, | ||
65 | 0xc0, 0xe6, 0xad, 0x0f, 0xac, 0xcf, 0x55, 0x74, | ||
66 | 0x47, 0x73, 0xd3, 0x01, 0x85, 0xb7, 0x0b, 0x22, | ||
67 | 0x56, 0x24, 0x7d, 0x9f, 0x09, 0xa9, 0x0e, 0x86, | ||
68 | 0x9e, 0x37, 0x5b, 0x9c, 0x6d, 0x02, 0xd9, 0x8c, | ||
69 | 0xc8, 0x50, 0x6a, 0xe2, 0x59, 0xf3, 0x16, 0x06, | ||
70 | 0xea, 0xb2, 0x42, 0xb5, 0x58, 0xfe, 0xba, 0xd1, | ||
71 | 0x81, 0x57, 0x1a, 0xef, 0xb2, 0x38, 0x88, 0x58, | ||
72 | 0xf6, 0xaa, 0xc4, 0x2e, 0x8b, 0x5a, 0x27, 0xe4, | ||
73 | 0xa5, 0xe8, 0xa4, 0xca, 0x67, 0x5c, 0xac, 0x72, | ||
74 | 0x67, 0xc3, 0x6f, 0x13, 0xc3, 0x2d, 0x35, 0x79, | ||
75 | 0xd7, 0x8a, 0xe7, 0xf5, 0xd4, 0x21, 0x30, 0x4a, | ||
76 | 0xd5, 0xf6, 0xa3, 0xd9, 0x79, 0x56, 0xf2, 0x0f, | ||
77 | 0x10, 0xf7, 0x7d, 0xd0, 0x51, 0x93, 0x2f, 0x47, | ||
78 | 0xf8, 0x7d, 0x4b, 0x0a, 0x84, 0x55, 0x12, 0x0a, | ||
79 | 0x7d, 0x4e, 0x3b, 0x1f, 0x2b, 0x2f, 0xfc, 0x28, | ||
80 | 0xb3, 0x69, 0x34, 0xe1, 0x80, 0x80, 0xbb, 0xe2, | ||
81 | 0xaf, 0xb9, 0xd6, 0x30, 0xf1, 0x1d, 0x54, 0x87, | ||
82 | 0x23, 0x99, 0x9f, 0x51, 0x03, 0x4c, 0x45, 0x7d, | ||
83 | 0x02, 0x65, 0x73, 0xab, 0xfd, 0xcf, 0x94, 0xcc, | ||
84 | 0x0d, 0x3a, 0x60, 0xfd, 0x3c, 0x14, 0x2f, 0x16, | ||
85 | 0x33, 0xa9, 0x21, 0x1f, 0xcb, 0x50, 0xb1, 0x8f, | ||
86 | 0x03, 0xee, 0xa0, 0x66, 0xa9, 0x16, 0x79, 0x14, | ||
diff --git a/net/wireless/certs/sforshee.x509 b/net/wireless/certs/sforshee.x509 deleted file mode 100644 index c6f8f9d6b988..000000000000 --- a/net/wireless/certs/sforshee.x509 +++ /dev/null | |||
Binary files differ | |||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index b1ac23ca20c8..213d0c498c97 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -2610,7 +2610,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag | |||
2610 | case NL80211_IFTYPE_AP: | 2610 | case NL80211_IFTYPE_AP: |
2611 | if (wdev->ssid_len && | 2611 | if (wdev->ssid_len && |
2612 | nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) | 2612 | nla_put(msg, NL80211_ATTR_SSID, wdev->ssid_len, wdev->ssid)) |
2613 | goto nla_put_failure; | 2613 | goto nla_put_failure_locked; |
2614 | break; | 2614 | break; |
2615 | case NL80211_IFTYPE_STATION: | 2615 | case NL80211_IFTYPE_STATION: |
2616 | case NL80211_IFTYPE_P2P_CLIENT: | 2616 | case NL80211_IFTYPE_P2P_CLIENT: |
@@ -2623,7 +2623,7 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag | |||
2623 | if (!ssid_ie) | 2623 | if (!ssid_ie) |
2624 | break; | 2624 | break; |
2625 | if (nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) | 2625 | if (nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) |
2626 | goto nla_put_failure; | 2626 | goto nla_put_failure_locked; |
2627 | break; | 2627 | break; |
2628 | } | 2628 | } |
2629 | default: | 2629 | default: |
@@ -2635,6 +2635,8 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag | |||
2635 | genlmsg_end(msg, hdr); | 2635 | genlmsg_end(msg, hdr); |
2636 | return 0; | 2636 | return 0; |
2637 | 2637 | ||
2638 | nla_put_failure_locked: | ||
2639 | wdev_unlock(wdev); | ||
2638 | nla_put_failure: | 2640 | nla_put_failure: |
2639 | genlmsg_cancel(msg, hdr); | 2641 | genlmsg_cancel(msg, hdr); |
2640 | return -EMSGSIZE; | 2642 | return -EMSGSIZE; |