diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/9p/trans_virtio.c | 24 | ||||
| -rw-r--r-- | net/bridge/br_if.c | 2 | ||||
| -rw-r--r-- | net/caif/caif_socket.c | 2 | ||||
| -rw-r--r-- | net/core/rtnetlink.c | 26 | ||||
| -rw-r--r-- | net/core/skbuff.c | 10 | ||||
| -rw-r--r-- | net/core/sock.c | 4 | ||||
| -rw-r--r-- | net/core/sysctl_net_core.c | 10 | ||||
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 1 | ||||
| -rw-r--r-- | net/ipv4/inet_diag.c | 18 | ||||
| -rw-r--r-- | net/ipv4/ip_forward.c | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_cong.c | 6 | ||||
| -rw-r--r-- | net/ipv4/tcp_cubic.c | 6 | ||||
| -rw-r--r-- | net/ipv4/xfrm4_output.c | 2 | ||||
| -rw-r--r-- | net/ipv6/ip6_output.c | 1 | ||||
| -rw-r--r-- | net/ipv6/ip6_tunnel.c | 33 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_output.c | 2 | ||||
| -rw-r--r-- | net/ipv6/xfrm6_policy.c | 1 | ||||
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 24 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 16 | ||||
| -rw-r--r-- | net/mac80211/rx.c | 3 | ||||
| -rw-r--r-- | net/mac80211/util.c | 2 | ||||
| -rw-r--r-- | net/rds/iw_rdma.c | 40 | ||||
| -rw-r--r-- | net/rxrpc/ar-recvmsg.c | 2 | ||||
| -rw-r--r-- | net/sched/act_bpf.c | 36 | ||||
| -rw-r--r-- | net/sched/cls_u32.c | 5 | ||||
| -rw-r--r-- | net/wireless/nl80211.c | 10 | ||||
| -rw-r--r-- | net/xfrm/xfrm_policy.c | 12 |
27 files changed, 209 insertions, 90 deletions
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index d8e376a5f0f1..36a1a739ad68 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
| @@ -658,14 +658,30 @@ p9_virtio_create(struct p9_client *client, const char *devname, char *args) | |||
| 658 | static void p9_virtio_remove(struct virtio_device *vdev) | 658 | static void p9_virtio_remove(struct virtio_device *vdev) |
| 659 | { | 659 | { |
| 660 | struct virtio_chan *chan = vdev->priv; | 660 | struct virtio_chan *chan = vdev->priv; |
| 661 | 661 | unsigned long warning_time; | |
| 662 | if (chan->inuse) | ||
| 663 | p9_virtio_close(chan->client); | ||
| 664 | vdev->config->del_vqs(vdev); | ||
| 665 | 662 | ||
| 666 | mutex_lock(&virtio_9p_lock); | 663 | mutex_lock(&virtio_9p_lock); |
| 664 | |||
| 665 | /* Remove self from list so we don't get new users. */ | ||
| 667 | list_del(&chan->chan_list); | 666 | list_del(&chan->chan_list); |
| 667 | warning_time = jiffies; | ||
| 668 | |||
| 669 | /* Wait for existing users to close. */ | ||
| 670 | while (chan->inuse) { | ||
| 671 | mutex_unlock(&virtio_9p_lock); | ||
| 672 | msleep(250); | ||
| 673 | if (time_after(jiffies, warning_time + 10 * HZ)) { | ||
| 674 | dev_emerg(&vdev->dev, | ||
| 675 | "p9_virtio_remove: waiting for device in use.\n"); | ||
| 676 | warning_time = jiffies; | ||
| 677 | } | ||
| 678 | mutex_lock(&virtio_9p_lock); | ||
| 679 | } | ||
| 680 | |||
| 668 | mutex_unlock(&virtio_9p_lock); | 681 | mutex_unlock(&virtio_9p_lock); |
| 682 | |||
| 683 | vdev->config->del_vqs(vdev); | ||
| 684 | |||
| 669 | sysfs_remove_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); | 685 | sysfs_remove_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr); |
| 670 | kobject_uevent(&(vdev->dev.kobj), KOBJ_CHANGE); | 686 | kobject_uevent(&(vdev->dev.kobj), KOBJ_CHANGE); |
| 671 | kfree(chan->tag); | 687 | kfree(chan->tag); |
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index b087d278c679..1849d96b3c91 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
| @@ -563,6 +563,8 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) | |||
| 563 | */ | 563 | */ |
| 564 | del_nbp(p); | 564 | del_nbp(p); |
| 565 | 565 | ||
| 566 | dev_set_mtu(br->dev, br_min_mtu(br)); | ||
| 567 | |||
| 566 | spin_lock_bh(&br->lock); | 568 | spin_lock_bh(&br->lock); |
| 567 | changed_addr = br_stp_recalculate_bridge_id(br); | 569 | changed_addr = br_stp_recalculate_bridge_id(br); |
| 568 | spin_unlock_bh(&br->lock); | 570 | spin_unlock_bh(&br->lock); |
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c index 769b185fefbd..a6e2da0bc718 100644 --- a/net/caif/caif_socket.c +++ b/net/caif/caif_socket.c | |||
| @@ -281,7 +281,7 @@ static int caif_seqpkt_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 281 | int copylen; | 281 | int copylen; |
| 282 | 282 | ||
| 283 | ret = -EOPNOTSUPP; | 283 | ret = -EOPNOTSUPP; |
| 284 | if (m->msg_flags&MSG_OOB) | 284 | if (flags & MSG_OOB) |
| 285 | goto read_error; | 285 | goto read_error; |
| 286 | 286 | ||
| 287 | skb = skb_recv_datagram(sk, flags, 0 , &ret); | 287 | skb = skb_recv_datagram(sk, flags, 0 , &ret); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 25b4b5d23485..ee0608bb3bc0 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -2166,28 +2166,28 @@ replay: | |||
| 2166 | } | 2166 | } |
| 2167 | } | 2167 | } |
| 2168 | err = rtnl_configure_link(dev, ifm); | 2168 | err = rtnl_configure_link(dev, ifm); |
| 2169 | if (err < 0) { | 2169 | if (err < 0) |
| 2170 | if (ops->newlink) { | 2170 | goto out_unregister; |
| 2171 | LIST_HEAD(list_kill); | ||
| 2172 | |||
| 2173 | ops->dellink(dev, &list_kill); | ||
| 2174 | unregister_netdevice_many(&list_kill); | ||
| 2175 | } else { | ||
| 2176 | unregister_netdevice(dev); | ||
| 2177 | } | ||
| 2178 | goto out; | ||
| 2179 | } | ||
| 2180 | |||
| 2181 | if (link_net) { | 2171 | if (link_net) { |
| 2182 | err = dev_change_net_namespace(dev, dest_net, ifname); | 2172 | err = dev_change_net_namespace(dev, dest_net, ifname); |
| 2183 | if (err < 0) | 2173 | if (err < 0) |
| 2184 | unregister_netdevice(dev); | 2174 | goto out_unregister; |
| 2185 | } | 2175 | } |
| 2186 | out: | 2176 | out: |
| 2187 | if (link_net) | 2177 | if (link_net) |
| 2188 | put_net(link_net); | 2178 | put_net(link_net); |
| 2189 | put_net(dest_net); | 2179 | put_net(dest_net); |
| 2190 | return err; | 2180 | return err; |
| 2181 | out_unregister: | ||
| 2182 | if (ops->newlink) { | ||
| 2183 | LIST_HEAD(list_kill); | ||
| 2184 | |||
| 2185 | ops->dellink(dev, &list_kill); | ||
| 2186 | unregister_netdevice_many(&list_kill); | ||
| 2187 | } else { | ||
| 2188 | unregister_netdevice(dev); | ||
| 2189 | } | ||
| 2190 | goto out; | ||
| 2191 | } | 2191 | } |
| 2192 | } | 2192 | } |
| 2193 | 2193 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index f80507823531..8e4ac97c8477 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3733,9 +3733,13 @@ void __skb_tstamp_tx(struct sk_buff *orig_skb, | |||
| 3733 | struct sock *sk, int tstype) | 3733 | struct sock *sk, int tstype) |
| 3734 | { | 3734 | { |
| 3735 | struct sk_buff *skb; | 3735 | struct sk_buff *skb; |
| 3736 | bool tsonly = sk->sk_tsflags & SOF_TIMESTAMPING_OPT_TSONLY; | 3736 | bool tsonly; |
| 3737 | 3737 | ||
| 3738 | if (!sk || !skb_may_tx_timestamp(sk, tsonly)) | 3738 | if (!sk) |
| 3739 | return; | ||
| 3740 | |||
| 3741 | tsonly = sk->sk_tsflags & SOF_TIMESTAMPING_OPT_TSONLY; | ||
| 3742 | if (!skb_may_tx_timestamp(sk, tsonly)) | ||
| 3739 | return; | 3743 | return; |
| 3740 | 3744 | ||
| 3741 | if (tsonly) | 3745 | if (tsonly) |
| @@ -4173,7 +4177,7 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet) | |||
| 4173 | skb->ignore_df = 0; | 4177 | skb->ignore_df = 0; |
| 4174 | skb_dst_drop(skb); | 4178 | skb_dst_drop(skb); |
| 4175 | skb->mark = 0; | 4179 | skb->mark = 0; |
| 4176 | skb->sender_cpu = 0; | 4180 | skb_sender_cpu_clear(skb); |
| 4177 | skb_init_secmark(skb); | 4181 | skb_init_secmark(skb); |
| 4178 | secpath_reset(skb); | 4182 | secpath_reset(skb); |
| 4179 | nf_reset(skb); | 4183 | nf_reset(skb); |
diff --git a/net/core/sock.c b/net/core/sock.c index 93c8b20c91e4..78e89eb7eb70 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1655,6 +1655,10 @@ void sock_rfree(struct sk_buff *skb) | |||
| 1655 | } | 1655 | } |
| 1656 | EXPORT_SYMBOL(sock_rfree); | 1656 | EXPORT_SYMBOL(sock_rfree); |
| 1657 | 1657 | ||
| 1658 | /* | ||
| 1659 | * Buffer destructor for skbs that are not used directly in read or write | ||
| 1660 | * path, e.g. for error handler skbs. Automatically called from kfree_skb. | ||
| 1661 | */ | ||
| 1658 | void sock_efree(struct sk_buff *skb) | 1662 | void sock_efree(struct sk_buff *skb) |
| 1659 | { | 1663 | { |
| 1660 | sock_put(skb->sk); | 1664 | sock_put(skb->sk); |
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c index 433424804284..8ce351ffceb1 100644 --- a/net/core/sysctl_net_core.c +++ b/net/core/sysctl_net_core.c | |||
| @@ -25,6 +25,8 @@ | |||
| 25 | static int zero = 0; | 25 | static int zero = 0; |
| 26 | static int one = 1; | 26 | static int one = 1; |
| 27 | static int ushort_max = USHRT_MAX; | 27 | static int ushort_max = USHRT_MAX; |
| 28 | static int min_sndbuf = SOCK_MIN_SNDBUF; | ||
| 29 | static int min_rcvbuf = SOCK_MIN_RCVBUF; | ||
| 28 | 30 | ||
| 29 | static int net_msg_warn; /* Unused, but still a sysctl */ | 31 | static int net_msg_warn; /* Unused, but still a sysctl */ |
| 30 | 32 | ||
| @@ -237,7 +239,7 @@ static struct ctl_table net_core_table[] = { | |||
| 237 | .maxlen = sizeof(int), | 239 | .maxlen = sizeof(int), |
| 238 | .mode = 0644, | 240 | .mode = 0644, |
| 239 | .proc_handler = proc_dointvec_minmax, | 241 | .proc_handler = proc_dointvec_minmax, |
| 240 | .extra1 = &one, | 242 | .extra1 = &min_sndbuf, |
| 241 | }, | 243 | }, |
| 242 | { | 244 | { |
| 243 | .procname = "rmem_max", | 245 | .procname = "rmem_max", |
| @@ -245,7 +247,7 @@ static struct ctl_table net_core_table[] = { | |||
| 245 | .maxlen = sizeof(int), | 247 | .maxlen = sizeof(int), |
| 246 | .mode = 0644, | 248 | .mode = 0644, |
| 247 | .proc_handler = proc_dointvec_minmax, | 249 | .proc_handler = proc_dointvec_minmax, |
| 248 | .extra1 = &one, | 250 | .extra1 = &min_rcvbuf, |
| 249 | }, | 251 | }, |
| 250 | { | 252 | { |
| 251 | .procname = "wmem_default", | 253 | .procname = "wmem_default", |
| @@ -253,7 +255,7 @@ static struct ctl_table net_core_table[] = { | |||
| 253 | .maxlen = sizeof(int), | 255 | .maxlen = sizeof(int), |
| 254 | .mode = 0644, | 256 | .mode = 0644, |
| 255 | .proc_handler = proc_dointvec_minmax, | 257 | .proc_handler = proc_dointvec_minmax, |
| 256 | .extra1 = &one, | 258 | .extra1 = &min_sndbuf, |
| 257 | }, | 259 | }, |
| 258 | { | 260 | { |
| 259 | .procname = "rmem_default", | 261 | .procname = "rmem_default", |
| @@ -261,7 +263,7 @@ static struct ctl_table net_core_table[] = { | |||
| 261 | .maxlen = sizeof(int), | 263 | .maxlen = sizeof(int), |
| 262 | .mode = 0644, | 264 | .mode = 0644, |
| 263 | .proc_handler = proc_dointvec_minmax, | 265 | .proc_handler = proc_dointvec_minmax, |
| 264 | .extra1 = &one, | 266 | .extra1 = &min_rcvbuf, |
| 265 | }, | 267 | }, |
| 266 | { | 268 | { |
| 267 | .procname = "dev_weight", | 269 | .procname = "dev_weight", |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 14d02ea905b6..3e44b9b0b78e 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -268,6 +268,7 @@ static int inet_csk_wait_for_connect(struct sock *sk, long timeo) | |||
| 268 | release_sock(sk); | 268 | release_sock(sk); |
| 269 | if (reqsk_queue_empty(&icsk->icsk_accept_queue)) | 269 | if (reqsk_queue_empty(&icsk->icsk_accept_queue)) |
| 270 | timeo = schedule_timeout(timeo); | 270 | timeo = schedule_timeout(timeo); |
| 271 | sched_annotate_sleep(); | ||
| 271 | lock_sock(sk); | 272 | lock_sock(sk); |
| 272 | err = 0; | 273 | err = 0; |
| 273 | if (!reqsk_queue_empty(&icsk->icsk_accept_queue)) | 274 | if (!reqsk_queue_empty(&icsk->icsk_accept_queue)) |
diff --git a/net/ipv4/inet_diag.c b/net/ipv4/inet_diag.c index 81751f12645f..592aff37366b 100644 --- a/net/ipv4/inet_diag.c +++ b/net/ipv4/inet_diag.c | |||
| @@ -71,6 +71,20 @@ static inline void inet_diag_unlock_handler( | |||
| 71 | mutex_unlock(&inet_diag_table_mutex); | 71 | mutex_unlock(&inet_diag_table_mutex); |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | static size_t inet_sk_attr_size(void) | ||
| 75 | { | ||
| 76 | return nla_total_size(sizeof(struct tcp_info)) | ||
| 77 | + nla_total_size(1) /* INET_DIAG_SHUTDOWN */ | ||
| 78 | + nla_total_size(1) /* INET_DIAG_TOS */ | ||
| 79 | + nla_total_size(1) /* INET_DIAG_TCLASS */ | ||
| 80 | + nla_total_size(sizeof(struct inet_diag_meminfo)) | ||
| 81 | + nla_total_size(sizeof(struct inet_diag_msg)) | ||
| 82 | + nla_total_size(SK_MEMINFO_VARS * sizeof(u32)) | ||
| 83 | + nla_total_size(TCP_CA_NAME_MAX) | ||
| 84 | + nla_total_size(sizeof(struct tcpvegas_info)) | ||
| 85 | + 64; | ||
| 86 | } | ||
| 87 | |||
| 74 | int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, | 88 | int inet_sk_diag_fill(struct sock *sk, struct inet_connection_sock *icsk, |
| 75 | struct sk_buff *skb, struct inet_diag_req_v2 *req, | 89 | struct sk_buff *skb, struct inet_diag_req_v2 *req, |
| 76 | struct user_namespace *user_ns, | 90 | struct user_namespace *user_ns, |
| @@ -326,9 +340,7 @@ int inet_diag_dump_one_icsk(struct inet_hashinfo *hashinfo, struct sk_buff *in_s | |||
| 326 | if (err) | 340 | if (err) |
| 327 | goto out; | 341 | goto out; |
| 328 | 342 | ||
| 329 | rep = nlmsg_new(sizeof(struct inet_diag_msg) + | 343 | rep = nlmsg_new(inet_sk_attr_size(), GFP_KERNEL); |
| 330 | sizeof(struct inet_diag_meminfo) + | ||
| 331 | sizeof(struct tcp_info) + 64, GFP_KERNEL); | ||
| 332 | if (!rep) { | 344 | if (!rep) { |
| 333 | err = -ENOMEM; | 345 | err = -ENOMEM; |
| 334 | goto out; | 346 | goto out; |
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c index 787b3c294ce6..d9bc28ac5d1b 100644 --- a/net/ipv4/ip_forward.c +++ b/net/ipv4/ip_forward.c | |||
| @@ -67,6 +67,7 @@ static int ip_forward_finish(struct sk_buff *skb) | |||
| 67 | if (unlikely(opt->optlen)) | 67 | if (unlikely(opt->optlen)) |
| 68 | ip_forward_options(skb); | 68 | ip_forward_options(skb); |
| 69 | 69 | ||
| 70 | skb_sender_cpu_clear(skb); | ||
| 70 | return dst_output(skb); | 71 | return dst_output(skb); |
| 71 | } | 72 | } |
| 72 | 73 | ||
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c index d694088214cd..62856e185a93 100644 --- a/net/ipv4/tcp_cong.c +++ b/net/ipv4/tcp_cong.c | |||
| @@ -378,6 +378,12 @@ EXPORT_SYMBOL_GPL(tcp_slow_start); | |||
| 378 | */ | 378 | */ |
| 379 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked) | 379 | void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked) |
| 380 | { | 380 | { |
| 381 | /* If credits accumulated at a higher w, apply them gently now. */ | ||
| 382 | if (tp->snd_cwnd_cnt >= w) { | ||
| 383 | tp->snd_cwnd_cnt = 0; | ||
| 384 | tp->snd_cwnd++; | ||
| 385 | } | ||
| 386 | |||
| 381 | tp->snd_cwnd_cnt += acked; | 387 | tp->snd_cwnd_cnt += acked; |
| 382 | if (tp->snd_cwnd_cnt >= w) { | 388 | if (tp->snd_cwnd_cnt >= w) { |
| 383 | u32 delta = tp->snd_cwnd_cnt / w; | 389 | u32 delta = tp->snd_cwnd_cnt / w; |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index 4b276d1ed980..06d3d665a9fd 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
| @@ -306,8 +306,10 @@ tcp_friendliness: | |||
| 306 | } | 306 | } |
| 307 | } | 307 | } |
| 308 | 308 | ||
| 309 | if (ca->cnt == 0) /* cannot be zero */ | 309 | /* The maximum rate of cwnd increase CUBIC allows is 1 packet per |
| 310 | ca->cnt = 1; | 310 | * 2 packets ACKed, meaning cwnd grows at 1.5x per RTT. |
| 311 | */ | ||
| 312 | ca->cnt = max(ca->cnt, 2U); | ||
| 311 | } | 313 | } |
| 312 | 314 | ||
| 313 | static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) | 315 | static void bictcp_cong_avoid(struct sock *sk, u32 ack, u32 acked) |
diff --git a/net/ipv4/xfrm4_output.c b/net/ipv4/xfrm4_output.c index d5f6bd9a210a..dab73813cb92 100644 --- a/net/ipv4/xfrm4_output.c +++ b/net/ipv4/xfrm4_output.c | |||
| @@ -63,6 +63,7 @@ int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 63 | return err; | 63 | return err; |
| 64 | 64 | ||
| 65 | IPCB(skb)->flags |= IPSKB_XFRM_TUNNEL_SIZE; | 65 | IPCB(skb)->flags |= IPSKB_XFRM_TUNNEL_SIZE; |
| 66 | skb->protocol = htons(ETH_P_IP); | ||
| 66 | 67 | ||
| 67 | return x->outer_mode->output2(x, skb); | 68 | return x->outer_mode->output2(x, skb); |
| 68 | } | 69 | } |
| @@ -71,7 +72,6 @@ EXPORT_SYMBOL(xfrm4_prepare_output); | |||
| 71 | int xfrm4_output_finish(struct sk_buff *skb) | 72 | int xfrm4_output_finish(struct sk_buff *skb) |
| 72 | { | 73 | { |
| 73 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | 74 | memset(IPCB(skb), 0, sizeof(*IPCB(skb))); |
| 74 | skb->protocol = htons(ETH_P_IP); | ||
| 75 | 75 | ||
| 76 | #ifdef CONFIG_NETFILTER | 76 | #ifdef CONFIG_NETFILTER |
| 77 | IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED; | 77 | IPCB(skb)->flags |= IPSKB_XFRM_TRANSFORMED; |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 0a04a37305d5..7e80b61b51ff 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
| @@ -318,6 +318,7 @@ static int ip6_forward_proxy_check(struct sk_buff *skb) | |||
| 318 | 318 | ||
| 319 | static inline int ip6_forward_finish(struct sk_buff *skb) | 319 | static inline int ip6_forward_finish(struct sk_buff *skb) |
| 320 | { | 320 | { |
| 321 | skb_sender_cpu_clear(skb); | ||
| 321 | return dst_output(skb); | 322 | return dst_output(skb); |
| 322 | } | 323 | } |
| 323 | 324 | ||
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 266a264ec212..ddd94eca19b3 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
| @@ -314,7 +314,7 @@ out: | |||
| 314 | * Create tunnel matching given parameters. | 314 | * Create tunnel matching given parameters. |
| 315 | * | 315 | * |
| 316 | * Return: | 316 | * Return: |
| 317 | * created tunnel or NULL | 317 | * created tunnel or error pointer |
| 318 | **/ | 318 | **/ |
| 319 | 319 | ||
| 320 | static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) | 320 | static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) |
| @@ -322,7 +322,7 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) | |||
| 322 | struct net_device *dev; | 322 | struct net_device *dev; |
| 323 | struct ip6_tnl *t; | 323 | struct ip6_tnl *t; |
| 324 | char name[IFNAMSIZ]; | 324 | char name[IFNAMSIZ]; |
| 325 | int err; | 325 | int err = -ENOMEM; |
| 326 | 326 | ||
| 327 | if (p->name[0]) | 327 | if (p->name[0]) |
| 328 | strlcpy(name, p->name, IFNAMSIZ); | 328 | strlcpy(name, p->name, IFNAMSIZ); |
| @@ -348,7 +348,7 @@ static struct ip6_tnl *ip6_tnl_create(struct net *net, struct __ip6_tnl_parm *p) | |||
| 348 | failed_free: | 348 | failed_free: |
| 349 | ip6_dev_free(dev); | 349 | ip6_dev_free(dev); |
| 350 | failed: | 350 | failed: |
| 351 | return NULL; | 351 | return ERR_PTR(err); |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | /** | 354 | /** |
| @@ -362,7 +362,7 @@ failed: | |||
| 362 | * tunnel device is created and registered for use. | 362 | * tunnel device is created and registered for use. |
| 363 | * | 363 | * |
| 364 | * Return: | 364 | * Return: |
| 365 | * matching tunnel or NULL | 365 | * matching tunnel or error pointer |
| 366 | **/ | 366 | **/ |
| 367 | 367 | ||
| 368 | static struct ip6_tnl *ip6_tnl_locate(struct net *net, | 368 | static struct ip6_tnl *ip6_tnl_locate(struct net *net, |
| @@ -380,13 +380,13 @@ static struct ip6_tnl *ip6_tnl_locate(struct net *net, | |||
| 380 | if (ipv6_addr_equal(local, &t->parms.laddr) && | 380 | if (ipv6_addr_equal(local, &t->parms.laddr) && |
| 381 | ipv6_addr_equal(remote, &t->parms.raddr)) { | 381 | ipv6_addr_equal(remote, &t->parms.raddr)) { |
| 382 | if (create) | 382 | if (create) |
| 383 | return NULL; | 383 | return ERR_PTR(-EEXIST); |
| 384 | 384 | ||
| 385 | return t; | 385 | return t; |
| 386 | } | 386 | } |
| 387 | } | 387 | } |
| 388 | if (!create) | 388 | if (!create) |
| 389 | return NULL; | 389 | return ERR_PTR(-ENODEV); |
| 390 | return ip6_tnl_create(net, p); | 390 | return ip6_tnl_create(net, p); |
| 391 | } | 391 | } |
| 392 | 392 | ||
| @@ -1420,7 +1420,7 @@ ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1420 | } | 1420 | } |
| 1421 | ip6_tnl_parm_from_user(&p1, &p); | 1421 | ip6_tnl_parm_from_user(&p1, &p); |
| 1422 | t = ip6_tnl_locate(net, &p1, 0); | 1422 | t = ip6_tnl_locate(net, &p1, 0); |
| 1423 | if (t == NULL) | 1423 | if (IS_ERR(t)) |
| 1424 | t = netdev_priv(dev); | 1424 | t = netdev_priv(dev); |
| 1425 | } else { | 1425 | } else { |
| 1426 | memset(&p, 0, sizeof(p)); | 1426 | memset(&p, 0, sizeof(p)); |
| @@ -1445,7 +1445,7 @@ ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1445 | ip6_tnl_parm_from_user(&p1, &p); | 1445 | ip6_tnl_parm_from_user(&p1, &p); |
| 1446 | t = ip6_tnl_locate(net, &p1, cmd == SIOCADDTUNNEL); | 1446 | t = ip6_tnl_locate(net, &p1, cmd == SIOCADDTUNNEL); |
| 1447 | if (cmd == SIOCCHGTUNNEL) { | 1447 | if (cmd == SIOCCHGTUNNEL) { |
| 1448 | if (t != NULL) { | 1448 | if (!IS_ERR(t)) { |
| 1449 | if (t->dev != dev) { | 1449 | if (t->dev != dev) { |
| 1450 | err = -EEXIST; | 1450 | err = -EEXIST; |
| 1451 | break; | 1451 | break; |
| @@ -1457,14 +1457,15 @@ ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1457 | else | 1457 | else |
| 1458 | err = ip6_tnl_update(t, &p1); | 1458 | err = ip6_tnl_update(t, &p1); |
| 1459 | } | 1459 | } |
| 1460 | if (t) { | 1460 | if (!IS_ERR(t)) { |
| 1461 | err = 0; | 1461 | err = 0; |
| 1462 | ip6_tnl_parm_to_user(&p, &t->parms); | 1462 | ip6_tnl_parm_to_user(&p, &t->parms); |
| 1463 | if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p))) | 1463 | if (copy_to_user(ifr->ifr_ifru.ifru_data, &p, sizeof(p))) |
| 1464 | err = -EFAULT; | 1464 | err = -EFAULT; |
| 1465 | 1465 | ||
| 1466 | } else | 1466 | } else { |
| 1467 | err = (cmd == SIOCADDTUNNEL ? -ENOBUFS : -ENOENT); | 1467 | err = PTR_ERR(t); |
| 1468 | } | ||
| 1468 | break; | 1469 | break; |
| 1469 | case SIOCDELTUNNEL: | 1470 | case SIOCDELTUNNEL: |
| 1470 | err = -EPERM; | 1471 | err = -EPERM; |
| @@ -1478,7 +1479,7 @@ ip6_tnl_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 1478 | err = -ENOENT; | 1479 | err = -ENOENT; |
| 1479 | ip6_tnl_parm_from_user(&p1, &p); | 1480 | ip6_tnl_parm_from_user(&p1, &p); |
| 1480 | t = ip6_tnl_locate(net, &p1, 0); | 1481 | t = ip6_tnl_locate(net, &p1, 0); |
| 1481 | if (t == NULL) | 1482 | if (IS_ERR(t)) |
| 1482 | break; | 1483 | break; |
| 1483 | err = -EPERM; | 1484 | err = -EPERM; |
| 1484 | if (t->dev == ip6n->fb_tnl_dev) | 1485 | if (t->dev == ip6n->fb_tnl_dev) |
| @@ -1672,12 +1673,13 @@ static int ip6_tnl_newlink(struct net *src_net, struct net_device *dev, | |||
| 1672 | struct nlattr *tb[], struct nlattr *data[]) | 1673 | struct nlattr *tb[], struct nlattr *data[]) |
| 1673 | { | 1674 | { |
| 1674 | struct net *net = dev_net(dev); | 1675 | struct net *net = dev_net(dev); |
| 1675 | struct ip6_tnl *nt; | 1676 | struct ip6_tnl *nt, *t; |
| 1676 | 1677 | ||
| 1677 | nt = netdev_priv(dev); | 1678 | nt = netdev_priv(dev); |
| 1678 | ip6_tnl_netlink_parms(data, &nt->parms); | 1679 | ip6_tnl_netlink_parms(data, &nt->parms); |
| 1679 | 1680 | ||
| 1680 | if (ip6_tnl_locate(net, &nt->parms, 0)) | 1681 | t = ip6_tnl_locate(net, &nt->parms, 0); |
| 1682 | if (!IS_ERR(t)) | ||
| 1681 | return -EEXIST; | 1683 | return -EEXIST; |
| 1682 | 1684 | ||
| 1683 | return ip6_tnl_create2(dev); | 1685 | return ip6_tnl_create2(dev); |
| @@ -1697,8 +1699,7 @@ static int ip6_tnl_changelink(struct net_device *dev, struct nlattr *tb[], | |||
| 1697 | ip6_tnl_netlink_parms(data, &p); | 1699 | ip6_tnl_netlink_parms(data, &p); |
| 1698 | 1700 | ||
| 1699 | t = ip6_tnl_locate(net, &p, 0); | 1701 | t = ip6_tnl_locate(net, &p, 0); |
| 1700 | 1702 | if (!IS_ERR(t)) { | |
| 1701 | if (t) { | ||
| 1702 | if (t->dev != dev) | 1703 | if (t->dev != dev) |
| 1703 | return -EEXIST; | 1704 | return -EEXIST; |
| 1704 | } else | 1705 | } else |
diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c index ca3f29b98ae5..010f8bd2d577 100644 --- a/net/ipv6/xfrm6_output.c +++ b/net/ipv6/xfrm6_output.c | |||
| @@ -114,6 +114,7 @@ int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 114 | return err; | 114 | return err; |
| 115 | 115 | ||
| 116 | skb->ignore_df = 1; | 116 | skb->ignore_df = 1; |
| 117 | skb->protocol = htons(ETH_P_IPV6); | ||
| 117 | 118 | ||
| 118 | return x->outer_mode->output2(x, skb); | 119 | return x->outer_mode->output2(x, skb); |
| 119 | } | 120 | } |
| @@ -122,7 +123,6 @@ EXPORT_SYMBOL(xfrm6_prepare_output); | |||
| 122 | int xfrm6_output_finish(struct sk_buff *skb) | 123 | int xfrm6_output_finish(struct sk_buff *skb) |
| 123 | { | 124 | { |
| 124 | memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); | 125 | memset(IP6CB(skb), 0, sizeof(*IP6CB(skb))); |
| 125 | skb->protocol = htons(ETH_P_IPV6); | ||
| 126 | 126 | ||
| 127 | #ifdef CONFIG_NETFILTER | 127 | #ifdef CONFIG_NETFILTER |
| 128 | IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED; | 128 | IP6CB(skb)->flags |= IP6SKB_XFRM_TRANSFORMED; |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 48bf5a06847b..8d2d01b4800a 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
| @@ -200,6 +200,7 @@ _decode_session6(struct sk_buff *skb, struct flowi *fl, int reverse) | |||
| 200 | 200 | ||
| 201 | #if IS_ENABLED(CONFIG_IPV6_MIP6) | 201 | #if IS_ENABLED(CONFIG_IPV6_MIP6) |
| 202 | case IPPROTO_MH: | 202 | case IPPROTO_MH: |
| 203 | offset += ipv6_optlen(exthdr); | ||
| 203 | if (!onlyproto && pskb_may_pull(skb, nh + offset + 3 - skb->data)) { | 204 | if (!onlyproto && pskb_may_pull(skb, nh + offset + 3 - skb->data)) { |
| 204 | struct ip6_mh *mh; | 205 | struct ip6_mh *mh; |
| 205 | 206 | ||
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 3afe36824703..8d53d65bd2ab 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
| @@ -58,13 +58,24 @@ struct ieee80211_local; | |||
| 58 | #define IEEE80211_UNSET_POWER_LEVEL INT_MIN | 58 | #define IEEE80211_UNSET_POWER_LEVEL INT_MIN |
| 59 | 59 | ||
| 60 | /* | 60 | /* |
| 61 | * Some APs experience problems when working with U-APSD. Decrease the | 61 | * Some APs experience problems when working with U-APSD. Decreasing the |
| 62 | * probability of that happening by using legacy mode for all ACs but VO. | 62 | * probability of that happening by using legacy mode for all ACs but VO isn't |
| 63 | * The AP that caused us trouble was a Cisco 4410N. It ignores our | 63 | * enough. |
| 64 | * setting, and always treats non-VO ACs as legacy. | 64 | * |
| 65 | * Cisco 4410N originally forced us to enable VO by default only because it | ||
| 66 | * treated non-VO ACs as legacy. | ||
| 67 | * | ||
| 68 | * However some APs (notably Netgear R7000) silently reclassify packets to | ||
| 69 | * different ACs. Since u-APSD ACs require trigger frames for frame retrieval | ||
| 70 | * clients would never see some frames (e.g. ARP responses) or would fetch them | ||
| 71 | * accidentally after a long time. | ||
| 72 | * | ||
| 73 | * It makes little sense to enable u-APSD queues by default because it needs | ||
| 74 | * userspace applications to be aware of it to actually take advantage of the | ||
| 75 | * possible additional powersavings. Implicitly depending on driver autotrigger | ||
| 76 | * frame support doesn't make much sense. | ||
| 65 | */ | 77 | */ |
| 66 | #define IEEE80211_DEFAULT_UAPSD_QUEUES \ | 78 | #define IEEE80211_DEFAULT_UAPSD_QUEUES 0 |
| 67 | IEEE80211_WMM_IE_STA_QOSINFO_AC_VO | ||
| 68 | 79 | ||
| 69 | #define IEEE80211_DEFAULT_MAX_SP_LEN \ | 80 | #define IEEE80211_DEFAULT_MAX_SP_LEN \ |
| 70 | IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL | 81 | IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL |
| @@ -453,6 +464,7 @@ struct ieee80211_if_managed { | |||
| 453 | unsigned int flags; | 464 | unsigned int flags; |
| 454 | 465 | ||
| 455 | bool csa_waiting_bcn; | 466 | bool csa_waiting_bcn; |
| 467 | bool csa_ignored_same_chan; | ||
| 456 | 468 | ||
| 457 | bool beacon_crc_valid; | 469 | bool beacon_crc_valid; |
| 458 | u32 beacon_crc; | 470 | u32 beacon_crc; |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 10ac6324c1d0..142f66aece18 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -1150,6 +1150,17 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, | |||
| 1150 | return; | 1150 | return; |
| 1151 | } | 1151 | } |
| 1152 | 1152 | ||
| 1153 | if (cfg80211_chandef_identical(&csa_ie.chandef, | ||
| 1154 | &sdata->vif.bss_conf.chandef)) { | ||
| 1155 | if (ifmgd->csa_ignored_same_chan) | ||
| 1156 | return; | ||
| 1157 | sdata_info(sdata, | ||
| 1158 | "AP %pM tries to chanswitch to same channel, ignore\n", | ||
| 1159 | ifmgd->associated->bssid); | ||
| 1160 | ifmgd->csa_ignored_same_chan = true; | ||
| 1161 | return; | ||
| 1162 | } | ||
| 1163 | |||
| 1153 | mutex_lock(&local->mtx); | 1164 | mutex_lock(&local->mtx); |
| 1154 | mutex_lock(&local->chanctx_mtx); | 1165 | mutex_lock(&local->chanctx_mtx); |
| 1155 | conf = rcu_dereference_protected(sdata->vif.chanctx_conf, | 1166 | conf = rcu_dereference_protected(sdata->vif.chanctx_conf, |
| @@ -1210,6 +1221,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, | |||
| 1210 | sdata->vif.csa_active = true; | 1221 | sdata->vif.csa_active = true; |
| 1211 | sdata->csa_chandef = csa_ie.chandef; | 1222 | sdata->csa_chandef = csa_ie.chandef; |
| 1212 | sdata->csa_block_tx = csa_ie.mode; | 1223 | sdata->csa_block_tx = csa_ie.mode; |
| 1224 | ifmgd->csa_ignored_same_chan = false; | ||
| 1213 | 1225 | ||
| 1214 | if (sdata->csa_block_tx) | 1226 | if (sdata->csa_block_tx) |
| 1215 | ieee80211_stop_vif_queues(local, sdata, | 1227 | ieee80211_stop_vif_queues(local, sdata, |
| @@ -2090,6 +2102,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
| 2090 | 2102 | ||
| 2091 | sdata->vif.csa_active = false; | 2103 | sdata->vif.csa_active = false; |
| 2092 | ifmgd->csa_waiting_bcn = false; | 2104 | ifmgd->csa_waiting_bcn = false; |
| 2105 | ifmgd->csa_ignored_same_chan = false; | ||
| 2093 | if (sdata->csa_block_tx) { | 2106 | if (sdata->csa_block_tx) { |
| 2094 | ieee80211_wake_vif_queues(local, sdata, | 2107 | ieee80211_wake_vif_queues(local, sdata, |
| 2095 | IEEE80211_QUEUE_STOP_REASON_CSA); | 2108 | IEEE80211_QUEUE_STOP_REASON_CSA); |
| @@ -3204,7 +3217,8 @@ static const u64 care_about_ies = | |||
| 3204 | (1ULL << WLAN_EID_CHANNEL_SWITCH) | | 3217 | (1ULL << WLAN_EID_CHANNEL_SWITCH) | |
| 3205 | (1ULL << WLAN_EID_PWR_CONSTRAINT) | | 3218 | (1ULL << WLAN_EID_PWR_CONSTRAINT) | |
| 3206 | (1ULL << WLAN_EID_HT_CAPABILITY) | | 3219 | (1ULL << WLAN_EID_HT_CAPABILITY) | |
| 3207 | (1ULL << WLAN_EID_HT_OPERATION); | 3220 | (1ULL << WLAN_EID_HT_OPERATION) | |
| 3221 | (1ULL << WLAN_EID_EXT_CHANSWITCH_ANN); | ||
| 3208 | 3222 | ||
| 3209 | static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, | 3223 | static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, |
| 3210 | struct ieee80211_mgmt *mgmt, size_t len, | 3224 | struct ieee80211_mgmt *mgmt, size_t len, |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 1101563357ea..944bdc04e913 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
| @@ -2214,6 +2214,9 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | |||
| 2214 | hdr = (struct ieee80211_hdr *) skb->data; | 2214 | hdr = (struct ieee80211_hdr *) skb->data; |
| 2215 | mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); | 2215 | mesh_hdr = (struct ieee80211s_hdr *) (skb->data + hdrlen); |
| 2216 | 2216 | ||
| 2217 | if (ieee80211_drop_unencrypted(rx, hdr->frame_control)) | ||
| 2218 | return RX_DROP_MONITOR; | ||
| 2219 | |||
| 2217 | /* frame is in RMC, don't forward */ | 2220 | /* frame is in RMC, don't forward */ |
| 2218 | if (ieee80211_is_data(hdr->frame_control) && | 2221 | if (ieee80211_is_data(hdr->frame_control) && |
| 2219 | is_multicast_ether_addr(hdr->addr1) && | 2222 | is_multicast_ether_addr(hdr->addr1) && |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 8428f4a95479..747bdcf72e92 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
| @@ -3178,7 +3178,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, | |||
| 3178 | wdev_iter = &sdata_iter->wdev; | 3178 | wdev_iter = &sdata_iter->wdev; |
| 3179 | 3179 | ||
| 3180 | if (sdata_iter == sdata || | 3180 | if (sdata_iter == sdata || |
| 3181 | rcu_access_pointer(sdata_iter->vif.chanctx_conf) == NULL || | 3181 | !ieee80211_sdata_running(sdata_iter) || |
| 3182 | local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype)) | 3182 | local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype)) |
| 3183 | continue; | 3183 | continue; |
| 3184 | 3184 | ||
diff --git a/net/rds/iw_rdma.c b/net/rds/iw_rdma.c index a817705ce2d0..dba8d0864f18 100644 --- a/net/rds/iw_rdma.c +++ b/net/rds/iw_rdma.c | |||
| @@ -88,7 +88,9 @@ static unsigned int rds_iw_unmap_fastreg_list(struct rds_iw_mr_pool *pool, | |||
| 88 | int *unpinned); | 88 | int *unpinned); |
| 89 | static void rds_iw_destroy_fastreg(struct rds_iw_mr_pool *pool, struct rds_iw_mr *ibmr); | 89 | static void rds_iw_destroy_fastreg(struct rds_iw_mr_pool *pool, struct rds_iw_mr *ibmr); |
| 90 | 90 | ||
| 91 | static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwdev, struct rdma_cm_id **cm_id) | 91 | static int rds_iw_get_device(struct sockaddr_in *src, struct sockaddr_in *dst, |
| 92 | struct rds_iw_device **rds_iwdev, | ||
| 93 | struct rdma_cm_id **cm_id) | ||
| 92 | { | 94 | { |
| 93 | struct rds_iw_device *iwdev; | 95 | struct rds_iw_device *iwdev; |
| 94 | struct rds_iw_cm_id *i_cm_id; | 96 | struct rds_iw_cm_id *i_cm_id; |
| @@ -112,15 +114,15 @@ static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwd | |||
| 112 | src_addr->sin_port, | 114 | src_addr->sin_port, |
| 113 | dst_addr->sin_addr.s_addr, | 115 | dst_addr->sin_addr.s_addr, |
| 114 | dst_addr->sin_port, | 116 | dst_addr->sin_port, |
| 115 | rs->rs_bound_addr, | 117 | src->sin_addr.s_addr, |
| 116 | rs->rs_bound_port, | 118 | src->sin_port, |
| 117 | rs->rs_conn_addr, | 119 | dst->sin_addr.s_addr, |
| 118 | rs->rs_conn_port); | 120 | dst->sin_port); |
| 119 | #ifdef WORKING_TUPLE_DETECTION | 121 | #ifdef WORKING_TUPLE_DETECTION |
| 120 | if (src_addr->sin_addr.s_addr == rs->rs_bound_addr && | 122 | if (src_addr->sin_addr.s_addr == src->sin_addr.s_addr && |
| 121 | src_addr->sin_port == rs->rs_bound_port && | 123 | src_addr->sin_port == src->sin_port && |
| 122 | dst_addr->sin_addr.s_addr == rs->rs_conn_addr && | 124 | dst_addr->sin_addr.s_addr == dst->sin_addr.s_addr && |
| 123 | dst_addr->sin_port == rs->rs_conn_port) { | 125 | dst_addr->sin_port == dst->sin_port) { |
| 124 | #else | 126 | #else |
| 125 | /* FIXME - needs to compare the local and remote | 127 | /* FIXME - needs to compare the local and remote |
| 126 | * ipaddr/port tuple, but the ipaddr is the only | 128 | * ipaddr/port tuple, but the ipaddr is the only |
| @@ -128,7 +130,7 @@ static int rds_iw_get_device(struct rds_sock *rs, struct rds_iw_device **rds_iwd | |||
| 128 | * zero'ed. It doesn't appear to be properly populated | 130 | * zero'ed. It doesn't appear to be properly populated |
| 129 | * during connection setup... | 131 | * during connection setup... |
| 130 | */ | 132 | */ |
| 131 | if (src_addr->sin_addr.s_addr == rs->rs_bound_addr) { | 133 | if (src_addr->sin_addr.s_addr == src->sin_addr.s_addr) { |
| 132 | #endif | 134 | #endif |
| 133 | spin_unlock_irq(&iwdev->spinlock); | 135 | spin_unlock_irq(&iwdev->spinlock); |
| 134 | *rds_iwdev = iwdev; | 136 | *rds_iwdev = iwdev; |
| @@ -180,19 +182,13 @@ int rds_iw_update_cm_id(struct rds_iw_device *rds_iwdev, struct rdma_cm_id *cm_i | |||
| 180 | { | 182 | { |
| 181 | struct sockaddr_in *src_addr, *dst_addr; | 183 | struct sockaddr_in *src_addr, *dst_addr; |
| 182 | struct rds_iw_device *rds_iwdev_old; | 184 | struct rds_iw_device *rds_iwdev_old; |
| 183 | struct rds_sock rs; | ||
| 184 | struct rdma_cm_id *pcm_id; | 185 | struct rdma_cm_id *pcm_id; |
| 185 | int rc; | 186 | int rc; |
| 186 | 187 | ||
| 187 | src_addr = (struct sockaddr_in *)&cm_id->route.addr.src_addr; | 188 | src_addr = (struct sockaddr_in *)&cm_id->route.addr.src_addr; |
| 188 | dst_addr = (struct sockaddr_in *)&cm_id->route.addr.dst_addr; | 189 | dst_addr = (struct sockaddr_in *)&cm_id->route.addr.dst_addr; |
| 189 | 190 | ||
| 190 | rs.rs_bound_addr = src_addr->sin_addr.s_addr; | 191 | rc = rds_iw_get_device(src_addr, dst_addr, &rds_iwdev_old, &pcm_id); |
| 191 | rs.rs_bound_port = src_addr->sin_port; | ||
| 192 | rs.rs_conn_addr = dst_addr->sin_addr.s_addr; | ||
| 193 | rs.rs_conn_port = dst_addr->sin_port; | ||
| 194 | |||
| 195 | rc = rds_iw_get_device(&rs, &rds_iwdev_old, &pcm_id); | ||
| 196 | if (rc) | 192 | if (rc) |
| 197 | rds_iw_remove_cm_id(rds_iwdev, cm_id); | 193 | rds_iw_remove_cm_id(rds_iwdev, cm_id); |
| 198 | 194 | ||
| @@ -598,9 +594,17 @@ void *rds_iw_get_mr(struct scatterlist *sg, unsigned long nents, | |||
| 598 | struct rds_iw_device *rds_iwdev; | 594 | struct rds_iw_device *rds_iwdev; |
| 599 | struct rds_iw_mr *ibmr = NULL; | 595 | struct rds_iw_mr *ibmr = NULL; |
| 600 | struct rdma_cm_id *cm_id; | 596 | struct rdma_cm_id *cm_id; |
| 597 | struct sockaddr_in src = { | ||
| 598 | .sin_addr.s_addr = rs->rs_bound_addr, | ||
| 599 | .sin_port = rs->rs_bound_port, | ||
| 600 | }; | ||
| 601 | struct sockaddr_in dst = { | ||
| 602 | .sin_addr.s_addr = rs->rs_conn_addr, | ||
| 603 | .sin_port = rs->rs_conn_port, | ||
| 604 | }; | ||
| 601 | int ret; | 605 | int ret; |
| 602 | 606 | ||
| 603 | ret = rds_iw_get_device(rs, &rds_iwdev, &cm_id); | 607 | ret = rds_iw_get_device(&src, &dst, &rds_iwdev, &cm_id); |
| 604 | if (ret || !cm_id) { | 608 | if (ret || !cm_id) { |
| 605 | ret = -ENODEV; | 609 | ret = -ENODEV; |
| 606 | goto out; | 610 | goto out; |
diff --git a/net/rxrpc/ar-recvmsg.c b/net/rxrpc/ar-recvmsg.c index 4575485ad1b4..19a560626dc4 100644 --- a/net/rxrpc/ar-recvmsg.c +++ b/net/rxrpc/ar-recvmsg.c | |||
| @@ -87,7 +87,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 87 | if (!skb) { | 87 | if (!skb) { |
| 88 | /* nothing remains on the queue */ | 88 | /* nothing remains on the queue */ |
| 89 | if (copied && | 89 | if (copied && |
| 90 | (msg->msg_flags & MSG_PEEK || timeo == 0)) | 90 | (flags & MSG_PEEK || timeo == 0)) |
| 91 | goto out; | 91 | goto out; |
| 92 | 92 | ||
| 93 | /* wait for a message to turn up */ | 93 | /* wait for a message to turn up */ |
diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c index 82c5d7fc1988..5f6288fa3f12 100644 --- a/net/sched/act_bpf.c +++ b/net/sched/act_bpf.c | |||
| @@ -25,21 +25,41 @@ static int tcf_bpf(struct sk_buff *skb, const struct tc_action *a, | |||
| 25 | struct tcf_result *res) | 25 | struct tcf_result *res) |
| 26 | { | 26 | { |
| 27 | struct tcf_bpf *b = a->priv; | 27 | struct tcf_bpf *b = a->priv; |
| 28 | int action; | 28 | int action, filter_res; |
| 29 | int filter_res; | ||
| 30 | 29 | ||
| 31 | spin_lock(&b->tcf_lock); | 30 | spin_lock(&b->tcf_lock); |
| 31 | |||
| 32 | b->tcf_tm.lastuse = jiffies; | 32 | b->tcf_tm.lastuse = jiffies; |
| 33 | bstats_update(&b->tcf_bstats, skb); | 33 | bstats_update(&b->tcf_bstats, skb); |
| 34 | action = b->tcf_action; | ||
| 35 | 34 | ||
| 36 | filter_res = BPF_PROG_RUN(b->filter, skb); | 35 | filter_res = BPF_PROG_RUN(b->filter, skb); |
| 37 | if (filter_res == 0) { | 36 | |
| 38 | /* Return code 0 from the BPF program | 37 | /* A BPF program may overwrite the default action opcode. |
| 39 | * is being interpreted as a drop here. | 38 | * Similarly as in cls_bpf, if filter_res == -1 we use the |
| 40 | */ | 39 | * default action specified from tc. |
| 41 | action = TC_ACT_SHOT; | 40 | * |
| 41 | * In case a different well-known TC_ACT opcode has been | ||
| 42 | * returned, it will overwrite the default one. | ||
| 43 | * | ||
| 44 | * For everything else that is unkown, TC_ACT_UNSPEC is | ||
| 45 | * returned. | ||
| 46 | */ | ||
| 47 | switch (filter_res) { | ||
| 48 | case TC_ACT_PIPE: | ||
| 49 | case TC_ACT_RECLASSIFY: | ||
| 50 | case TC_ACT_OK: | ||
| 51 | action = filter_res; | ||
| 52 | break; | ||
| 53 | case TC_ACT_SHOT: | ||
| 54 | action = filter_res; | ||
| 42 | b->tcf_qstats.drops++; | 55 | b->tcf_qstats.drops++; |
| 56 | break; | ||
| 57 | case TC_ACT_UNSPEC: | ||
| 58 | action = b->tcf_action; | ||
| 59 | break; | ||
| 60 | default: | ||
| 61 | action = TC_ACT_UNSPEC; | ||
| 62 | break; | ||
| 43 | } | 63 | } |
| 44 | 64 | ||
| 45 | spin_unlock(&b->tcf_lock); | 65 | spin_unlock(&b->tcf_lock); |
diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c index 09487afbfd51..95fdf4e40051 100644 --- a/net/sched/cls_u32.c +++ b/net/sched/cls_u32.c | |||
| @@ -78,8 +78,11 @@ struct tc_u_hnode { | |||
| 78 | struct tc_u_common *tp_c; | 78 | struct tc_u_common *tp_c; |
| 79 | int refcnt; | 79 | int refcnt; |
| 80 | unsigned int divisor; | 80 | unsigned int divisor; |
| 81 | struct tc_u_knode __rcu *ht[1]; | ||
| 82 | struct rcu_head rcu; | 81 | struct rcu_head rcu; |
| 82 | /* The 'ht' field MUST be the last field in structure to allow for | ||
| 83 | * more entries allocated at end of structure. | ||
| 84 | */ | ||
| 85 | struct tc_u_knode __rcu *ht[1]; | ||
| 83 | }; | 86 | }; |
| 84 | 87 | ||
| 85 | struct tc_u_common { | 88 | struct tc_u_common { |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index be2501538011..b6f84f6a2a09 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -4400,6 +4400,16 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) | |||
| 4400 | if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) | 4400 | if (parse_station_flags(info, dev->ieee80211_ptr->iftype, ¶ms)) |
| 4401 | return -EINVAL; | 4401 | return -EINVAL; |
| 4402 | 4402 | ||
| 4403 | /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT | ||
| 4404 | * as userspace might just pass through the capabilities from the IEs | ||
| 4405 | * directly, rather than enforcing this restriction and returning an | ||
| 4406 | * error in this case. | ||
| 4407 | */ | ||
| 4408 | if (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_WME))) { | ||
| 4409 | params.ht_capa = NULL; | ||
| 4410 | params.vht_capa = NULL; | ||
| 4411 | } | ||
| 4412 | |||
| 4403 | /* When you run into this, adjust the code below for the new flag */ | 4413 | /* When you run into this, adjust the code below for the new flag */ |
| 4404 | BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); | 4414 | BUILD_BUG_ON(NL80211_STA_FLAG_MAX != 7); |
| 4405 | 4415 | ||
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index cee479bc655c..638af0655aaf 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -2269,11 +2269,9 @@ struct dst_entry *xfrm_lookup(struct net *net, struct dst_entry *dst_orig, | |||
| 2269 | * have the xfrm_state's. We need to wait for KM to | 2269 | * have the xfrm_state's. We need to wait for KM to |
| 2270 | * negotiate new SA's or bail out with error.*/ | 2270 | * negotiate new SA's or bail out with error.*/ |
| 2271 | if (net->xfrm.sysctl_larval_drop) { | 2271 | if (net->xfrm.sysctl_larval_drop) { |
| 2272 | dst_release(dst); | ||
| 2273 | xfrm_pols_put(pols, drop_pols); | ||
| 2274 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTNOSTATES); | 2272 | XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTNOSTATES); |
| 2275 | 2273 | err = -EREMOTE; | |
| 2276 | return ERR_PTR(-EREMOTE); | 2274 | goto error; |
| 2277 | } | 2275 | } |
| 2278 | 2276 | ||
| 2279 | err = -EAGAIN; | 2277 | err = -EAGAIN; |
| @@ -2324,7 +2322,8 @@ nopol: | |||
| 2324 | error: | 2322 | error: |
| 2325 | dst_release(dst); | 2323 | dst_release(dst); |
| 2326 | dropdst: | 2324 | dropdst: |
| 2327 | dst_release(dst_orig); | 2325 | if (!(flags & XFRM_LOOKUP_KEEP_DST_REF)) |
| 2326 | dst_release(dst_orig); | ||
| 2328 | xfrm_pols_put(pols, drop_pols); | 2327 | xfrm_pols_put(pols, drop_pols); |
| 2329 | return ERR_PTR(err); | 2328 | return ERR_PTR(err); |
| 2330 | } | 2329 | } |
| @@ -2338,7 +2337,8 @@ struct dst_entry *xfrm_lookup_route(struct net *net, struct dst_entry *dst_orig, | |||
| 2338 | struct sock *sk, int flags) | 2337 | struct sock *sk, int flags) |
| 2339 | { | 2338 | { |
| 2340 | struct dst_entry *dst = xfrm_lookup(net, dst_orig, fl, sk, | 2339 | struct dst_entry *dst = xfrm_lookup(net, dst_orig, fl, sk, |
| 2341 | flags | XFRM_LOOKUP_QUEUE); | 2340 | flags | XFRM_LOOKUP_QUEUE | |
| 2341 | XFRM_LOOKUP_KEEP_DST_REF); | ||
| 2342 | 2342 | ||
| 2343 | if (IS_ERR(dst) && PTR_ERR(dst) == -EREMOTE) | 2343 | if (IS_ERR(dst) && PTR_ERR(dst) == -EREMOTE) |
| 2344 | return make_blackhole(net, dst_orig->ops->family, dst_orig); | 2344 | return make_blackhole(net, dst_orig->ops->family, dst_orig); |
