diff options
Diffstat (limited to 'net')
87 files changed, 806 insertions, 526 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index 240ed70912d6..d78938e3e008 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
@@ -277,17 +277,23 @@ static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv) | |||
277 | * batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached | 277 | * batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached |
278 | * @buff_pos: current position in the skb | 278 | * @buff_pos: current position in the skb |
279 | * @packet_len: total length of the skb | 279 | * @packet_len: total length of the skb |
280 | * @tvlv_len: tvlv length of the previously considered OGM | 280 | * @ogm_packet: potential OGM in buffer |
281 | * | 281 | * |
282 | * Return: true if there is enough space for another OGM, false otherwise. | 282 | * Return: true if there is enough space for another OGM, false otherwise. |
283 | */ | 283 | */ |
284 | static bool batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, | 284 | static bool |
285 | __be16 tvlv_len) | 285 | batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
286 | const struct batadv_ogm_packet *ogm_packet) | ||
286 | { | 287 | { |
287 | int next_buff_pos = 0; | 288 | int next_buff_pos = 0; |
288 | 289 | ||
289 | next_buff_pos += buff_pos + BATADV_OGM_HLEN; | 290 | /* check if there is enough space for the header */ |
290 | next_buff_pos += ntohs(tvlv_len); | 291 | next_buff_pos += buff_pos + sizeof(*ogm_packet); |
292 | if (next_buff_pos > packet_len) | ||
293 | return false; | ||
294 | |||
295 | /* check if there is enough space for the optional TVLV */ | ||
296 | next_buff_pos += ntohs(ogm_packet->tvlv_len); | ||
291 | 297 | ||
292 | return (next_buff_pos <= packet_len) && | 298 | return (next_buff_pos <= packet_len) && |
293 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); | 299 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); |
@@ -315,7 +321,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
315 | 321 | ||
316 | /* adjust all flags and log packets */ | 322 | /* adjust all flags and log packets */ |
317 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, | 323 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, |
318 | batadv_ogm_packet->tvlv_len)) { | 324 | batadv_ogm_packet)) { |
319 | /* we might have aggregated direct link packets with an | 325 | /* we might have aggregated direct link packets with an |
320 | * ordinary base packet | 326 | * ordinary base packet |
321 | */ | 327 | */ |
@@ -1704,7 +1710,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
1704 | 1710 | ||
1705 | /* unpack the aggregated packets and process them one by one */ | 1711 | /* unpack the aggregated packets and process them one by one */ |
1706 | while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb), | 1712 | while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb), |
1707 | ogm_packet->tvlv_len)) { | 1713 | ogm_packet)) { |
1708 | batadv_iv_ogm_process(skb, ogm_offset, if_incoming); | 1714 | batadv_iv_ogm_process(skb, ogm_offset, if_incoming); |
1709 | 1715 | ||
1710 | ogm_offset += BATADV_OGM_HLEN; | 1716 | ogm_offset += BATADV_OGM_HLEN; |
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c index fad95ef64e01..bc06e3cdfa84 100644 --- a/net/batman-adv/bat_v_ogm.c +++ b/net/batman-adv/bat_v_ogm.c | |||
@@ -631,17 +631,23 @@ batadv_v_ogm_process_per_outif(struct batadv_priv *bat_priv, | |||
631 | * batadv_v_ogm_aggr_packet() - checks if there is another OGM aggregated | 631 | * batadv_v_ogm_aggr_packet() - checks if there is another OGM aggregated |
632 | * @buff_pos: current position in the skb | 632 | * @buff_pos: current position in the skb |
633 | * @packet_len: total length of the skb | 633 | * @packet_len: total length of the skb |
634 | * @tvlv_len: tvlv length of the previously considered OGM | 634 | * @ogm2_packet: potential OGM2 in buffer |
635 | * | 635 | * |
636 | * Return: true if there is enough space for another OGM, false otherwise. | 636 | * Return: true if there is enough space for another OGM, false otherwise. |
637 | */ | 637 | */ |
638 | static bool batadv_v_ogm_aggr_packet(int buff_pos, int packet_len, | 638 | static bool |
639 | __be16 tvlv_len) | 639 | batadv_v_ogm_aggr_packet(int buff_pos, int packet_len, |
640 | const struct batadv_ogm2_packet *ogm2_packet) | ||
640 | { | 641 | { |
641 | int next_buff_pos = 0; | 642 | int next_buff_pos = 0; |
642 | 643 | ||
643 | next_buff_pos += buff_pos + BATADV_OGM2_HLEN; | 644 | /* check if there is enough space for the header */ |
644 | next_buff_pos += ntohs(tvlv_len); | 645 | next_buff_pos += buff_pos + sizeof(*ogm2_packet); |
646 | if (next_buff_pos > packet_len) | ||
647 | return false; | ||
648 | |||
649 | /* check if there is enough space for the optional TVLV */ | ||
650 | next_buff_pos += ntohs(ogm2_packet->tvlv_len); | ||
645 | 651 | ||
646 | return (next_buff_pos <= packet_len) && | 652 | return (next_buff_pos <= packet_len) && |
647 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); | 653 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); |
@@ -818,7 +824,7 @@ int batadv_v_ogm_packet_recv(struct sk_buff *skb, | |||
818 | ogm_packet = (struct batadv_ogm2_packet *)skb->data; | 824 | ogm_packet = (struct batadv_ogm2_packet *)skb->data; |
819 | 825 | ||
820 | while (batadv_v_ogm_aggr_packet(ogm_offset, skb_headlen(skb), | 826 | while (batadv_v_ogm_aggr_packet(ogm_offset, skb_headlen(skb), |
821 | ogm_packet->tvlv_len)) { | 827 | ogm_packet)) { |
822 | batadv_v_ogm_process(skb, ogm_offset, if_incoming); | 828 | batadv_v_ogm_process(skb, ogm_offset, if_incoming); |
823 | 829 | ||
824 | ogm_offset += BATADV_OGM2_HLEN; | 830 | ogm_offset += BATADV_OGM2_HLEN; |
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c index 6f08fd122a8d..7e052d6f759b 100644 --- a/net/batman-adv/netlink.c +++ b/net/batman-adv/netlink.c | |||
@@ -164,7 +164,7 @@ batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype) | |||
164 | { | 164 | { |
165 | struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype); | 165 | struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype); |
166 | 166 | ||
167 | return attr ? nla_get_u32(attr) : 0; | 167 | return (attr && nla_len(attr) == sizeof(u32)) ? nla_get_u32(attr) : 0; |
168 | } | 168 | } |
169 | 169 | ||
170 | /** | 170 | /** |
diff --git a/net/bridge/netfilter/ebtables.c b/net/bridge/netfilter/ebtables.c index c8177a89f52c..4096d8a74a2b 100644 --- a/net/bridge/netfilter/ebtables.c +++ b/net/bridge/netfilter/ebtables.c | |||
@@ -221,7 +221,7 @@ unsigned int ebt_do_table(struct sk_buff *skb, | |||
221 | return NF_DROP; | 221 | return NF_DROP; |
222 | } | 222 | } |
223 | 223 | ||
224 | ADD_COUNTER(*(counter_base + i), 1, skb->len); | 224 | ADD_COUNTER(*(counter_base + i), skb->len, 1); |
225 | 225 | ||
226 | /* these should only watch: not modify, nor tell us | 226 | /* these should only watch: not modify, nor tell us |
227 | * what to do with the packet | 227 | * what to do with the packet |
@@ -959,8 +959,8 @@ static void get_counters(const struct ebt_counter *oldcounters, | |||
959 | continue; | 959 | continue; |
960 | counter_base = COUNTER_BASE(oldcounters, nentries, cpu); | 960 | counter_base = COUNTER_BASE(oldcounters, nentries, cpu); |
961 | for (i = 0; i < nentries; i++) | 961 | for (i = 0; i < nentries; i++) |
962 | ADD_COUNTER(counters[i], counter_base[i].pcnt, | 962 | ADD_COUNTER(counters[i], counter_base[i].bcnt, |
963 | counter_base[i].bcnt); | 963 | counter_base[i].pcnt); |
964 | } | 964 | } |
965 | } | 965 | } |
966 | 966 | ||
@@ -1280,7 +1280,7 @@ static int do_update_counters(struct net *net, const char *name, | |||
1280 | 1280 | ||
1281 | /* we add to the counters of the first cpu */ | 1281 | /* we add to the counters of the first cpu */ |
1282 | for (i = 0; i < num_counters; i++) | 1282 | for (i = 0; i < num_counters; i++) |
1283 | ADD_COUNTER(t->private->counters[i], tmp[i].pcnt, tmp[i].bcnt); | 1283 | ADD_COUNTER(t->private->counters[i], tmp[i].bcnt, tmp[i].pcnt); |
1284 | 1284 | ||
1285 | write_unlock_bh(&t->lock); | 1285 | write_unlock_bh(&t->lock); |
1286 | ret = 0; | 1286 | ret = 0; |
diff --git a/net/bridge/netfilter/nft_meta_bridge.c b/net/bridge/netfilter/nft_meta_bridge.c index 1804e867f715..7c9e92b2f806 100644 --- a/net/bridge/netfilter/nft_meta_bridge.c +++ b/net/bridge/netfilter/nft_meta_bridge.c | |||
@@ -53,7 +53,7 @@ static void nft_meta_bridge_get_eval(const struct nft_expr *expr, | |||
53 | goto err; | 53 | goto err; |
54 | 54 | ||
55 | br_vlan_get_proto(br_dev, &p_proto); | 55 | br_vlan_get_proto(br_dev, &p_proto); |
56 | nft_reg_store16(dest, p_proto); | 56 | nft_reg_store16(dest, htons(p_proto)); |
57 | return; | 57 | return; |
58 | } | 58 | } |
59 | default: | 59 | default: |
diff --git a/net/ceph/crypto.c b/net/ceph/crypto.c index 5d6724cee38f..4f75df40fb12 100644 --- a/net/ceph/crypto.c +++ b/net/ceph/crypto.c | |||
@@ -136,8 +136,10 @@ void ceph_crypto_key_destroy(struct ceph_crypto_key *key) | |||
136 | if (key) { | 136 | if (key) { |
137 | kfree(key->key); | 137 | kfree(key->key); |
138 | key->key = NULL; | 138 | key->key = NULL; |
139 | crypto_free_sync_skcipher(key->tfm); | 139 | if (key->tfm) { |
140 | key->tfm = NULL; | 140 | crypto_free_sync_skcipher(key->tfm); |
141 | key->tfm = NULL; | ||
142 | } | ||
141 | } | 143 | } |
142 | } | 144 | } |
143 | 145 | ||
diff --git a/net/core/filter.c b/net/core/filter.c index 7878f918b8c0..4c6a252d4212 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -8757,13 +8757,13 @@ sk_reuseport_is_valid_access(int off, int size, | |||
8757 | return size == size_default; | 8757 | return size == size_default; |
8758 | 8758 | ||
8759 | /* Fields that allow narrowing */ | 8759 | /* Fields that allow narrowing */ |
8760 | case offsetof(struct sk_reuseport_md, eth_protocol): | 8760 | case bpf_ctx_range(struct sk_reuseport_md, eth_protocol): |
8761 | if (size < FIELD_SIZEOF(struct sk_buff, protocol)) | 8761 | if (size < FIELD_SIZEOF(struct sk_buff, protocol)) |
8762 | return false; | 8762 | return false; |
8763 | /* fall through */ | 8763 | /* fall through */ |
8764 | case offsetof(struct sk_reuseport_md, ip_protocol): | 8764 | case bpf_ctx_range(struct sk_reuseport_md, ip_protocol): |
8765 | case offsetof(struct sk_reuseport_md, bind_inany): | 8765 | case bpf_ctx_range(struct sk_reuseport_md, bind_inany): |
8766 | case offsetof(struct sk_reuseport_md, len): | 8766 | case bpf_ctx_range(struct sk_reuseport_md, len): |
8767 | bpf_ctx_record_field_size(info, size_default); | 8767 | bpf_ctx_record_field_size(info, size_default); |
8768 | return bpf_ctx_narrow_access_ok(off, size, size_default); | 8768 | return bpf_ctx_narrow_access_ok(off, size, size_default); |
8769 | 8769 | ||
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 3e6fedb57bc1..2470b4b404e6 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -142,8 +142,8 @@ int skb_flow_dissector_bpf_prog_detach(const union bpf_attr *attr) | |||
142 | mutex_unlock(&flow_dissector_mutex); | 142 | mutex_unlock(&flow_dissector_mutex); |
143 | return -ENOENT; | 143 | return -ENOENT; |
144 | } | 144 | } |
145 | bpf_prog_put(attached); | ||
146 | RCU_INIT_POINTER(net->flow_dissector_prog, NULL); | 145 | RCU_INIT_POINTER(net->flow_dissector_prog, NULL); |
146 | bpf_prog_put(attached); | ||
147 | mutex_unlock(&flow_dissector_mutex); | 147 | mutex_unlock(&flow_dissector_mutex); |
148 | return 0; | 148 | return 0; |
149 | } | 149 | } |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 2cf27da1baeb..849380a622ef 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -122,7 +122,7 @@ static void queue_process(struct work_struct *work) | |||
122 | txq = netdev_get_tx_queue(dev, q_index); | 122 | txq = netdev_get_tx_queue(dev, q_index); |
123 | HARD_TX_LOCK(dev, txq, smp_processor_id()); | 123 | HARD_TX_LOCK(dev, txq, smp_processor_id()); |
124 | if (netif_xmit_frozen_or_stopped(txq) || | 124 | if (netif_xmit_frozen_or_stopped(txq) || |
125 | netpoll_start_xmit(skb, dev, txq) != NETDEV_TX_OK) { | 125 | !dev_xmit_complete(netpoll_start_xmit(skb, dev, txq))) { |
126 | skb_queue_head(&npinfo->txq, skb); | 126 | skb_queue_head(&npinfo->txq, skb); |
127 | HARD_TX_UNLOCK(dev, txq); | 127 | HARD_TX_UNLOCK(dev, txq); |
128 | local_irq_restore(flags); | 128 | local_irq_restore(flags); |
@@ -335,7 +335,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
335 | 335 | ||
336 | HARD_TX_UNLOCK(dev, txq); | 336 | HARD_TX_UNLOCK(dev, txq); |
337 | 337 | ||
338 | if (status == NETDEV_TX_OK) | 338 | if (dev_xmit_complete(status)) |
339 | break; | 339 | break; |
340 | 340 | ||
341 | } | 341 | } |
@@ -352,7 +352,7 @@ void netpoll_send_skb_on_dev(struct netpoll *np, struct sk_buff *skb, | |||
352 | 352 | ||
353 | } | 353 | } |
354 | 354 | ||
355 | if (status != NETDEV_TX_OK) { | 355 | if (!dev_xmit_complete(status)) { |
356 | skb_queue_tail(&npinfo->txq, skb); | 356 | skb_queue_tail(&npinfo->txq, skb); |
357 | schedule_delayed_work(&npinfo->tx_work,0); | 357 | schedule_delayed_work(&npinfo->tx_work,0); |
358 | } | 358 | } |
diff --git a/net/core/sock.c b/net/core/sock.c index 6d08553f885c..545fac19a711 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -3287,16 +3287,17 @@ static __init int net_inuse_init(void) | |||
3287 | 3287 | ||
3288 | core_initcall(net_inuse_init); | 3288 | core_initcall(net_inuse_init); |
3289 | 3289 | ||
3290 | static void assign_proto_idx(struct proto *prot) | 3290 | static int assign_proto_idx(struct proto *prot) |
3291 | { | 3291 | { |
3292 | prot->inuse_idx = find_first_zero_bit(proto_inuse_idx, PROTO_INUSE_NR); | 3292 | prot->inuse_idx = find_first_zero_bit(proto_inuse_idx, PROTO_INUSE_NR); |
3293 | 3293 | ||
3294 | if (unlikely(prot->inuse_idx == PROTO_INUSE_NR - 1)) { | 3294 | if (unlikely(prot->inuse_idx == PROTO_INUSE_NR - 1)) { |
3295 | pr_err("PROTO_INUSE_NR exhausted\n"); | 3295 | pr_err("PROTO_INUSE_NR exhausted\n"); |
3296 | return; | 3296 | return -ENOSPC; |
3297 | } | 3297 | } |
3298 | 3298 | ||
3299 | set_bit(prot->inuse_idx, proto_inuse_idx); | 3299 | set_bit(prot->inuse_idx, proto_inuse_idx); |
3300 | return 0; | ||
3300 | } | 3301 | } |
3301 | 3302 | ||
3302 | static void release_proto_idx(struct proto *prot) | 3303 | static void release_proto_idx(struct proto *prot) |
@@ -3305,8 +3306,9 @@ static void release_proto_idx(struct proto *prot) | |||
3305 | clear_bit(prot->inuse_idx, proto_inuse_idx); | 3306 | clear_bit(prot->inuse_idx, proto_inuse_idx); |
3306 | } | 3307 | } |
3307 | #else | 3308 | #else |
3308 | static inline void assign_proto_idx(struct proto *prot) | 3309 | static inline int assign_proto_idx(struct proto *prot) |
3309 | { | 3310 | { |
3311 | return 0; | ||
3310 | } | 3312 | } |
3311 | 3313 | ||
3312 | static inline void release_proto_idx(struct proto *prot) | 3314 | static inline void release_proto_idx(struct proto *prot) |
@@ -3355,6 +3357,8 @@ static int req_prot_init(const struct proto *prot) | |||
3355 | 3357 | ||
3356 | int proto_register(struct proto *prot, int alloc_slab) | 3358 | int proto_register(struct proto *prot, int alloc_slab) |
3357 | { | 3359 | { |
3360 | int ret = -ENOBUFS; | ||
3361 | |||
3358 | if (alloc_slab) { | 3362 | if (alloc_slab) { |
3359 | prot->slab = kmem_cache_create_usercopy(prot->name, | 3363 | prot->slab = kmem_cache_create_usercopy(prot->name, |
3360 | prot->obj_size, 0, | 3364 | prot->obj_size, 0, |
@@ -3391,20 +3395,27 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
3391 | } | 3395 | } |
3392 | 3396 | ||
3393 | mutex_lock(&proto_list_mutex); | 3397 | mutex_lock(&proto_list_mutex); |
3398 | ret = assign_proto_idx(prot); | ||
3399 | if (ret) { | ||
3400 | mutex_unlock(&proto_list_mutex); | ||
3401 | goto out_free_timewait_sock_slab_name; | ||
3402 | } | ||
3394 | list_add(&prot->node, &proto_list); | 3403 | list_add(&prot->node, &proto_list); |
3395 | assign_proto_idx(prot); | ||
3396 | mutex_unlock(&proto_list_mutex); | 3404 | mutex_unlock(&proto_list_mutex); |
3397 | return 0; | 3405 | return ret; |
3398 | 3406 | ||
3399 | out_free_timewait_sock_slab_name: | 3407 | out_free_timewait_sock_slab_name: |
3400 | kfree(prot->twsk_prot->twsk_slab_name); | 3408 | if (alloc_slab && prot->twsk_prot) |
3409 | kfree(prot->twsk_prot->twsk_slab_name); | ||
3401 | out_free_request_sock_slab: | 3410 | out_free_request_sock_slab: |
3402 | req_prot_cleanup(prot->rsk_prot); | 3411 | if (alloc_slab) { |
3412 | req_prot_cleanup(prot->rsk_prot); | ||
3403 | 3413 | ||
3404 | kmem_cache_destroy(prot->slab); | 3414 | kmem_cache_destroy(prot->slab); |
3405 | prot->slab = NULL; | 3415 | prot->slab = NULL; |
3416 | } | ||
3406 | out: | 3417 | out: |
3407 | return -ENOBUFS; | 3418 | return ret; |
3408 | } | 3419 | } |
3409 | EXPORT_SYMBOL(proto_register); | 3420 | EXPORT_SYMBOL(proto_register); |
3410 | 3421 | ||
diff --git a/net/core/stream.c b/net/core/stream.c index e94bb02a5629..4f1d4aa5fb38 100644 --- a/net/core/stream.c +++ b/net/core/stream.c | |||
@@ -120,7 +120,6 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
120 | int err = 0; | 120 | int err = 0; |
121 | long vm_wait = 0; | 121 | long vm_wait = 0; |
122 | long current_timeo = *timeo_p; | 122 | long current_timeo = *timeo_p; |
123 | bool noblock = (*timeo_p ? false : true); | ||
124 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | 123 | DEFINE_WAIT_FUNC(wait, woken_wake_function); |
125 | 124 | ||
126 | if (sk_stream_memory_free(sk)) | 125 | if (sk_stream_memory_free(sk)) |
@@ -133,11 +132,8 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p) | |||
133 | 132 | ||
134 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) | 133 | if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) |
135 | goto do_error; | 134 | goto do_error; |
136 | if (!*timeo_p) { | 135 | if (!*timeo_p) |
137 | if (noblock) | 136 | goto do_eagain; |
138 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | ||
139 | goto do_nonblock; | ||
140 | } | ||
141 | if (signal_pending(current)) | 137 | if (signal_pending(current)) |
142 | goto do_interrupted; | 138 | goto do_interrupted; |
143 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); | 139 | sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
@@ -169,7 +165,13 @@ out: | |||
169 | do_error: | 165 | do_error: |
170 | err = -EPIPE; | 166 | err = -EPIPE; |
171 | goto out; | 167 | goto out; |
172 | do_nonblock: | 168 | do_eagain: |
169 | /* Make sure that whenever EAGAIN is returned, EPOLLOUT event can | ||
170 | * be generated later. | ||
171 | * When TCP receives ACK packets that make room, tcp_check_space() | ||
172 | * only calls tcp_new_space() if SOCK_NOSPACE is set. | ||
173 | */ | ||
174 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | ||
173 | err = -EAGAIN; | 175 | err = -EAGAIN; |
174 | goto out; | 176 | goto out; |
175 | do_interrupted: | 177 | do_interrupted: |
diff --git a/net/dsa/tag_8021q.c b/net/dsa/tag_8021q.c index 6ebbd799c4eb..67a1bc635a7b 100644 --- a/net/dsa/tag_8021q.c +++ b/net/dsa/tag_8021q.c | |||
@@ -28,6 +28,7 @@ | |||
28 | * | 28 | * |
29 | * RSV - VID[9]: | 29 | * RSV - VID[9]: |
30 | * To be used for further expansion of SWITCH_ID or for other purposes. | 30 | * To be used for further expansion of SWITCH_ID or for other purposes. |
31 | * Must be transmitted as zero and ignored on receive. | ||
31 | * | 32 | * |
32 | * SWITCH_ID - VID[8:6]: | 33 | * SWITCH_ID - VID[8:6]: |
33 | * Index of switch within DSA tree. Must be between 0 and | 34 | * Index of switch within DSA tree. Must be between 0 and |
@@ -35,6 +36,7 @@ | |||
35 | * | 36 | * |
36 | * RSV - VID[5:4]: | 37 | * RSV - VID[5:4]: |
37 | * To be used for further expansion of PORT or for other purposes. | 38 | * To be used for further expansion of PORT or for other purposes. |
39 | * Must be transmitted as zero and ignored on receive. | ||
38 | * | 40 | * |
39 | * PORT - VID[3:0]: | 41 | * PORT - VID[3:0]: |
40 | * Index of switch port. Must be between 0 and DSA_MAX_PORTS - 1. | 42 | * Index of switch port. Must be between 0 and DSA_MAX_PORTS - 1. |
diff --git a/net/ieee802154/socket.c b/net/ieee802154/socket.c index dacbd58e1799..badc5cfe4dc6 100644 --- a/net/ieee802154/socket.c +++ b/net/ieee802154/socket.c | |||
@@ -1092,7 +1092,7 @@ static struct packet_type ieee802154_packet_type = { | |||
1092 | 1092 | ||
1093 | static int __init af_ieee802154_init(void) | 1093 | static int __init af_ieee802154_init(void) |
1094 | { | 1094 | { |
1095 | int rc = -EINVAL; | 1095 | int rc; |
1096 | 1096 | ||
1097 | rc = proto_register(&ieee802154_raw_prot, 1); | 1097 | rc = proto_register(&ieee802154_raw_prot, 1); |
1098 | if (rc) | 1098 | if (rc) |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 2b2b3d291ab0..1ab2fb6bb37d 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -2145,7 +2145,7 @@ static int fn_trie_dump_leaf(struct key_vector *l, struct fib_table *tb, | |||
2145 | 2145 | ||
2146 | if (filter->dump_exceptions) { | 2146 | if (filter->dump_exceptions) { |
2147 | err = fib_dump_info_fnhe(skb, cb, tb->tb_id, fi, | 2147 | err = fib_dump_info_fnhe(skb, cb, tb->tb_id, fi, |
2148 | &i_fa, s_fa); | 2148 | &i_fa, s_fa, flags); |
2149 | if (err < 0) | 2149 | if (err < 0) |
2150 | goto stop; | 2150 | goto stop; |
2151 | } | 2151 | } |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 1510e951f451..4298aae74e0e 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -582,7 +582,13 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info, | |||
582 | 582 | ||
583 | if (!rt) | 583 | if (!rt) |
584 | goto out; | 584 | goto out; |
585 | net = dev_net(rt->dst.dev); | 585 | |
586 | if (rt->dst.dev) | ||
587 | net = dev_net(rt->dst.dev); | ||
588 | else if (skb_in->dev) | ||
589 | net = dev_net(skb_in->dev); | ||
590 | else | ||
591 | goto out; | ||
586 | 592 | ||
587 | /* | 593 | /* |
588 | * Find the original header. It is expected to be valid, of course. | 594 | * Find the original header. It is expected to be valid, of course. |
@@ -902,7 +908,7 @@ static bool icmp_redirect(struct sk_buff *skb) | |||
902 | return false; | 908 | return false; |
903 | } | 909 | } |
904 | 910 | ||
905 | icmp_socket_deliver(skb, icmp_hdr(skb)->un.gateway); | 911 | icmp_socket_deliver(skb, ntohl(icmp_hdr(skb)->un.gateway)); |
906 | return true; | 912 | return true; |
907 | } | 913 | } |
908 | 914 | ||
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index 180f6896b98b..480d0b22db1a 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
@@ -1475,7 +1475,7 @@ EXPORT_SYMBOL(__ip_mc_inc_group); | |||
1475 | 1475 | ||
1476 | void ip_mc_inc_group(struct in_device *in_dev, __be32 addr) | 1476 | void ip_mc_inc_group(struct in_device *in_dev, __be32 addr) |
1477 | { | 1477 | { |
1478 | __ip_mc_inc_group(in_dev, addr, MCAST_EXCLUDE); | 1478 | __ip_mc_inc_group(in_dev, addr, GFP_KERNEL); |
1479 | } | 1479 | } |
1480 | EXPORT_SYMBOL(ip_mc_inc_group); | 1480 | EXPORT_SYMBOL(ip_mc_inc_group); |
1481 | 1481 | ||
@@ -2197,7 +2197,7 @@ static int __ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr, | |||
2197 | iml->sflist = NULL; | 2197 | iml->sflist = NULL; |
2198 | iml->sfmode = mode; | 2198 | iml->sfmode = mode; |
2199 | rcu_assign_pointer(inet->mc_list, iml); | 2199 | rcu_assign_pointer(inet->mc_list, iml); |
2200 | __ip_mc_inc_group(in_dev, addr, mode); | 2200 | ____ip_mc_inc_group(in_dev, addr, mode, GFP_KERNEL); |
2201 | err = 0; | 2201 | err = 0; |
2202 | done: | 2202 | done: |
2203 | return err; | 2203 | return err; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 517300d587a7..b6a6f18c3dd1 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2728,7 +2728,8 @@ EXPORT_SYMBOL_GPL(ip_route_output_flow); | |||
2728 | /* called with rcu_read_lock held */ | 2728 | /* called with rcu_read_lock held */ |
2729 | static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | 2729 | static int rt_fill_info(struct net *net, __be32 dst, __be32 src, |
2730 | struct rtable *rt, u32 table_id, struct flowi4 *fl4, | 2730 | struct rtable *rt, u32 table_id, struct flowi4 *fl4, |
2731 | struct sk_buff *skb, u32 portid, u32 seq) | 2731 | struct sk_buff *skb, u32 portid, u32 seq, |
2732 | unsigned int flags) | ||
2732 | { | 2733 | { |
2733 | struct rtmsg *r; | 2734 | struct rtmsg *r; |
2734 | struct nlmsghdr *nlh; | 2735 | struct nlmsghdr *nlh; |
@@ -2736,7 +2737,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
2736 | u32 error; | 2737 | u32 error; |
2737 | u32 metrics[RTAX_MAX]; | 2738 | u32 metrics[RTAX_MAX]; |
2738 | 2739 | ||
2739 | nlh = nlmsg_put(skb, portid, seq, RTM_NEWROUTE, sizeof(*r), 0); | 2740 | nlh = nlmsg_put(skb, portid, seq, RTM_NEWROUTE, sizeof(*r), flags); |
2740 | if (!nlh) | 2741 | if (!nlh) |
2741 | return -EMSGSIZE; | 2742 | return -EMSGSIZE; |
2742 | 2743 | ||
@@ -2860,7 +2861,7 @@ nla_put_failure: | |||
2860 | static int fnhe_dump_bucket(struct net *net, struct sk_buff *skb, | 2861 | static int fnhe_dump_bucket(struct net *net, struct sk_buff *skb, |
2861 | struct netlink_callback *cb, u32 table_id, | 2862 | struct netlink_callback *cb, u32 table_id, |
2862 | struct fnhe_hash_bucket *bucket, int genid, | 2863 | struct fnhe_hash_bucket *bucket, int genid, |
2863 | int *fa_index, int fa_start) | 2864 | int *fa_index, int fa_start, unsigned int flags) |
2864 | { | 2865 | { |
2865 | int i; | 2866 | int i; |
2866 | 2867 | ||
@@ -2891,7 +2892,7 @@ static int fnhe_dump_bucket(struct net *net, struct sk_buff *skb, | |||
2891 | err = rt_fill_info(net, fnhe->fnhe_daddr, 0, rt, | 2892 | err = rt_fill_info(net, fnhe->fnhe_daddr, 0, rt, |
2892 | table_id, NULL, skb, | 2893 | table_id, NULL, skb, |
2893 | NETLINK_CB(cb->skb).portid, | 2894 | NETLINK_CB(cb->skb).portid, |
2894 | cb->nlh->nlmsg_seq); | 2895 | cb->nlh->nlmsg_seq, flags); |
2895 | if (err) | 2896 | if (err) |
2896 | return err; | 2897 | return err; |
2897 | next: | 2898 | next: |
@@ -2904,7 +2905,7 @@ next: | |||
2904 | 2905 | ||
2905 | int fib_dump_info_fnhe(struct sk_buff *skb, struct netlink_callback *cb, | 2906 | int fib_dump_info_fnhe(struct sk_buff *skb, struct netlink_callback *cb, |
2906 | u32 table_id, struct fib_info *fi, | 2907 | u32 table_id, struct fib_info *fi, |
2907 | int *fa_index, int fa_start) | 2908 | int *fa_index, int fa_start, unsigned int flags) |
2908 | { | 2909 | { |
2909 | struct net *net = sock_net(cb->skb->sk); | 2910 | struct net *net = sock_net(cb->skb->sk); |
2910 | int nhsel, genid = fnhe_genid(net); | 2911 | int nhsel, genid = fnhe_genid(net); |
@@ -2922,7 +2923,8 @@ int fib_dump_info_fnhe(struct sk_buff *skb, struct netlink_callback *cb, | |||
2922 | err = 0; | 2923 | err = 0; |
2923 | if (bucket) | 2924 | if (bucket) |
2924 | err = fnhe_dump_bucket(net, skb, cb, table_id, bucket, | 2925 | err = fnhe_dump_bucket(net, skb, cb, table_id, bucket, |
2925 | genid, fa_index, fa_start); | 2926 | genid, fa_index, fa_start, |
2927 | flags); | ||
2926 | rcu_read_unlock(); | 2928 | rcu_read_unlock(); |
2927 | if (err) | 2929 | if (err) |
2928 | return err; | 2930 | return err; |
@@ -3183,7 +3185,8 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh, | |||
3183 | fl4.flowi4_tos, res.fi, 0); | 3185 | fl4.flowi4_tos, res.fi, 0); |
3184 | } else { | 3186 | } else { |
3185 | err = rt_fill_info(net, dst, src, rt, table_id, &fl4, skb, | 3187 | err = rt_fill_info(net, dst, src, rt, table_id, &fl4, skb, |
3186 | NETLINK_CB(in_skb).portid, nlh->nlmsg_seq); | 3188 | NETLINK_CB(in_skb).portid, |
3189 | nlh->nlmsg_seq, 0); | ||
3187 | } | 3190 | } |
3188 | if (err < 0) | 3191 | if (err < 0) |
3189 | goto errout_rcu; | 3192 | goto errout_rcu; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 77b485d60b9d..61082065b26a 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -935,6 +935,22 @@ static int tcp_send_mss(struct sock *sk, int *size_goal, int flags) | |||
935 | return mss_now; | 935 | return mss_now; |
936 | } | 936 | } |
937 | 937 | ||
938 | /* In some cases, both sendpage() and sendmsg() could have added | ||
939 | * an skb to the write queue, but failed adding payload on it. | ||
940 | * We need to remove it to consume less memory, but more | ||
941 | * importantly be able to generate EPOLLOUT for Edge Trigger epoll() | ||
942 | * users. | ||
943 | */ | ||
944 | static void tcp_remove_empty_skb(struct sock *sk, struct sk_buff *skb) | ||
945 | { | ||
946 | if (skb && !skb->len) { | ||
947 | tcp_unlink_write_queue(skb, sk); | ||
948 | if (tcp_write_queue_empty(sk)) | ||
949 | tcp_chrono_stop(sk, TCP_CHRONO_BUSY); | ||
950 | sk_wmem_free_skb(sk, skb); | ||
951 | } | ||
952 | } | ||
953 | |||
938 | ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, | 954 | ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, |
939 | size_t size, int flags) | 955 | size_t size, int flags) |
940 | { | 956 | { |
@@ -1064,6 +1080,7 @@ out: | |||
1064 | return copied; | 1080 | return copied; |
1065 | 1081 | ||
1066 | do_error: | 1082 | do_error: |
1083 | tcp_remove_empty_skb(sk, tcp_write_queue_tail(sk)); | ||
1067 | if (copied) | 1084 | if (copied) |
1068 | goto out; | 1085 | goto out; |
1069 | out_err: | 1086 | out_err: |
@@ -1388,18 +1405,11 @@ out_nopush: | |||
1388 | sock_zerocopy_put(uarg); | 1405 | sock_zerocopy_put(uarg); |
1389 | return copied + copied_syn; | 1406 | return copied + copied_syn; |
1390 | 1407 | ||
1408 | do_error: | ||
1409 | skb = tcp_write_queue_tail(sk); | ||
1391 | do_fault: | 1410 | do_fault: |
1392 | if (!skb->len) { | 1411 | tcp_remove_empty_skb(sk, skb); |
1393 | tcp_unlink_write_queue(skb, sk); | ||
1394 | /* It is the one place in all of TCP, except connection | ||
1395 | * reset, where we can be unlinking the send_head. | ||
1396 | */ | ||
1397 | if (tcp_write_queue_empty(sk)) | ||
1398 | tcp_chrono_stop(sk, TCP_CHRONO_BUSY); | ||
1399 | sk_wmem_free_skb(sk, skb); | ||
1400 | } | ||
1401 | 1412 | ||
1402 | do_error: | ||
1403 | if (copied + copied_syn) | 1413 | if (copied + copied_syn) |
1404 | goto out; | 1414 | goto out; |
1405 | out_err: | 1415 | out_err: |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 979520e46e33..8a645f304e6c 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2053,7 +2053,7 @@ static bool tcp_can_coalesce_send_queue_head(struct sock *sk, int len) | |||
2053 | if (len <= skb->len) | 2053 | if (len <= skb->len) |
2054 | break; | 2054 | break; |
2055 | 2055 | ||
2056 | if (unlikely(TCP_SKB_CB(skb)->eor)) | 2056 | if (unlikely(TCP_SKB_CB(skb)->eor) || tcp_has_tx_tstamp(skb)) |
2057 | return false; | 2057 | return false; |
2058 | 2058 | ||
2059 | len -= skb->len; | 2059 | len -= skb->len; |
@@ -2170,6 +2170,7 @@ static int tcp_mtu_probe(struct sock *sk) | |||
2170 | * we need to propagate it to the new skb. | 2170 | * we need to propagate it to the new skb. |
2171 | */ | 2171 | */ |
2172 | TCP_SKB_CB(nskb)->eor = TCP_SKB_CB(skb)->eor; | 2172 | TCP_SKB_CB(nskb)->eor = TCP_SKB_CB(skb)->eor; |
2173 | tcp_skb_collapse_tstamp(nskb, skb); | ||
2173 | tcp_unlink_write_queue(skb, sk); | 2174 | tcp_unlink_write_queue(skb, sk); |
2174 | sk_wmem_free_skb(sk, skb); | 2175 | sk_wmem_free_skb(sk, skb); |
2175 | } else { | 2176 | } else { |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index dc73888c7859..6a576ff92c39 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -478,7 +478,7 @@ static struct inet6_dev *ipv6_find_idev(struct net_device *dev) | |||
478 | if (!idev) { | 478 | if (!idev) { |
479 | idev = ipv6_add_dev(dev); | 479 | idev = ipv6_add_dev(dev); |
480 | if (IS_ERR(idev)) | 480 | if (IS_ERR(idev)) |
481 | return NULL; | 481 | return idev; |
482 | } | 482 | } |
483 | 483 | ||
484 | if (dev->flags&IFF_UP) | 484 | if (dev->flags&IFF_UP) |
@@ -1045,7 +1045,8 @@ ipv6_add_addr(struct inet6_dev *idev, struct ifa6_config *cfg, | |||
1045 | int err = 0; | 1045 | int err = 0; |
1046 | 1046 | ||
1047 | if (addr_type == IPV6_ADDR_ANY || | 1047 | if (addr_type == IPV6_ADDR_ANY || |
1048 | addr_type & IPV6_ADDR_MULTICAST || | 1048 | (addr_type & IPV6_ADDR_MULTICAST && |
1049 | !(cfg->ifa_flags & IFA_F_MCAUTOJOIN)) || | ||
1049 | (!(idev->dev->flags & IFF_LOOPBACK) && | 1050 | (!(idev->dev->flags & IFF_LOOPBACK) && |
1050 | !netif_is_l3_master(idev->dev) && | 1051 | !netif_is_l3_master(idev->dev) && |
1051 | addr_type & IPV6_ADDR_LOOPBACK)) | 1052 | addr_type & IPV6_ADDR_LOOPBACK)) |
@@ -2465,8 +2466,8 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | |||
2465 | ASSERT_RTNL(); | 2466 | ASSERT_RTNL(); |
2466 | 2467 | ||
2467 | idev = ipv6_find_idev(dev); | 2468 | idev = ipv6_find_idev(dev); |
2468 | if (!idev) | 2469 | if (IS_ERR(idev)) |
2469 | return ERR_PTR(-ENOBUFS); | 2470 | return idev; |
2470 | 2471 | ||
2471 | if (idev->cnf.disable_ipv6) | 2472 | if (idev->cnf.disable_ipv6) |
2472 | return ERR_PTR(-EACCES); | 2473 | return ERR_PTR(-EACCES); |
@@ -3158,7 +3159,7 @@ static void init_loopback(struct net_device *dev) | |||
3158 | ASSERT_RTNL(); | 3159 | ASSERT_RTNL(); |
3159 | 3160 | ||
3160 | idev = ipv6_find_idev(dev); | 3161 | idev = ipv6_find_idev(dev); |
3161 | if (!idev) { | 3162 | if (IS_ERR(idev)) { |
3162 | pr_debug("%s: add_dev failed\n", __func__); | 3163 | pr_debug("%s: add_dev failed\n", __func__); |
3163 | return; | 3164 | return; |
3164 | } | 3165 | } |
@@ -3373,7 +3374,7 @@ static void addrconf_sit_config(struct net_device *dev) | |||
3373 | */ | 3374 | */ |
3374 | 3375 | ||
3375 | idev = ipv6_find_idev(dev); | 3376 | idev = ipv6_find_idev(dev); |
3376 | if (!idev) { | 3377 | if (IS_ERR(idev)) { |
3377 | pr_debug("%s: add_dev failed\n", __func__); | 3378 | pr_debug("%s: add_dev failed\n", __func__); |
3378 | return; | 3379 | return; |
3379 | } | 3380 | } |
@@ -3398,7 +3399,7 @@ static void addrconf_gre_config(struct net_device *dev) | |||
3398 | ASSERT_RTNL(); | 3399 | ASSERT_RTNL(); |
3399 | 3400 | ||
3400 | idev = ipv6_find_idev(dev); | 3401 | idev = ipv6_find_idev(dev); |
3401 | if (!idev) { | 3402 | if (IS_ERR(idev)) { |
3402 | pr_debug("%s: add_dev failed\n", __func__); | 3403 | pr_debug("%s: add_dev failed\n", __func__); |
3403 | return; | 3404 | return; |
3404 | } | 3405 | } |
@@ -4772,8 +4773,8 @@ inet6_rtm_newaddr(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
4772 | IFA_F_MCAUTOJOIN | IFA_F_OPTIMISTIC; | 4773 | IFA_F_MCAUTOJOIN | IFA_F_OPTIMISTIC; |
4773 | 4774 | ||
4774 | idev = ipv6_find_idev(dev); | 4775 | idev = ipv6_find_idev(dev); |
4775 | if (!idev) | 4776 | if (IS_ERR(idev)) |
4776 | return -ENOBUFS; | 4777 | return PTR_ERR(idev); |
4777 | 4778 | ||
4778 | if (!ipv6_allow_optimistic_dad(net, idev)) | 4779 | if (!ipv6_allow_optimistic_dad(net, idev)) |
4779 | cfg.ifa_flags &= ~IFA_F_OPTIMISTIC; | 4780 | cfg.ifa_flags &= ~IFA_F_OPTIMISTIC; |
diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c index 7f3f13c37916..eaa4c2cc2fbb 100644 --- a/net/ipv6/mcast.c +++ b/net/ipv6/mcast.c | |||
@@ -787,14 +787,15 @@ static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) | |||
787 | if (pmc) { | 787 | if (pmc) { |
788 | im->idev = pmc->idev; | 788 | im->idev = pmc->idev; |
789 | if (im->mca_sfmode == MCAST_INCLUDE) { | 789 | if (im->mca_sfmode == MCAST_INCLUDE) { |
790 | im->mca_tomb = pmc->mca_tomb; | 790 | swap(im->mca_tomb, pmc->mca_tomb); |
791 | im->mca_sources = pmc->mca_sources; | 791 | swap(im->mca_sources, pmc->mca_sources); |
792 | for (psf = im->mca_sources; psf; psf = psf->sf_next) | 792 | for (psf = im->mca_sources; psf; psf = psf->sf_next) |
793 | psf->sf_crcount = idev->mc_qrv; | 793 | psf->sf_crcount = idev->mc_qrv; |
794 | } else { | 794 | } else { |
795 | im->mca_crcount = idev->mc_qrv; | 795 | im->mca_crcount = idev->mc_qrv; |
796 | } | 796 | } |
797 | in6_dev_put(pmc->idev); | 797 | in6_dev_put(pmc->idev); |
798 | ip6_mc_clear_src(pmc); | ||
798 | kfree(pmc); | 799 | kfree(pmc); |
799 | } | 800 | } |
800 | spin_unlock_bh(&im->mca_lock); | 801 | spin_unlock_bh(&im->mca_lock); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 4d458067d80d..111c400199ec 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1546,6 +1546,11 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
1546 | if (is_multicast_ether_addr(mac)) | 1546 | if (is_multicast_ether_addr(mac)) |
1547 | return -EINVAL; | 1547 | return -EINVAL; |
1548 | 1548 | ||
1549 | if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER) && | ||
1550 | sdata->vif.type == NL80211_IFTYPE_STATION && | ||
1551 | !sdata->u.mgd.associated) | ||
1552 | return -EINVAL; | ||
1553 | |||
1549 | sta = sta_info_alloc(sdata, mac, GFP_KERNEL); | 1554 | sta = sta_info_alloc(sdata, mac, GFP_KERNEL); |
1550 | if (!sta) | 1555 | if (!sta) |
1551 | return -ENOMEM; | 1556 | return -ENOMEM; |
@@ -1553,10 +1558,6 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, | |||
1553 | if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) | 1558 | if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) |
1554 | sta->sta.tdls = true; | 1559 | sta->sta.tdls = true; |
1555 | 1560 | ||
1556 | if (sta->sta.tdls && sdata->vif.type == NL80211_IFTYPE_STATION && | ||
1557 | !sdata->u.mgd.associated) | ||
1558 | return -EINVAL; | ||
1559 | |||
1560 | err = sta_apply_parameters(local, sta, params); | 1561 | err = sta_apply_parameters(local, sta, params); |
1561 | if (err) { | 1562 | if (err) { |
1562 | sta_info_free(local, sta); | 1563 | sta_info_free(local, sta); |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 3c1ab870fefe..768d14c9a716 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -2447,11 +2447,13 @@ static void ieee80211_deliver_skb_to_local_stack(struct sk_buff *skb, | |||
2447 | skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) && | 2447 | skb->protocol == cpu_to_be16(ETH_P_PREAUTH)) && |
2448 | sdata->control_port_over_nl80211)) { | 2448 | sdata->control_port_over_nl80211)) { |
2449 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); | 2449 | struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
2450 | bool noencrypt = status->flag & RX_FLAG_DECRYPTED; | 2450 | bool noencrypt = !(status->flag & RX_FLAG_DECRYPTED); |
2451 | 2451 | ||
2452 | cfg80211_rx_control_port(dev, skb, noencrypt); | 2452 | cfg80211_rx_control_port(dev, skb, noencrypt); |
2453 | dev_kfree_skb(skb); | 2453 | dev_kfree_skb(skb); |
2454 | } else { | 2454 | } else { |
2455 | memset(skb->cb, 0, sizeof(skb->cb)); | ||
2456 | |||
2455 | /* deliver to local stack */ | 2457 | /* deliver to local stack */ |
2456 | if (rx->napi) | 2458 | if (rx->napi) |
2457 | napi_gro_receive(rx->napi, skb); | 2459 | napi_gro_receive(rx->napi, skb); |
@@ -2546,8 +2548,6 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) | |||
2546 | 2548 | ||
2547 | if (skb) { | 2549 | if (skb) { |
2548 | skb->protocol = eth_type_trans(skb, dev); | 2550 | skb->protocol = eth_type_trans(skb, dev); |
2549 | memset(skb->cb, 0, sizeof(skb->cb)); | ||
2550 | |||
2551 | ieee80211_deliver_skb_to_local_stack(skb, rx); | 2551 | ieee80211_deliver_skb_to_local_stack(skb, rx); |
2552 | } | 2552 | } |
2553 | 2553 | ||
diff --git a/net/mpls/mpls_iptunnel.c b/net/mpls/mpls_iptunnel.c index d25e91d7bdc1..44b675016393 100644 --- a/net/mpls/mpls_iptunnel.c +++ b/net/mpls/mpls_iptunnel.c | |||
@@ -133,12 +133,12 @@ static int mpls_xmit(struct sk_buff *skb) | |||
133 | mpls_stats_inc_outucastpkts(out_dev, skb); | 133 | mpls_stats_inc_outucastpkts(out_dev, skb); |
134 | 134 | ||
135 | if (rt) { | 135 | if (rt) { |
136 | if (rt->rt_gw_family == AF_INET) | 136 | if (rt->rt_gw_family == AF_INET6) |
137 | err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt->rt_gw4, | ||
138 | skb); | ||
139 | else if (rt->rt_gw_family == AF_INET6) | ||
140 | err = neigh_xmit(NEIGH_ND_TABLE, out_dev, &rt->rt_gw6, | 137 | err = neigh_xmit(NEIGH_ND_TABLE, out_dev, &rt->rt_gw6, |
141 | skb); | 138 | skb); |
139 | else | ||
140 | err = neigh_xmit(NEIGH_ARP_TABLE, out_dev, &rt->rt_gw4, | ||
141 | skb); | ||
142 | } else if (rt6) { | 142 | } else if (rt6) { |
143 | if (ipv6_addr_v4mapped(&rt6->rt6i_gateway)) { | 143 | if (ipv6_addr_v4mapped(&rt6->rt6i_gateway)) { |
144 | /* 6PE (RFC 4798) */ | 144 | /* 6PE (RFC 4798) */ |
diff --git a/net/ncsi/ncsi-cmd.c b/net/ncsi/ncsi-cmd.c index 5c3fad8cba57..0187e65176c0 100644 --- a/net/ncsi/ncsi-cmd.c +++ b/net/ncsi/ncsi-cmd.c | |||
@@ -54,7 +54,7 @@ static void ncsi_cmd_build_header(struct ncsi_pkt_hdr *h, | |||
54 | checksum = ncsi_calculate_checksum((unsigned char *)h, | 54 | checksum = ncsi_calculate_checksum((unsigned char *)h, |
55 | sizeof(*h) + nca->payload); | 55 | sizeof(*h) + nca->payload); |
56 | pchecksum = (__be32 *)((void *)h + sizeof(struct ncsi_pkt_hdr) + | 56 | pchecksum = (__be32 *)((void *)h + sizeof(struct ncsi_pkt_hdr) + |
57 | nca->payload); | 57 | ALIGN(nca->payload, 4)); |
58 | *pchecksum = htonl(checksum); | 58 | *pchecksum = htonl(checksum); |
59 | } | 59 | } |
60 | 60 | ||
@@ -309,14 +309,21 @@ static struct ncsi_request *ncsi_alloc_command(struct ncsi_cmd_arg *nca) | |||
309 | 309 | ||
310 | int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca) | 310 | int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca) |
311 | { | 311 | { |
312 | struct ncsi_cmd_handler *nch = NULL; | ||
312 | struct ncsi_request *nr; | 313 | struct ncsi_request *nr; |
314 | unsigned char type; | ||
313 | struct ethhdr *eh; | 315 | struct ethhdr *eh; |
314 | struct ncsi_cmd_handler *nch = NULL; | ||
315 | int i, ret; | 316 | int i, ret; |
316 | 317 | ||
318 | /* Use OEM generic handler for Netlink request */ | ||
319 | if (nca->req_flags == NCSI_REQ_FLAG_NETLINK_DRIVEN) | ||
320 | type = NCSI_PKT_CMD_OEM; | ||
321 | else | ||
322 | type = nca->type; | ||
323 | |||
317 | /* Search for the handler */ | 324 | /* Search for the handler */ |
318 | for (i = 0; i < ARRAY_SIZE(ncsi_cmd_handlers); i++) { | 325 | for (i = 0; i < ARRAY_SIZE(ncsi_cmd_handlers); i++) { |
319 | if (ncsi_cmd_handlers[i].type == nca->type) { | 326 | if (ncsi_cmd_handlers[i].type == type) { |
320 | if (ncsi_cmd_handlers[i].handler) | 327 | if (ncsi_cmd_handlers[i].handler) |
321 | nch = &ncsi_cmd_handlers[i]; | 328 | nch = &ncsi_cmd_handlers[i]; |
322 | else | 329 | else |
diff --git a/net/ncsi/ncsi-rsp.c b/net/ncsi/ncsi-rsp.c index 7581bf919885..d876bd55f356 100644 --- a/net/ncsi/ncsi-rsp.c +++ b/net/ncsi/ncsi-rsp.c | |||
@@ -47,7 +47,8 @@ static int ncsi_validate_rsp_pkt(struct ncsi_request *nr, | |||
47 | if (ntohs(h->code) != NCSI_PKT_RSP_C_COMPLETED || | 47 | if (ntohs(h->code) != NCSI_PKT_RSP_C_COMPLETED || |
48 | ntohs(h->reason) != NCSI_PKT_RSP_R_NO_ERROR) { | 48 | ntohs(h->reason) != NCSI_PKT_RSP_R_NO_ERROR) { |
49 | netdev_dbg(nr->ndp->ndev.dev, | 49 | netdev_dbg(nr->ndp->ndev.dev, |
50 | "NCSI: non zero response/reason code\n"); | 50 | "NCSI: non zero response/reason code %04xh, %04xh\n", |
51 | ntohs(h->code), ntohs(h->reason)); | ||
51 | return -EPERM; | 52 | return -EPERM; |
52 | } | 53 | } |
53 | 54 | ||
@@ -55,7 +56,7 @@ static int ncsi_validate_rsp_pkt(struct ncsi_request *nr, | |||
55 | * sender doesn't support checksum according to NCSI | 56 | * sender doesn't support checksum according to NCSI |
56 | * specification. | 57 | * specification. |
57 | */ | 58 | */ |
58 | pchecksum = (__be32 *)((void *)(h + 1) + payload - 4); | 59 | pchecksum = (__be32 *)((void *)(h + 1) + ALIGN(payload, 4) - 4); |
59 | if (ntohl(*pchecksum) == 0) | 60 | if (ntohl(*pchecksum) == 0) |
60 | return 0; | 61 | return 0; |
61 | 62 | ||
@@ -63,7 +64,9 @@ static int ncsi_validate_rsp_pkt(struct ncsi_request *nr, | |||
63 | sizeof(*h) + payload - 4); | 64 | sizeof(*h) + payload - 4); |
64 | 65 | ||
65 | if (*pchecksum != htonl(checksum)) { | 66 | if (*pchecksum != htonl(checksum)) { |
66 | netdev_dbg(nr->ndp->ndev.dev, "NCSI: checksum mismatched\n"); | 67 | netdev_dbg(nr->ndp->ndev.dev, |
68 | "NCSI: checksum mismatched; recd: %08x calc: %08x\n", | ||
69 | *pchecksum, htonl(checksum)); | ||
67 | return -EINVAL; | 70 | return -EINVAL; |
68 | } | 71 | } |
69 | 72 | ||
diff --git a/net/netfilter/nf_conntrack_ftp.c b/net/netfilter/nf_conntrack_ftp.c index 0ecb3e289ef2..8d96738b7dfd 100644 --- a/net/netfilter/nf_conntrack_ftp.c +++ b/net/netfilter/nf_conntrack_ftp.c | |||
@@ -322,7 +322,7 @@ static int find_pattern(const char *data, size_t dlen, | |||
322 | i++; | 322 | i++; |
323 | } | 323 | } |
324 | 324 | ||
325 | pr_debug("Skipped up to `%c'!\n", skip); | 325 | pr_debug("Skipped up to 0x%hhx delimiter!\n", skip); |
326 | 326 | ||
327 | *numoff = i; | 327 | *numoff = i; |
328 | *numlen = getnum(data + i, dlen - i, cmd, term, numoff); | 328 | *numlen = getnum(data + i, dlen - i, cmd, term, numoff); |
diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c index e0d392cb3075..0006503d2da9 100644 --- a/net/netfilter/nf_conntrack_standalone.c +++ b/net/netfilter/nf_conntrack_standalone.c | |||
@@ -1037,9 +1037,14 @@ static int nf_conntrack_standalone_init_sysctl(struct net *net) | |||
1037 | table[NF_SYSCTL_CT_COUNT].data = &net->ct.count; | 1037 | table[NF_SYSCTL_CT_COUNT].data = &net->ct.count; |
1038 | table[NF_SYSCTL_CT_CHECKSUM].data = &net->ct.sysctl_checksum; | 1038 | table[NF_SYSCTL_CT_CHECKSUM].data = &net->ct.sysctl_checksum; |
1039 | table[NF_SYSCTL_CT_LOG_INVALID].data = &net->ct.sysctl_log_invalid; | 1039 | table[NF_SYSCTL_CT_LOG_INVALID].data = &net->ct.sysctl_log_invalid; |
1040 | table[NF_SYSCTL_CT_ACCT].data = &net->ct.sysctl_acct; | ||
1041 | table[NF_SYSCTL_CT_HELPER].data = &net->ct.sysctl_auto_assign_helper; | ||
1040 | #ifdef CONFIG_NF_CONNTRACK_EVENTS | 1042 | #ifdef CONFIG_NF_CONNTRACK_EVENTS |
1041 | table[NF_SYSCTL_CT_EVENTS].data = &net->ct.sysctl_events; | 1043 | table[NF_SYSCTL_CT_EVENTS].data = &net->ct.sysctl_events; |
1042 | #endif | 1044 | #endif |
1045 | #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP | ||
1046 | table[NF_SYSCTL_CT_TIMESTAMP].data = &net->ct.sysctl_tstamp; | ||
1047 | #endif | ||
1043 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC].data = &nf_generic_pernet(net)->timeout; | 1048 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC].data = &nf_generic_pernet(net)->timeout; |
1044 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP].data = &nf_icmp_pernet(net)->timeout; | 1049 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP].data = &nf_icmp_pernet(net)->timeout; |
1045 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6].data = &nf_icmpv6_pernet(net)->timeout; | 1050 | table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6].data = &nf_icmpv6_pernet(net)->timeout; |
diff --git a/net/netfilter/nf_flow_table_ip.c b/net/netfilter/nf_flow_table_ip.c index d68c801dd614..b9e7dd6e60ce 100644 --- a/net/netfilter/nf_flow_table_ip.c +++ b/net/netfilter/nf_flow_table_ip.c | |||
@@ -228,7 +228,6 @@ static unsigned int nf_flow_xmit_xfrm(struct sk_buff *skb, | |||
228 | { | 228 | { |
229 | skb_orphan(skb); | 229 | skb_orphan(skb); |
230 | skb_dst_set_noref(skb, dst); | 230 | skb_dst_set_noref(skb, dst); |
231 | skb->tstamp = 0; | ||
232 | dst_output(state->net, state->sk, skb); | 231 | dst_output(state->net, state->sk, skb); |
233 | return NF_STOLEN; | 232 | return NF_STOLEN; |
234 | } | 233 | } |
@@ -284,6 +283,7 @@ nf_flow_offload_ip_hook(void *priv, struct sk_buff *skb, | |||
284 | flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT; | 283 | flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT; |
285 | iph = ip_hdr(skb); | 284 | iph = ip_hdr(skb); |
286 | ip_decrease_ttl(iph); | 285 | ip_decrease_ttl(iph); |
286 | skb->tstamp = 0; | ||
287 | 287 | ||
288 | if (unlikely(dst_xfrm(&rt->dst))) { | 288 | if (unlikely(dst_xfrm(&rt->dst))) { |
289 | memset(skb->cb, 0, sizeof(struct inet_skb_parm)); | 289 | memset(skb->cb, 0, sizeof(struct inet_skb_parm)); |
@@ -512,6 +512,7 @@ nf_flow_offload_ipv6_hook(void *priv, struct sk_buff *skb, | |||
512 | flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT; | 512 | flow->timeout = (u32)jiffies + NF_FLOW_TIMEOUT; |
513 | ip6h = ipv6_hdr(skb); | 513 | ip6h = ipv6_hdr(skb); |
514 | ip6h->hop_limit--; | 514 | ip6h->hop_limit--; |
515 | skb->tstamp = 0; | ||
515 | 516 | ||
516 | if (unlikely(dst_xfrm(&rt->dst))) { | 517 | if (unlikely(dst_xfrm(&rt->dst))) { |
517 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); | 518 | memset(skb->cb, 0, sizeof(struct inet6_skb_parm)); |
diff --git a/net/netfilter/nft_flow_offload.c b/net/netfilter/nft_flow_offload.c index 060a4ed46d5e..01705ad74a9a 100644 --- a/net/netfilter/nft_flow_offload.c +++ b/net/netfilter/nft_flow_offload.c | |||
@@ -149,6 +149,11 @@ static int nft_flow_offload_validate(const struct nft_ctx *ctx, | |||
149 | return nft_chain_validate_hooks(ctx->chain, hook_mask); | 149 | return nft_chain_validate_hooks(ctx->chain, hook_mask); |
150 | } | 150 | } |
151 | 151 | ||
152 | static const struct nla_policy nft_flow_offload_policy[NFTA_FLOW_MAX + 1] = { | ||
153 | [NFTA_FLOW_TABLE_NAME] = { .type = NLA_STRING, | ||
154 | .len = NFT_NAME_MAXLEN - 1 }, | ||
155 | }; | ||
156 | |||
152 | static int nft_flow_offload_init(const struct nft_ctx *ctx, | 157 | static int nft_flow_offload_init(const struct nft_ctx *ctx, |
153 | const struct nft_expr *expr, | 158 | const struct nft_expr *expr, |
154 | const struct nlattr * const tb[]) | 159 | const struct nlattr * const tb[]) |
@@ -207,6 +212,7 @@ static const struct nft_expr_ops nft_flow_offload_ops = { | |||
207 | static struct nft_expr_type nft_flow_offload_type __read_mostly = { | 212 | static struct nft_expr_type nft_flow_offload_type __read_mostly = { |
208 | .name = "flow_offload", | 213 | .name = "flow_offload", |
209 | .ops = &nft_flow_offload_ops, | 214 | .ops = &nft_flow_offload_ops, |
215 | .policy = nft_flow_offload_policy, | ||
210 | .maxattr = NFTA_FLOW_MAX, | 216 | .maxattr = NFTA_FLOW_MAX, |
211 | .owner = THIS_MODULE, | 217 | .owner = THIS_MODULE, |
212 | }; | 218 | }; |
diff --git a/net/netfilter/xt_nfacct.c b/net/netfilter/xt_nfacct.c index d0ab1adf5bff..5aab6df74e0f 100644 --- a/net/netfilter/xt_nfacct.c +++ b/net/netfilter/xt_nfacct.c | |||
@@ -54,25 +54,39 @@ nfacct_mt_destroy(const struct xt_mtdtor_param *par) | |||
54 | nfnl_acct_put(info->nfacct); | 54 | nfnl_acct_put(info->nfacct); |
55 | } | 55 | } |
56 | 56 | ||
57 | static struct xt_match nfacct_mt_reg __read_mostly = { | 57 | static struct xt_match nfacct_mt_reg[] __read_mostly = { |
58 | .name = "nfacct", | 58 | { |
59 | .family = NFPROTO_UNSPEC, | 59 | .name = "nfacct", |
60 | .checkentry = nfacct_mt_checkentry, | 60 | .revision = 0, |
61 | .match = nfacct_mt, | 61 | .family = NFPROTO_UNSPEC, |
62 | .destroy = nfacct_mt_destroy, | 62 | .checkentry = nfacct_mt_checkentry, |
63 | .matchsize = sizeof(struct xt_nfacct_match_info), | 63 | .match = nfacct_mt, |
64 | .usersize = offsetof(struct xt_nfacct_match_info, nfacct), | 64 | .destroy = nfacct_mt_destroy, |
65 | .me = THIS_MODULE, | 65 | .matchsize = sizeof(struct xt_nfacct_match_info), |
66 | .usersize = offsetof(struct xt_nfacct_match_info, nfacct), | ||
67 | .me = THIS_MODULE, | ||
68 | }, | ||
69 | { | ||
70 | .name = "nfacct", | ||
71 | .revision = 1, | ||
72 | .family = NFPROTO_UNSPEC, | ||
73 | .checkentry = nfacct_mt_checkentry, | ||
74 | .match = nfacct_mt, | ||
75 | .destroy = nfacct_mt_destroy, | ||
76 | .matchsize = sizeof(struct xt_nfacct_match_info_v1), | ||
77 | .usersize = offsetof(struct xt_nfacct_match_info_v1, nfacct), | ||
78 | .me = THIS_MODULE, | ||
79 | }, | ||
66 | }; | 80 | }; |
67 | 81 | ||
68 | static int __init nfacct_mt_init(void) | 82 | static int __init nfacct_mt_init(void) |
69 | { | 83 | { |
70 | return xt_register_match(&nfacct_mt_reg); | 84 | return xt_register_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg)); |
71 | } | 85 | } |
72 | 86 | ||
73 | static void __exit nfacct_mt_exit(void) | 87 | static void __exit nfacct_mt_exit(void) |
74 | { | 88 | { |
75 | xt_unregister_match(&nfacct_mt_reg); | 89 | xt_unregister_matches(nfacct_mt_reg, ARRAY_SIZE(nfacct_mt_reg)); |
76 | } | 90 | } |
77 | 91 | ||
78 | module_init(nfacct_mt_init); | 92 | module_init(nfacct_mt_init); |
diff --git a/net/netfilter/xt_physdev.c b/net/netfilter/xt_physdev.c index ead7c6022208..b92b22ce8abd 100644 --- a/net/netfilter/xt_physdev.c +++ b/net/netfilter/xt_physdev.c | |||
@@ -101,11 +101,9 @@ static int physdev_mt_check(const struct xt_mtchk_param *par) | |||
101 | if (info->bitmask & (XT_PHYSDEV_OP_OUT | XT_PHYSDEV_OP_ISOUT) && | 101 | if (info->bitmask & (XT_PHYSDEV_OP_OUT | XT_PHYSDEV_OP_ISOUT) && |
102 | (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) || | 102 | (!(info->bitmask & XT_PHYSDEV_OP_BRIDGED) || |
103 | info->invert & XT_PHYSDEV_OP_BRIDGED) && | 103 | info->invert & XT_PHYSDEV_OP_BRIDGED) && |
104 | par->hook_mask & ((1 << NF_INET_LOCAL_OUT) | | 104 | par->hook_mask & (1 << NF_INET_LOCAL_OUT)) { |
105 | (1 << NF_INET_FORWARD) | (1 << NF_INET_POST_ROUTING))) { | ||
106 | pr_info_ratelimited("--physdev-out and --physdev-is-out only supported in the FORWARD and POSTROUTING chains with bridged traffic\n"); | 105 | pr_info_ratelimited("--physdev-out and --physdev-is-out only supported in the FORWARD and POSTROUTING chains with bridged traffic\n"); |
107 | if (par->hook_mask & (1 << NF_INET_LOCAL_OUT)) | 106 | return -EINVAL; |
108 | return -EINVAL; | ||
109 | } | 107 | } |
110 | 108 | ||
111 | if (!brnf_probed) { | 109 | if (!brnf_probed) { |
diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c index 848c6eb55064..05249eb45082 100644 --- a/net/openvswitch/conntrack.c +++ b/net/openvswitch/conntrack.c | |||
@@ -67,6 +67,7 @@ struct ovs_conntrack_info { | |||
67 | struct md_mark mark; | 67 | struct md_mark mark; |
68 | struct md_labels labels; | 68 | struct md_labels labels; |
69 | char timeout[CTNL_TIMEOUT_NAME_MAX]; | 69 | char timeout[CTNL_TIMEOUT_NAME_MAX]; |
70 | struct nf_ct_timeout *nf_ct_timeout; | ||
70 | #if IS_ENABLED(CONFIG_NF_NAT) | 71 | #if IS_ENABLED(CONFIG_NF_NAT) |
71 | struct nf_nat_range2 range; /* Only present for SRC NAT and DST NAT. */ | 72 | struct nf_nat_range2 range; /* Only present for SRC NAT and DST NAT. */ |
72 | #endif | 73 | #endif |
@@ -524,6 +525,11 @@ static int handle_fragments(struct net *net, struct sw_flow_key *key, | |||
524 | return -EPFNOSUPPORT; | 525 | return -EPFNOSUPPORT; |
525 | } | 526 | } |
526 | 527 | ||
528 | /* The key extracted from the fragment that completed this datagram | ||
529 | * likely didn't have an L4 header, so regenerate it. | ||
530 | */ | ||
531 | ovs_flow_key_update_l3l4(skb, key); | ||
532 | |||
527 | key->ip.frag = OVS_FRAG_TYPE_NONE; | 533 | key->ip.frag = OVS_FRAG_TYPE_NONE; |
528 | skb_clear_hash(skb); | 534 | skb_clear_hash(skb); |
529 | skb->ignore_df = 1; | 535 | skb->ignore_df = 1; |
@@ -697,6 +703,14 @@ static bool skb_nfct_cached(struct net *net, | |||
697 | if (help && rcu_access_pointer(help->helper) != info->helper) | 703 | if (help && rcu_access_pointer(help->helper) != info->helper) |
698 | return false; | 704 | return false; |
699 | } | 705 | } |
706 | if (info->nf_ct_timeout) { | ||
707 | struct nf_conn_timeout *timeout_ext; | ||
708 | |||
709 | timeout_ext = nf_ct_timeout_find(ct); | ||
710 | if (!timeout_ext || info->nf_ct_timeout != | ||
711 | rcu_dereference(timeout_ext->timeout)) | ||
712 | return false; | ||
713 | } | ||
700 | /* Force conntrack entry direction to the current packet? */ | 714 | /* Force conntrack entry direction to the current packet? */ |
701 | if (info->force && CTINFO2DIR(ctinfo) != IP_CT_DIR_ORIGINAL) { | 715 | if (info->force && CTINFO2DIR(ctinfo) != IP_CT_DIR_ORIGINAL) { |
702 | /* Delete the conntrack entry if confirmed, else just release | 716 | /* Delete the conntrack entry if confirmed, else just release |
@@ -1565,7 +1579,7 @@ static int parse_ct(const struct nlattr *attr, struct ovs_conntrack_info *info, | |||
1565 | case OVS_CT_ATTR_TIMEOUT: | 1579 | case OVS_CT_ATTR_TIMEOUT: |
1566 | memcpy(info->timeout, nla_data(a), nla_len(a)); | 1580 | memcpy(info->timeout, nla_data(a), nla_len(a)); |
1567 | if (!memchr(info->timeout, '\0', nla_len(a))) { | 1581 | if (!memchr(info->timeout, '\0', nla_len(a))) { |
1568 | OVS_NLERR(log, "Invalid conntrack helper"); | 1582 | OVS_NLERR(log, "Invalid conntrack timeout"); |
1569 | return -EINVAL; | 1583 | return -EINVAL; |
1570 | } | 1584 | } |
1571 | break; | 1585 | break; |
@@ -1657,6 +1671,10 @@ int ovs_ct_copy_action(struct net *net, const struct nlattr *attr, | |||
1657 | ct_info.timeout)) | 1671 | ct_info.timeout)) |
1658 | pr_info_ratelimited("Failed to associated timeout " | 1672 | pr_info_ratelimited("Failed to associated timeout " |
1659 | "policy `%s'\n", ct_info.timeout); | 1673 | "policy `%s'\n", ct_info.timeout); |
1674 | else | ||
1675 | ct_info.nf_ct_timeout = rcu_dereference( | ||
1676 | nf_ct_timeout_find(ct_info.ct)->timeout); | ||
1677 | |||
1660 | } | 1678 | } |
1661 | 1679 | ||
1662 | if (helper) { | 1680 | if (helper) { |
diff --git a/net/openvswitch/flow.c b/net/openvswitch/flow.c index bc89e16e0505..9d81d2c7bf82 100644 --- a/net/openvswitch/flow.c +++ b/net/openvswitch/flow.c | |||
@@ -523,78 +523,15 @@ static int parse_nsh(struct sk_buff *skb, struct sw_flow_key *key) | |||
523 | } | 523 | } |
524 | 524 | ||
525 | /** | 525 | /** |
526 | * key_extract - extracts a flow key from an Ethernet frame. | 526 | * key_extract_l3l4 - extracts L3/L4 header information. |
527 | * @skb: sk_buff that contains the frame, with skb->data pointing to the | 527 | * @skb: sk_buff that contains the frame, with skb->data pointing to the |
528 | * Ethernet header | 528 | * L3 header |
529 | * @key: output flow key | 529 | * @key: output flow key |
530 | * | 530 | * |
531 | * The caller must ensure that skb->len >= ETH_HLEN. | ||
532 | * | ||
533 | * Returns 0 if successful, otherwise a negative errno value. | ||
534 | * | ||
535 | * Initializes @skb header fields as follows: | ||
536 | * | ||
537 | * - skb->mac_header: the L2 header. | ||
538 | * | ||
539 | * - skb->network_header: just past the L2 header, or just past the | ||
540 | * VLAN header, to the first byte of the L2 payload. | ||
541 | * | ||
542 | * - skb->transport_header: If key->eth.type is ETH_P_IP or ETH_P_IPV6 | ||
543 | * on output, then just past the IP header, if one is present and | ||
544 | * of a correct length, otherwise the same as skb->network_header. | ||
545 | * For other key->eth.type values it is left untouched. | ||
546 | * | ||
547 | * - skb->protocol: the type of the data starting at skb->network_header. | ||
548 | * Equals to key->eth.type. | ||
549 | */ | 531 | */ |
550 | static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | 532 | static int key_extract_l3l4(struct sk_buff *skb, struct sw_flow_key *key) |
551 | { | 533 | { |
552 | int error; | 534 | int error; |
553 | struct ethhdr *eth; | ||
554 | |||
555 | /* Flags are always used as part of stats */ | ||
556 | key->tp.flags = 0; | ||
557 | |||
558 | skb_reset_mac_header(skb); | ||
559 | |||
560 | /* Link layer. */ | ||
561 | clear_vlan(key); | ||
562 | if (ovs_key_mac_proto(key) == MAC_PROTO_NONE) { | ||
563 | if (unlikely(eth_type_vlan(skb->protocol))) | ||
564 | return -EINVAL; | ||
565 | |||
566 | skb_reset_network_header(skb); | ||
567 | key->eth.type = skb->protocol; | ||
568 | } else { | ||
569 | eth = eth_hdr(skb); | ||
570 | ether_addr_copy(key->eth.src, eth->h_source); | ||
571 | ether_addr_copy(key->eth.dst, eth->h_dest); | ||
572 | |||
573 | __skb_pull(skb, 2 * ETH_ALEN); | ||
574 | /* We are going to push all headers that we pull, so no need to | ||
575 | * update skb->csum here. | ||
576 | */ | ||
577 | |||
578 | if (unlikely(parse_vlan(skb, key))) | ||
579 | return -ENOMEM; | ||
580 | |||
581 | key->eth.type = parse_ethertype(skb); | ||
582 | if (unlikely(key->eth.type == htons(0))) | ||
583 | return -ENOMEM; | ||
584 | |||
585 | /* Multiple tagged packets need to retain TPID to satisfy | ||
586 | * skb_vlan_pop(), which will later shift the ethertype into | ||
587 | * skb->protocol. | ||
588 | */ | ||
589 | if (key->eth.cvlan.tci & htons(VLAN_CFI_MASK)) | ||
590 | skb->protocol = key->eth.cvlan.tpid; | ||
591 | else | ||
592 | skb->protocol = key->eth.type; | ||
593 | |||
594 | skb_reset_network_header(skb); | ||
595 | __skb_push(skb, skb->data - skb_mac_header(skb)); | ||
596 | } | ||
597 | skb_reset_mac_len(skb); | ||
598 | 535 | ||
599 | /* Network layer. */ | 536 | /* Network layer. */ |
600 | if (key->eth.type == htons(ETH_P_IP)) { | 537 | if (key->eth.type == htons(ETH_P_IP)) { |
@@ -623,6 +560,7 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
623 | offset = nh->frag_off & htons(IP_OFFSET); | 560 | offset = nh->frag_off & htons(IP_OFFSET); |
624 | if (offset) { | 561 | if (offset) { |
625 | key->ip.frag = OVS_FRAG_TYPE_LATER; | 562 | key->ip.frag = OVS_FRAG_TYPE_LATER; |
563 | memset(&key->tp, 0, sizeof(key->tp)); | ||
626 | return 0; | 564 | return 0; |
627 | } | 565 | } |
628 | if (nh->frag_off & htons(IP_MF) || | 566 | if (nh->frag_off & htons(IP_MF) || |
@@ -740,8 +678,10 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
740 | return error; | 678 | return error; |
741 | } | 679 | } |
742 | 680 | ||
743 | if (key->ip.frag == OVS_FRAG_TYPE_LATER) | 681 | if (key->ip.frag == OVS_FRAG_TYPE_LATER) { |
682 | memset(&key->tp, 0, sizeof(key->tp)); | ||
744 | return 0; | 683 | return 0; |
684 | } | ||
745 | if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) | 685 | if (skb_shinfo(skb)->gso_type & SKB_GSO_UDP) |
746 | key->ip.frag = OVS_FRAG_TYPE_FIRST; | 686 | key->ip.frag = OVS_FRAG_TYPE_FIRST; |
747 | 687 | ||
@@ -788,6 +728,92 @@ static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | |||
788 | return 0; | 728 | return 0; |
789 | } | 729 | } |
790 | 730 | ||
731 | /** | ||
732 | * key_extract - extracts a flow key from an Ethernet frame. | ||
733 | * @skb: sk_buff that contains the frame, with skb->data pointing to the | ||
734 | * Ethernet header | ||
735 | * @key: output flow key | ||
736 | * | ||
737 | * The caller must ensure that skb->len >= ETH_HLEN. | ||
738 | * | ||
739 | * Returns 0 if successful, otherwise a negative errno value. | ||
740 | * | ||
741 | * Initializes @skb header fields as follows: | ||
742 | * | ||
743 | * - skb->mac_header: the L2 header. | ||
744 | * | ||
745 | * - skb->network_header: just past the L2 header, or just past the | ||
746 | * VLAN header, to the first byte of the L2 payload. | ||
747 | * | ||
748 | * - skb->transport_header: If key->eth.type is ETH_P_IP or ETH_P_IPV6 | ||
749 | * on output, then just past the IP header, if one is present and | ||
750 | * of a correct length, otherwise the same as skb->network_header. | ||
751 | * For other key->eth.type values it is left untouched. | ||
752 | * | ||
753 | * - skb->protocol: the type of the data starting at skb->network_header. | ||
754 | * Equals to key->eth.type. | ||
755 | */ | ||
756 | static int key_extract(struct sk_buff *skb, struct sw_flow_key *key) | ||
757 | { | ||
758 | struct ethhdr *eth; | ||
759 | |||
760 | /* Flags are always used as part of stats */ | ||
761 | key->tp.flags = 0; | ||
762 | |||
763 | skb_reset_mac_header(skb); | ||
764 | |||
765 | /* Link layer. */ | ||
766 | clear_vlan(key); | ||
767 | if (ovs_key_mac_proto(key) == MAC_PROTO_NONE) { | ||
768 | if (unlikely(eth_type_vlan(skb->protocol))) | ||
769 | return -EINVAL; | ||
770 | |||
771 | skb_reset_network_header(skb); | ||
772 | key->eth.type = skb->protocol; | ||
773 | } else { | ||
774 | eth = eth_hdr(skb); | ||
775 | ether_addr_copy(key->eth.src, eth->h_source); | ||
776 | ether_addr_copy(key->eth.dst, eth->h_dest); | ||
777 | |||
778 | __skb_pull(skb, 2 * ETH_ALEN); | ||
779 | /* We are going to push all headers that we pull, so no need to | ||
780 | * update skb->csum here. | ||
781 | */ | ||
782 | |||
783 | if (unlikely(parse_vlan(skb, key))) | ||
784 | return -ENOMEM; | ||
785 | |||
786 | key->eth.type = parse_ethertype(skb); | ||
787 | if (unlikely(key->eth.type == htons(0))) | ||
788 | return -ENOMEM; | ||
789 | |||
790 | /* Multiple tagged packets need to retain TPID to satisfy | ||
791 | * skb_vlan_pop(), which will later shift the ethertype into | ||
792 | * skb->protocol. | ||
793 | */ | ||
794 | if (key->eth.cvlan.tci & htons(VLAN_CFI_MASK)) | ||
795 | skb->protocol = key->eth.cvlan.tpid; | ||
796 | else | ||
797 | skb->protocol = key->eth.type; | ||
798 | |||
799 | skb_reset_network_header(skb); | ||
800 | __skb_push(skb, skb->data - skb_mac_header(skb)); | ||
801 | } | ||
802 | |||
803 | skb_reset_mac_len(skb); | ||
804 | |||
805 | /* Fill out L3/L4 key info, if any */ | ||
806 | return key_extract_l3l4(skb, key); | ||
807 | } | ||
808 | |||
809 | /* In the case of conntrack fragment handling it expects L3 headers, | ||
810 | * add a helper. | ||
811 | */ | ||
812 | int ovs_flow_key_update_l3l4(struct sk_buff *skb, struct sw_flow_key *key) | ||
813 | { | ||
814 | return key_extract_l3l4(skb, key); | ||
815 | } | ||
816 | |||
791 | int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key) | 817 | int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key) |
792 | { | 818 | { |
793 | int res; | 819 | int res; |
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index a5506e2d4b7a..b830d5ff7af4 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h | |||
@@ -270,6 +270,7 @@ void ovs_flow_stats_clear(struct sw_flow *); | |||
270 | u64 ovs_flow_used_time(unsigned long flow_jiffies); | 270 | u64 ovs_flow_used_time(unsigned long flow_jiffies); |
271 | 271 | ||
272 | int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key); | 272 | int ovs_flow_key_update(struct sk_buff *skb, struct sw_flow_key *key); |
273 | int ovs_flow_key_update_l3l4(struct sk_buff *skb, struct sw_flow_key *key); | ||
273 | int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info, | 274 | int ovs_flow_key_extract(const struct ip_tunnel_info *tun_info, |
274 | struct sk_buff *skb, | 275 | struct sk_buff *skb, |
275 | struct sw_flow_key *key); | 276 | struct sw_flow_key *key); |
diff --git a/net/psample/psample.c b/net/psample/psample.c index 841f198ea1a8..66e4b61a350d 100644 --- a/net/psample/psample.c +++ b/net/psample/psample.c | |||
@@ -154,7 +154,7 @@ static void psample_group_destroy(struct psample_group *group) | |||
154 | { | 154 | { |
155 | psample_group_notify(group, PSAMPLE_CMD_DEL_GROUP); | 155 | psample_group_notify(group, PSAMPLE_CMD_DEL_GROUP); |
156 | list_del(&group->list); | 156 | list_del(&group->list); |
157 | kfree(group); | 157 | kfree_rcu(group, rcu); |
158 | } | 158 | } |
159 | 159 | ||
160 | static struct psample_group * | 160 | static struct psample_group * |
diff --git a/net/rds/ib.c b/net/rds/ib.c index ec05d91aa9a2..45acab2de0cf 100644 --- a/net/rds/ib.c +++ b/net/rds/ib.c | |||
@@ -291,7 +291,7 @@ static int rds_ib_conn_info_visitor(struct rds_connection *conn, | |||
291 | void *buffer) | 291 | void *buffer) |
292 | { | 292 | { |
293 | struct rds_info_rdma_connection *iinfo = buffer; | 293 | struct rds_info_rdma_connection *iinfo = buffer; |
294 | struct rds_ib_connection *ic; | 294 | struct rds_ib_connection *ic = conn->c_transport_data; |
295 | 295 | ||
296 | /* We will only ever look at IB transports */ | 296 | /* We will only ever look at IB transports */ |
297 | if (conn->c_trans != &rds_ib_transport) | 297 | if (conn->c_trans != &rds_ib_transport) |
@@ -301,15 +301,16 @@ static int rds_ib_conn_info_visitor(struct rds_connection *conn, | |||
301 | 301 | ||
302 | iinfo->src_addr = conn->c_laddr.s6_addr32[3]; | 302 | iinfo->src_addr = conn->c_laddr.s6_addr32[3]; |
303 | iinfo->dst_addr = conn->c_faddr.s6_addr32[3]; | 303 | iinfo->dst_addr = conn->c_faddr.s6_addr32[3]; |
304 | iinfo->tos = conn->c_tos; | 304 | if (ic) { |
305 | iinfo->tos = conn->c_tos; | ||
306 | iinfo->sl = ic->i_sl; | ||
307 | } | ||
305 | 308 | ||
306 | memset(&iinfo->src_gid, 0, sizeof(iinfo->src_gid)); | 309 | memset(&iinfo->src_gid, 0, sizeof(iinfo->src_gid)); |
307 | memset(&iinfo->dst_gid, 0, sizeof(iinfo->dst_gid)); | 310 | memset(&iinfo->dst_gid, 0, sizeof(iinfo->dst_gid)); |
308 | if (rds_conn_state(conn) == RDS_CONN_UP) { | 311 | if (rds_conn_state(conn) == RDS_CONN_UP) { |
309 | struct rds_ib_device *rds_ibdev; | 312 | struct rds_ib_device *rds_ibdev; |
310 | 313 | ||
311 | ic = conn->c_transport_data; | ||
312 | |||
313 | rdma_read_gids(ic->i_cm_id, (union ib_gid *)&iinfo->src_gid, | 314 | rdma_read_gids(ic->i_cm_id, (union ib_gid *)&iinfo->src_gid, |
314 | (union ib_gid *)&iinfo->dst_gid); | 315 | (union ib_gid *)&iinfo->dst_gid); |
315 | 316 | ||
@@ -329,7 +330,7 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn, | |||
329 | void *buffer) | 330 | void *buffer) |
330 | { | 331 | { |
331 | struct rds6_info_rdma_connection *iinfo6 = buffer; | 332 | struct rds6_info_rdma_connection *iinfo6 = buffer; |
332 | struct rds_ib_connection *ic; | 333 | struct rds_ib_connection *ic = conn->c_transport_data; |
333 | 334 | ||
334 | /* We will only ever look at IB transports */ | 335 | /* We will only ever look at IB transports */ |
335 | if (conn->c_trans != &rds_ib_transport) | 336 | if (conn->c_trans != &rds_ib_transport) |
@@ -337,6 +338,10 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn, | |||
337 | 338 | ||
338 | iinfo6->src_addr = conn->c_laddr; | 339 | iinfo6->src_addr = conn->c_laddr; |
339 | iinfo6->dst_addr = conn->c_faddr; | 340 | iinfo6->dst_addr = conn->c_faddr; |
341 | if (ic) { | ||
342 | iinfo6->tos = conn->c_tos; | ||
343 | iinfo6->sl = ic->i_sl; | ||
344 | } | ||
340 | 345 | ||
341 | memset(&iinfo6->src_gid, 0, sizeof(iinfo6->src_gid)); | 346 | memset(&iinfo6->src_gid, 0, sizeof(iinfo6->src_gid)); |
342 | memset(&iinfo6->dst_gid, 0, sizeof(iinfo6->dst_gid)); | 347 | memset(&iinfo6->dst_gid, 0, sizeof(iinfo6->dst_gid)); |
@@ -344,7 +349,6 @@ static int rds6_ib_conn_info_visitor(struct rds_connection *conn, | |||
344 | if (rds_conn_state(conn) == RDS_CONN_UP) { | 349 | if (rds_conn_state(conn) == RDS_CONN_UP) { |
345 | struct rds_ib_device *rds_ibdev; | 350 | struct rds_ib_device *rds_ibdev; |
346 | 351 | ||
347 | ic = conn->c_transport_data; | ||
348 | rdma_read_gids(ic->i_cm_id, (union ib_gid *)&iinfo6->src_gid, | 352 | rdma_read_gids(ic->i_cm_id, (union ib_gid *)&iinfo6->src_gid, |
349 | (union ib_gid *)&iinfo6->dst_gid); | 353 | (union ib_gid *)&iinfo6->dst_gid); |
350 | rds_ibdev = ic->rds_ibdev; | 354 | rds_ibdev = ic->rds_ibdev; |
diff --git a/net/rds/ib.h b/net/rds/ib.h index 303c6ee8bdb7..f2b558e8b5ea 100644 --- a/net/rds/ib.h +++ b/net/rds/ib.h | |||
@@ -220,6 +220,7 @@ struct rds_ib_connection { | |||
220 | /* Send/Recv vectors */ | 220 | /* Send/Recv vectors */ |
221 | int i_scq_vector; | 221 | int i_scq_vector; |
222 | int i_rcq_vector; | 222 | int i_rcq_vector; |
223 | u8 i_sl; | ||
223 | }; | 224 | }; |
224 | 225 | ||
225 | /* This assumes that atomic_t is at least 32 bits */ | 226 | /* This assumes that atomic_t is at least 32 bits */ |
diff --git a/net/rds/ib_cm.c b/net/rds/ib_cm.c index fddaa09f7b0d..233f1368162b 100644 --- a/net/rds/ib_cm.c +++ b/net/rds/ib_cm.c | |||
@@ -152,6 +152,9 @@ void rds_ib_cm_connect_complete(struct rds_connection *conn, struct rdma_cm_even | |||
152 | RDS_PROTOCOL_MINOR(conn->c_version), | 152 | RDS_PROTOCOL_MINOR(conn->c_version), |
153 | ic->i_flowctl ? ", flow control" : ""); | 153 | ic->i_flowctl ? ", flow control" : ""); |
154 | 154 | ||
155 | /* receive sl from the peer */ | ||
156 | ic->i_sl = ic->i_cm_id->route.path_rec->sl; | ||
157 | |||
155 | atomic_set(&ic->i_cq_quiesce, 0); | 158 | atomic_set(&ic->i_cq_quiesce, 0); |
156 | 159 | ||
157 | /* Init rings and fill recv. this needs to wait until protocol | 160 | /* Init rings and fill recv. this needs to wait until protocol |
diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c index 9986d6065c4d..5f741e51b4ba 100644 --- a/net/rds/rdma_transport.c +++ b/net/rds/rdma_transport.c | |||
@@ -43,6 +43,9 @@ static struct rdma_cm_id *rds_rdma_listen_id; | |||
43 | static struct rdma_cm_id *rds6_rdma_listen_id; | 43 | static struct rdma_cm_id *rds6_rdma_listen_id; |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* Per IB specification 7.7.3, service level is a 4-bit field. */ | ||
47 | #define TOS_TO_SL(tos) ((tos) & 0xF) | ||
48 | |||
46 | static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, | 49 | static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, |
47 | struct rdma_cm_event *event, | 50 | struct rdma_cm_event *event, |
48 | bool isv6) | 51 | bool isv6) |
@@ -97,10 +100,13 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, | |||
97 | struct rds_ib_connection *ibic; | 100 | struct rds_ib_connection *ibic; |
98 | 101 | ||
99 | ibic = conn->c_transport_data; | 102 | ibic = conn->c_transport_data; |
100 | if (ibic && ibic->i_cm_id == cm_id) | 103 | if (ibic && ibic->i_cm_id == cm_id) { |
104 | cm_id->route.path_rec[0].sl = | ||
105 | TOS_TO_SL(conn->c_tos); | ||
101 | ret = trans->cm_initiate_connect(cm_id, isv6); | 106 | ret = trans->cm_initiate_connect(cm_id, isv6); |
102 | else | 107 | } else { |
103 | rds_conn_drop(conn); | 108 | rds_conn_drop(conn); |
109 | } | ||
104 | } | 110 | } |
105 | break; | 111 | break; |
106 | 112 | ||
diff --git a/net/rds/recv.c b/net/rds/recv.c index 853de4876088..a42ba7fa06d5 100644 --- a/net/rds/recv.c +++ b/net/rds/recv.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved. | 2 | * Copyright (c) 2006, 2019 Oracle and/or its affiliates. All rights reserved. |
3 | * | 3 | * |
4 | * This software is available to you under a choice of one of two | 4 | * This software is available to you under a choice of one of two |
5 | * licenses. You may choose to be licensed under the terms of the GNU | 5 | * licenses. You may choose to be licensed under the terms of the GNU |
@@ -811,6 +811,7 @@ void rds6_inc_info_copy(struct rds_incoming *inc, | |||
811 | 811 | ||
812 | minfo6.seq = be64_to_cpu(inc->i_hdr.h_sequence); | 812 | minfo6.seq = be64_to_cpu(inc->i_hdr.h_sequence); |
813 | minfo6.len = be32_to_cpu(inc->i_hdr.h_len); | 813 | minfo6.len = be32_to_cpu(inc->i_hdr.h_len); |
814 | minfo6.tos = inc->i_conn->c_tos; | ||
814 | 815 | ||
815 | if (flip) { | 816 | if (flip) { |
816 | minfo6.laddr = *daddr; | 817 | minfo6.laddr = *daddr; |
@@ -824,6 +825,8 @@ void rds6_inc_info_copy(struct rds_incoming *inc, | |||
824 | minfo6.fport = inc->i_hdr.h_dport; | 825 | minfo6.fport = inc->i_hdr.h_dport; |
825 | } | 826 | } |
826 | 827 | ||
828 | minfo6.flags = 0; | ||
829 | |||
827 | rds_info_copy(iter, &minfo6, sizeof(minfo6)); | 830 | rds_info_copy(iter, &minfo6, sizeof(minfo6)); |
828 | } | 831 | } |
829 | #endif | 832 | #endif |
diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c index 0dbbfd1b6487..d72ddb67bb74 100644 --- a/net/rxrpc/af_rxrpc.c +++ b/net/rxrpc/af_rxrpc.c | |||
@@ -862,7 +862,6 @@ static void rxrpc_sock_destructor(struct sock *sk) | |||
862 | static int rxrpc_release_sock(struct sock *sk) | 862 | static int rxrpc_release_sock(struct sock *sk) |
863 | { | 863 | { |
864 | struct rxrpc_sock *rx = rxrpc_sk(sk); | 864 | struct rxrpc_sock *rx = rxrpc_sk(sk); |
865 | struct rxrpc_net *rxnet = rxrpc_net(sock_net(&rx->sk)); | ||
866 | 865 | ||
867 | _enter("%p{%d,%d}", sk, sk->sk_state, refcount_read(&sk->sk_refcnt)); | 866 | _enter("%p{%d,%d}", sk, sk->sk_state, refcount_read(&sk->sk_refcnt)); |
868 | 867 | ||
@@ -898,8 +897,6 @@ static int rxrpc_release_sock(struct sock *sk) | |||
898 | rxrpc_release_calls_on_socket(rx); | 897 | rxrpc_release_calls_on_socket(rx); |
899 | flush_workqueue(rxrpc_workqueue); | 898 | flush_workqueue(rxrpc_workqueue); |
900 | rxrpc_purge_queue(&sk->sk_receive_queue); | 899 | rxrpc_purge_queue(&sk->sk_receive_queue); |
901 | rxrpc_queue_work(&rxnet->service_conn_reaper); | ||
902 | rxrpc_queue_work(&rxnet->client_conn_reaper); | ||
903 | 900 | ||
904 | rxrpc_unuse_local(rx->local); | 901 | rxrpc_unuse_local(rx->local); |
905 | rx->local = NULL; | 902 | rx->local = NULL; |
diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h index 145335611af6..8051dfdcf26d 100644 --- a/net/rxrpc/ar-internal.h +++ b/net/rxrpc/ar-internal.h | |||
@@ -185,11 +185,17 @@ struct rxrpc_host_header { | |||
185 | * - max 48 bytes (struct sk_buff::cb) | 185 | * - max 48 bytes (struct sk_buff::cb) |
186 | */ | 186 | */ |
187 | struct rxrpc_skb_priv { | 187 | struct rxrpc_skb_priv { |
188 | union { | 188 | atomic_t nr_ring_pins; /* Number of rxtx ring pins */ |
189 | u8 nr_jumbo; /* Number of jumbo subpackets */ | 189 | u8 nr_subpackets; /* Number of subpackets */ |
190 | }; | 190 | u8 rx_flags; /* Received packet flags */ |
191 | #define RXRPC_SKB_INCL_LAST 0x01 /* - Includes last packet */ | ||
192 | #define RXRPC_SKB_TX_BUFFER 0x02 /* - Is transmit buffer */ | ||
191 | union { | 193 | union { |
192 | int remain; /* amount of space remaining for next write */ | 194 | int remain; /* amount of space remaining for next write */ |
195 | |||
196 | /* List of requested ACKs on subpackets */ | ||
197 | unsigned long rx_req_ack[(RXRPC_MAX_NR_JUMBO + BITS_PER_LONG - 1) / | ||
198 | BITS_PER_LONG]; | ||
193 | }; | 199 | }; |
194 | 200 | ||
195 | struct rxrpc_host_header hdr; /* RxRPC packet header from this packet */ | 201 | struct rxrpc_host_header hdr; /* RxRPC packet header from this packet */ |
@@ -613,8 +619,7 @@ struct rxrpc_call { | |||
613 | #define RXRPC_TX_ANNO_LAST 0x04 | 619 | #define RXRPC_TX_ANNO_LAST 0x04 |
614 | #define RXRPC_TX_ANNO_RESENT 0x08 | 620 | #define RXRPC_TX_ANNO_RESENT 0x08 |
615 | 621 | ||
616 | #define RXRPC_RX_ANNO_JUMBO 0x3f /* Jumbo subpacket number + 1 if not zero */ | 622 | #define RXRPC_RX_ANNO_SUBPACKET 0x3f /* Subpacket number in jumbogram */ |
617 | #define RXRPC_RX_ANNO_JLAST 0x40 /* Set if last element of a jumbo packet */ | ||
618 | #define RXRPC_RX_ANNO_VERIFIED 0x80 /* Set if verified and decrypted */ | 623 | #define RXRPC_RX_ANNO_VERIFIED 0x80 /* Set if verified and decrypted */ |
619 | rxrpc_seq_t tx_hard_ack; /* Dead slot in buffer; the first transmitted but | 624 | rxrpc_seq_t tx_hard_ack; /* Dead slot in buffer; the first transmitted but |
620 | * not hard-ACK'd packet follows this. | 625 | * not hard-ACK'd packet follows this. |
@@ -905,6 +910,7 @@ void rxrpc_disconnect_client_call(struct rxrpc_call *); | |||
905 | void rxrpc_put_client_conn(struct rxrpc_connection *); | 910 | void rxrpc_put_client_conn(struct rxrpc_connection *); |
906 | void rxrpc_discard_expired_client_conns(struct work_struct *); | 911 | void rxrpc_discard_expired_client_conns(struct work_struct *); |
907 | void rxrpc_destroy_all_client_connections(struct rxrpc_net *); | 912 | void rxrpc_destroy_all_client_connections(struct rxrpc_net *); |
913 | void rxrpc_clean_up_local_conns(struct rxrpc_local *); | ||
908 | 914 | ||
909 | /* | 915 | /* |
910 | * conn_event.c | 916 | * conn_event.c |
@@ -1105,6 +1111,7 @@ void rxrpc_kernel_data_consumed(struct rxrpc_call *, struct sk_buff *); | |||
1105 | void rxrpc_packet_destructor(struct sk_buff *); | 1111 | void rxrpc_packet_destructor(struct sk_buff *); |
1106 | void rxrpc_new_skb(struct sk_buff *, enum rxrpc_skb_trace); | 1112 | void rxrpc_new_skb(struct sk_buff *, enum rxrpc_skb_trace); |
1107 | void rxrpc_see_skb(struct sk_buff *, enum rxrpc_skb_trace); | 1113 | void rxrpc_see_skb(struct sk_buff *, enum rxrpc_skb_trace); |
1114 | void rxrpc_eaten_skb(struct sk_buff *, enum rxrpc_skb_trace); | ||
1108 | void rxrpc_get_skb(struct sk_buff *, enum rxrpc_skb_trace); | 1115 | void rxrpc_get_skb(struct sk_buff *, enum rxrpc_skb_trace); |
1109 | void rxrpc_free_skb(struct sk_buff *, enum rxrpc_skb_trace); | 1116 | void rxrpc_free_skb(struct sk_buff *, enum rxrpc_skb_trace); |
1110 | void rxrpc_purge_queue(struct sk_buff_head *); | 1117 | void rxrpc_purge_queue(struct sk_buff_head *); |
diff --git a/net/rxrpc/call_event.c b/net/rxrpc/call_event.c index c767679bfa5d..cedbbb3a7c2e 100644 --- a/net/rxrpc/call_event.c +++ b/net/rxrpc/call_event.c | |||
@@ -199,7 +199,7 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j) | |||
199 | continue; | 199 | continue; |
200 | 200 | ||
201 | skb = call->rxtx_buffer[ix]; | 201 | skb = call->rxtx_buffer[ix]; |
202 | rxrpc_see_skb(skb, rxrpc_skb_tx_seen); | 202 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
203 | 203 | ||
204 | if (anno_type == RXRPC_TX_ANNO_UNACK) { | 204 | if (anno_type == RXRPC_TX_ANNO_UNACK) { |
205 | if (ktime_after(skb->tstamp, max_age)) { | 205 | if (ktime_after(skb->tstamp, max_age)) { |
@@ -255,18 +255,18 @@ static void rxrpc_resend(struct rxrpc_call *call, unsigned long now_j) | |||
255 | continue; | 255 | continue; |
256 | 256 | ||
257 | skb = call->rxtx_buffer[ix]; | 257 | skb = call->rxtx_buffer[ix]; |
258 | rxrpc_get_skb(skb, rxrpc_skb_tx_got); | 258 | rxrpc_get_skb(skb, rxrpc_skb_got); |
259 | spin_unlock_bh(&call->lock); | 259 | spin_unlock_bh(&call->lock); |
260 | 260 | ||
261 | if (rxrpc_send_data_packet(call, skb, true) < 0) { | 261 | if (rxrpc_send_data_packet(call, skb, true) < 0) { |
262 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 262 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
263 | return; | 263 | return; |
264 | } | 264 | } |
265 | 265 | ||
266 | if (rxrpc_is_client_call(call)) | 266 | if (rxrpc_is_client_call(call)) |
267 | rxrpc_expose_client_call(call); | 267 | rxrpc_expose_client_call(call); |
268 | 268 | ||
269 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 269 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
270 | spin_lock_bh(&call->lock); | 270 | spin_lock_bh(&call->lock); |
271 | 271 | ||
272 | /* We need to clear the retransmit state, but there are two | 272 | /* We need to clear the retransmit state, but there are two |
diff --git a/net/rxrpc/call_object.c b/net/rxrpc/call_object.c index 217b12be9e08..014548c259ce 100644 --- a/net/rxrpc/call_object.c +++ b/net/rxrpc/call_object.c | |||
@@ -422,6 +422,19 @@ void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op) | |||
422 | } | 422 | } |
423 | 423 | ||
424 | /* | 424 | /* |
425 | * Clean up the RxTx skb ring. | ||
426 | */ | ||
427 | static void rxrpc_cleanup_ring(struct rxrpc_call *call) | ||
428 | { | ||
429 | int i; | ||
430 | |||
431 | for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) { | ||
432 | rxrpc_free_skb(call->rxtx_buffer[i], rxrpc_skb_cleaned); | ||
433 | call->rxtx_buffer[i] = NULL; | ||
434 | } | ||
435 | } | ||
436 | |||
437 | /* | ||
425 | * Detach a call from its owning socket. | 438 | * Detach a call from its owning socket. |
426 | */ | 439 | */ |
427 | void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) | 440 | void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) |
@@ -429,7 +442,6 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) | |||
429 | const void *here = __builtin_return_address(0); | 442 | const void *here = __builtin_return_address(0); |
430 | struct rxrpc_connection *conn = call->conn; | 443 | struct rxrpc_connection *conn = call->conn; |
431 | bool put = false; | 444 | bool put = false; |
432 | int i; | ||
433 | 445 | ||
434 | _enter("{%d,%d}", call->debug_id, atomic_read(&call->usage)); | 446 | _enter("{%d,%d}", call->debug_id, atomic_read(&call->usage)); |
435 | 447 | ||
@@ -479,13 +491,7 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call) | |||
479 | if (conn) | 491 | if (conn) |
480 | rxrpc_disconnect_call(call); | 492 | rxrpc_disconnect_call(call); |
481 | 493 | ||
482 | for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) { | 494 | rxrpc_cleanup_ring(call); |
483 | rxrpc_free_skb(call->rxtx_buffer[i], | ||
484 | (call->tx_phase ? rxrpc_skb_tx_cleaned : | ||
485 | rxrpc_skb_rx_cleaned)); | ||
486 | call->rxtx_buffer[i] = NULL; | ||
487 | } | ||
488 | |||
489 | _leave(""); | 495 | _leave(""); |
490 | } | 496 | } |
491 | 497 | ||
@@ -568,8 +574,6 @@ static void rxrpc_rcu_destroy_call(struct rcu_head *rcu) | |||
568 | */ | 574 | */ |
569 | void rxrpc_cleanup_call(struct rxrpc_call *call) | 575 | void rxrpc_cleanup_call(struct rxrpc_call *call) |
570 | { | 576 | { |
571 | int i; | ||
572 | |||
573 | _net("DESTROY CALL %d", call->debug_id); | 577 | _net("DESTROY CALL %d", call->debug_id); |
574 | 578 | ||
575 | memset(&call->sock_node, 0xcd, sizeof(call->sock_node)); | 579 | memset(&call->sock_node, 0xcd, sizeof(call->sock_node)); |
@@ -580,13 +584,8 @@ void rxrpc_cleanup_call(struct rxrpc_call *call) | |||
580 | ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags)); | 584 | ASSERT(test_bit(RXRPC_CALL_RELEASED, &call->flags)); |
581 | ASSERTCMP(call->conn, ==, NULL); | 585 | ASSERTCMP(call->conn, ==, NULL); |
582 | 586 | ||
583 | /* Clean up the Rx/Tx buffer */ | 587 | rxrpc_cleanup_ring(call); |
584 | for (i = 0; i < RXRPC_RXTX_BUFF_SIZE; i++) | 588 | rxrpc_free_skb(call->tx_pending, rxrpc_skb_cleaned); |
585 | rxrpc_free_skb(call->rxtx_buffer[i], | ||
586 | (call->tx_phase ? rxrpc_skb_tx_cleaned : | ||
587 | rxrpc_skb_rx_cleaned)); | ||
588 | |||
589 | rxrpc_free_skb(call->tx_pending, rxrpc_skb_tx_cleaned); | ||
590 | 589 | ||
591 | call_rcu(&call->rcu, rxrpc_rcu_destroy_call); | 590 | call_rcu(&call->rcu, rxrpc_rcu_destroy_call); |
592 | } | 591 | } |
diff --git a/net/rxrpc/conn_client.c b/net/rxrpc/conn_client.c index aea82f909c60..3f1da1b49f69 100644 --- a/net/rxrpc/conn_client.c +++ b/net/rxrpc/conn_client.c | |||
@@ -1162,3 +1162,47 @@ void rxrpc_destroy_all_client_connections(struct rxrpc_net *rxnet) | |||
1162 | 1162 | ||
1163 | _leave(""); | 1163 | _leave(""); |
1164 | } | 1164 | } |
1165 | |||
1166 | /* | ||
1167 | * Clean up the client connections on a local endpoint. | ||
1168 | */ | ||
1169 | void rxrpc_clean_up_local_conns(struct rxrpc_local *local) | ||
1170 | { | ||
1171 | struct rxrpc_connection *conn, *tmp; | ||
1172 | struct rxrpc_net *rxnet = local->rxnet; | ||
1173 | unsigned int nr_active; | ||
1174 | LIST_HEAD(graveyard); | ||
1175 | |||
1176 | _enter(""); | ||
1177 | |||
1178 | spin_lock(&rxnet->client_conn_cache_lock); | ||
1179 | nr_active = rxnet->nr_active_client_conns; | ||
1180 | |||
1181 | list_for_each_entry_safe(conn, tmp, &rxnet->idle_client_conns, | ||
1182 | cache_link) { | ||
1183 | if (conn->params.local == local) { | ||
1184 | ASSERTCMP(conn->cache_state, ==, RXRPC_CONN_CLIENT_IDLE); | ||
1185 | |||
1186 | trace_rxrpc_client(conn, -1, rxrpc_client_discard); | ||
1187 | if (!test_and_clear_bit(RXRPC_CONN_EXPOSED, &conn->flags)) | ||
1188 | BUG(); | ||
1189 | conn->cache_state = RXRPC_CONN_CLIENT_INACTIVE; | ||
1190 | list_move(&conn->cache_link, &graveyard); | ||
1191 | nr_active--; | ||
1192 | } | ||
1193 | } | ||
1194 | |||
1195 | rxnet->nr_active_client_conns = nr_active; | ||
1196 | spin_unlock(&rxnet->client_conn_cache_lock); | ||
1197 | ASSERTCMP(nr_active, >=, 0); | ||
1198 | |||
1199 | while (!list_empty(&graveyard)) { | ||
1200 | conn = list_entry(graveyard.next, | ||
1201 | struct rxrpc_connection, cache_link); | ||
1202 | list_del_init(&conn->cache_link); | ||
1203 | |||
1204 | rxrpc_put_connection(conn); | ||
1205 | } | ||
1206 | |||
1207 | _leave(" [culled]"); | ||
1208 | } | ||
diff --git a/net/rxrpc/conn_event.c b/net/rxrpc/conn_event.c index df6624c140be..a1ceef4f5cd0 100644 --- a/net/rxrpc/conn_event.c +++ b/net/rxrpc/conn_event.c | |||
@@ -472,7 +472,7 @@ void rxrpc_process_connection(struct work_struct *work) | |||
472 | /* go through the conn-level event packets, releasing the ref on this | 472 | /* go through the conn-level event packets, releasing the ref on this |
473 | * connection that each one has when we've finished with it */ | 473 | * connection that each one has when we've finished with it */ |
474 | while ((skb = skb_dequeue(&conn->rx_queue))) { | 474 | while ((skb = skb_dequeue(&conn->rx_queue))) { |
475 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); | 475 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
476 | ret = rxrpc_process_event(conn, skb, &abort_code); | 476 | ret = rxrpc_process_event(conn, skb, &abort_code); |
477 | switch (ret) { | 477 | switch (ret) { |
478 | case -EPROTO: | 478 | case -EPROTO: |
@@ -484,7 +484,7 @@ void rxrpc_process_connection(struct work_struct *work) | |||
484 | goto requeue_and_leave; | 484 | goto requeue_and_leave; |
485 | case -ECONNABORTED: | 485 | case -ECONNABORTED: |
486 | default: | 486 | default: |
487 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 487 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
488 | break; | 488 | break; |
489 | } | 489 | } |
490 | } | 490 | } |
@@ -501,6 +501,6 @@ requeue_and_leave: | |||
501 | protocol_error: | 501 | protocol_error: |
502 | if (rxrpc_abort_connection(conn, ret, abort_code) < 0) | 502 | if (rxrpc_abort_connection(conn, ret, abort_code) < 0) |
503 | goto requeue_and_leave; | 503 | goto requeue_and_leave; |
504 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 504 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
505 | goto out; | 505 | goto out; |
506 | } | 506 | } |
diff --git a/net/rxrpc/conn_object.c b/net/rxrpc/conn_object.c index 434ef392212b..ed05b6922132 100644 --- a/net/rxrpc/conn_object.c +++ b/net/rxrpc/conn_object.c | |||
@@ -398,7 +398,7 @@ void rxrpc_service_connection_reaper(struct work_struct *work) | |||
398 | if (conn->state == RXRPC_CONN_SERVICE_PREALLOC) | 398 | if (conn->state == RXRPC_CONN_SERVICE_PREALLOC) |
399 | continue; | 399 | continue; |
400 | 400 | ||
401 | if (rxnet->live) { | 401 | if (rxnet->live && !conn->params.local->dead) { |
402 | idle_timestamp = READ_ONCE(conn->idle_timestamp); | 402 | idle_timestamp = READ_ONCE(conn->idle_timestamp); |
403 | expire_at = idle_timestamp + rxrpc_connection_expiry * HZ; | 403 | expire_at = idle_timestamp + rxrpc_connection_expiry * HZ; |
404 | if (conn->params.local->service_closed) | 404 | if (conn->params.local->service_closed) |
diff --git a/net/rxrpc/input.c b/net/rxrpc/input.c index dd47d465d1d3..d122c53c8697 100644 --- a/net/rxrpc/input.c +++ b/net/rxrpc/input.c | |||
@@ -233,7 +233,7 @@ static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | |||
233 | ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; | 233 | ix = call->tx_hard_ack & RXRPC_RXTX_BUFF_MASK; |
234 | skb = call->rxtx_buffer[ix]; | 234 | skb = call->rxtx_buffer[ix]; |
235 | annotation = call->rxtx_annotations[ix]; | 235 | annotation = call->rxtx_annotations[ix]; |
236 | rxrpc_see_skb(skb, rxrpc_skb_tx_rotated); | 236 | rxrpc_see_skb(skb, rxrpc_skb_rotated); |
237 | call->rxtx_buffer[ix] = NULL; | 237 | call->rxtx_buffer[ix] = NULL; |
238 | call->rxtx_annotations[ix] = 0; | 238 | call->rxtx_annotations[ix] = 0; |
239 | skb->next = list; | 239 | skb->next = list; |
@@ -258,7 +258,7 @@ static bool rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, | |||
258 | skb = list; | 258 | skb = list; |
259 | list = skb->next; | 259 | list = skb->next; |
260 | skb_mark_not_on_list(skb); | 260 | skb_mark_not_on_list(skb); |
261 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 261 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
262 | } | 262 | } |
263 | 263 | ||
264 | return rot_last; | 264 | return rot_last; |
@@ -347,7 +347,7 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call) | |||
347 | } | 347 | } |
348 | 348 | ||
349 | /* | 349 | /* |
350 | * Scan a jumbo packet to validate its structure and to work out how many | 350 | * Scan a data packet to validate its structure and to work out how many |
351 | * subpackets it contains. | 351 | * subpackets it contains. |
352 | * | 352 | * |
353 | * A jumbo packet is a collection of consecutive packets glued together with | 353 | * A jumbo packet is a collection of consecutive packets glued together with |
@@ -358,16 +358,21 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call) | |||
358 | * the last are RXRPC_JUMBO_DATALEN in size. The last subpacket may be of any | 358 | * the last are RXRPC_JUMBO_DATALEN in size. The last subpacket may be of any |
359 | * size. | 359 | * size. |
360 | */ | 360 | */ |
361 | static bool rxrpc_validate_jumbo(struct sk_buff *skb) | 361 | static bool rxrpc_validate_data(struct sk_buff *skb) |
362 | { | 362 | { |
363 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 363 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
364 | unsigned int offset = sizeof(struct rxrpc_wire_header); | 364 | unsigned int offset = sizeof(struct rxrpc_wire_header); |
365 | unsigned int len = skb->len; | 365 | unsigned int len = skb->len; |
366 | int nr_jumbo = 1; | ||
367 | u8 flags = sp->hdr.flags; | 366 | u8 flags = sp->hdr.flags; |
368 | 367 | ||
369 | do { | 368 | for (;;) { |
370 | nr_jumbo++; | 369 | if (flags & RXRPC_REQUEST_ACK) |
370 | __set_bit(sp->nr_subpackets, sp->rx_req_ack); | ||
371 | sp->nr_subpackets++; | ||
372 | |||
373 | if (!(flags & RXRPC_JUMBO_PACKET)) | ||
374 | break; | ||
375 | |||
371 | if (len - offset < RXRPC_JUMBO_SUBPKTLEN) | 376 | if (len - offset < RXRPC_JUMBO_SUBPKTLEN) |
372 | goto protocol_error; | 377 | goto protocol_error; |
373 | if (flags & RXRPC_LAST_PACKET) | 378 | if (flags & RXRPC_LAST_PACKET) |
@@ -376,9 +381,10 @@ static bool rxrpc_validate_jumbo(struct sk_buff *skb) | |||
376 | if (skb_copy_bits(skb, offset, &flags, 1) < 0) | 381 | if (skb_copy_bits(skb, offset, &flags, 1) < 0) |
377 | goto protocol_error; | 382 | goto protocol_error; |
378 | offset += sizeof(struct rxrpc_jumbo_header); | 383 | offset += sizeof(struct rxrpc_jumbo_header); |
379 | } while (flags & RXRPC_JUMBO_PACKET); | 384 | } |
380 | 385 | ||
381 | sp->nr_jumbo = nr_jumbo; | 386 | if (flags & RXRPC_LAST_PACKET) |
387 | sp->rx_flags |= RXRPC_SKB_INCL_LAST; | ||
382 | return true; | 388 | return true; |
383 | 389 | ||
384 | protocol_error: | 390 | protocol_error: |
@@ -399,10 +405,10 @@ protocol_error: | |||
399 | * (that information is encoded in the ACK packet). | 405 | * (that information is encoded in the ACK packet). |
400 | */ | 406 | */ |
401 | static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq, | 407 | static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq, |
402 | u8 annotation, bool *_jumbo_bad) | 408 | bool is_jumbo, bool *_jumbo_bad) |
403 | { | 409 | { |
404 | /* Discard normal packets that are duplicates. */ | 410 | /* Discard normal packets that are duplicates. */ |
405 | if (annotation == 0) | 411 | if (is_jumbo) |
406 | return; | 412 | return; |
407 | 413 | ||
408 | /* Skip jumbo subpackets that are duplicates. When we've had three or | 414 | /* Skip jumbo subpackets that are duplicates. When we've had three or |
@@ -416,29 +422,30 @@ static void rxrpc_input_dup_data(struct rxrpc_call *call, rxrpc_seq_t seq, | |||
416 | } | 422 | } |
417 | 423 | ||
418 | /* | 424 | /* |
419 | * Process a DATA packet, adding the packet to the Rx ring. | 425 | * Process a DATA packet, adding the packet to the Rx ring. The caller's |
426 | * packet ref must be passed on or discarded. | ||
420 | */ | 427 | */ |
421 | static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) | 428 | static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) |
422 | { | 429 | { |
423 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 430 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
424 | enum rxrpc_call_state state; | 431 | enum rxrpc_call_state state; |
425 | unsigned int offset = sizeof(struct rxrpc_wire_header); | 432 | unsigned int j; |
426 | unsigned int ix; | ||
427 | rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0; | 433 | rxrpc_serial_t serial = sp->hdr.serial, ack_serial = 0; |
428 | rxrpc_seq_t seq = sp->hdr.seq, hard_ack; | 434 | rxrpc_seq_t seq0 = sp->hdr.seq, hard_ack; |
429 | bool immediate_ack = false, jumbo_bad = false, queued; | 435 | bool immediate_ack = false, jumbo_bad = false; |
430 | u16 len; | 436 | u8 ack = 0; |
431 | u8 ack = 0, flags, annotation = 0; | ||
432 | 437 | ||
433 | _enter("{%u,%u},{%u,%u}", | 438 | _enter("{%u,%u},{%u,%u}", |
434 | call->rx_hard_ack, call->rx_top, skb->len, seq); | 439 | call->rx_hard_ack, call->rx_top, skb->len, seq0); |
435 | 440 | ||
436 | _proto("Rx DATA %%%u { #%u f=%02x }", | 441 | _proto("Rx DATA %%%u { #%u f=%02x n=%u }", |
437 | sp->hdr.serial, seq, sp->hdr.flags); | 442 | sp->hdr.serial, seq0, sp->hdr.flags, sp->nr_subpackets); |
438 | 443 | ||
439 | state = READ_ONCE(call->state); | 444 | state = READ_ONCE(call->state); |
440 | if (state >= RXRPC_CALL_COMPLETE) | 445 | if (state >= RXRPC_CALL_COMPLETE) { |
446 | rxrpc_free_skb(skb, rxrpc_skb_freed); | ||
441 | return; | 447 | return; |
448 | } | ||
442 | 449 | ||
443 | if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { | 450 | if (call->state == RXRPC_CALL_SERVER_RECV_REQUEST) { |
444 | unsigned long timo = READ_ONCE(call->next_req_timo); | 451 | unsigned long timo = READ_ONCE(call->next_req_timo); |
@@ -463,137 +470,137 @@ static void rxrpc_input_data(struct rxrpc_call *call, struct sk_buff *skb) | |||
463 | !rxrpc_receiving_reply(call)) | 470 | !rxrpc_receiving_reply(call)) |
464 | goto unlock; | 471 | goto unlock; |
465 | 472 | ||
466 | call->ackr_prev_seq = seq; | 473 | call->ackr_prev_seq = seq0; |
467 | |||
468 | hard_ack = READ_ONCE(call->rx_hard_ack); | 474 | hard_ack = READ_ONCE(call->rx_hard_ack); |
469 | if (after(seq, hard_ack + call->rx_winsize)) { | ||
470 | ack = RXRPC_ACK_EXCEEDS_WINDOW; | ||
471 | ack_serial = serial; | ||
472 | goto ack; | ||
473 | } | ||
474 | 475 | ||
475 | flags = sp->hdr.flags; | 476 | if (sp->nr_subpackets > 1) { |
476 | if (flags & RXRPC_JUMBO_PACKET) { | ||
477 | if (call->nr_jumbo_bad > 3) { | 477 | if (call->nr_jumbo_bad > 3) { |
478 | ack = RXRPC_ACK_NOSPACE; | 478 | ack = RXRPC_ACK_NOSPACE; |
479 | ack_serial = serial; | 479 | ack_serial = serial; |
480 | goto ack; | 480 | goto ack; |
481 | } | 481 | } |
482 | annotation = 1; | ||
483 | } | 482 | } |
484 | 483 | ||
485 | next_subpacket: | 484 | for (j = 0; j < sp->nr_subpackets; j++) { |
486 | queued = false; | 485 | rxrpc_serial_t serial = sp->hdr.serial + j; |
487 | ix = seq & RXRPC_RXTX_BUFF_MASK; | 486 | rxrpc_seq_t seq = seq0 + j; |
488 | len = skb->len; | 487 | unsigned int ix = seq & RXRPC_RXTX_BUFF_MASK; |
489 | if (flags & RXRPC_JUMBO_PACKET) | 488 | bool terminal = (j == sp->nr_subpackets - 1); |
490 | len = RXRPC_JUMBO_DATALEN; | 489 | bool last = terminal && (sp->rx_flags & RXRPC_SKB_INCL_LAST); |
491 | 490 | u8 flags, annotation = j; | |
492 | if (flags & RXRPC_LAST_PACKET) { | 491 | |
493 | if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && | 492 | _proto("Rx DATA+%u %%%u { #%x t=%u l=%u }", |
494 | seq != call->rx_top) { | 493 | j, serial, seq, terminal, last); |
495 | rxrpc_proto_abort("LSN", call, seq); | 494 | |
496 | goto unlock; | 495 | if (last) { |
497 | } | 496 | if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && |
498 | } else { | 497 | seq != call->rx_top) { |
499 | if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && | 498 | rxrpc_proto_abort("LSN", call, seq); |
500 | after_eq(seq, call->rx_top)) { | 499 | goto unlock; |
501 | rxrpc_proto_abort("LSA", call, seq); | 500 | } |
502 | goto unlock; | 501 | } else { |
502 | if (test_bit(RXRPC_CALL_RX_LAST, &call->flags) && | ||
503 | after_eq(seq, call->rx_top)) { | ||
504 | rxrpc_proto_abort("LSA", call, seq); | ||
505 | goto unlock; | ||
506 | } | ||
503 | } | 507 | } |
504 | } | ||
505 | 508 | ||
506 | trace_rxrpc_rx_data(call->debug_id, seq, serial, flags, annotation); | 509 | flags = 0; |
507 | if (before_eq(seq, hard_ack)) { | 510 | if (last) |
508 | ack = RXRPC_ACK_DUPLICATE; | 511 | flags |= RXRPC_LAST_PACKET; |
509 | ack_serial = serial; | 512 | if (!terminal) |
510 | goto skip; | 513 | flags |= RXRPC_JUMBO_PACKET; |
511 | } | 514 | if (test_bit(j, sp->rx_req_ack)) |
515 | flags |= RXRPC_REQUEST_ACK; | ||
516 | trace_rxrpc_rx_data(call->debug_id, seq, serial, flags, annotation); | ||
512 | 517 | ||
513 | if (flags & RXRPC_REQUEST_ACK && !ack) { | 518 | if (before_eq(seq, hard_ack)) { |
514 | ack = RXRPC_ACK_REQUESTED; | ||
515 | ack_serial = serial; | ||
516 | } | ||
517 | |||
518 | if (call->rxtx_buffer[ix]) { | ||
519 | rxrpc_input_dup_data(call, seq, annotation, &jumbo_bad); | ||
520 | if (ack != RXRPC_ACK_DUPLICATE) { | ||
521 | ack = RXRPC_ACK_DUPLICATE; | 519 | ack = RXRPC_ACK_DUPLICATE; |
522 | ack_serial = serial; | 520 | ack_serial = serial; |
521 | continue; | ||
523 | } | 522 | } |
524 | immediate_ack = true; | ||
525 | goto skip; | ||
526 | } | ||
527 | 523 | ||
528 | /* Queue the packet. We use a couple of memory barriers here as need | 524 | if (call->rxtx_buffer[ix]) { |
529 | * to make sure that rx_top is perceived to be set after the buffer | 525 | rxrpc_input_dup_data(call, seq, sp->nr_subpackets > 1, |
530 | * pointer and that the buffer pointer is set after the annotation and | 526 | &jumbo_bad); |
531 | * the skb data. | 527 | if (ack != RXRPC_ACK_DUPLICATE) { |
532 | * | 528 | ack = RXRPC_ACK_DUPLICATE; |
533 | * Barriers against rxrpc_recvmsg_data() and rxrpc_rotate_rx_window() | 529 | ack_serial = serial; |
534 | * and also rxrpc_fill_out_ack(). | 530 | } |
535 | */ | 531 | immediate_ack = true; |
536 | rxrpc_get_skb(skb, rxrpc_skb_rx_got); | 532 | continue; |
537 | call->rxtx_annotations[ix] = annotation; | ||
538 | smp_wmb(); | ||
539 | call->rxtx_buffer[ix] = skb; | ||
540 | if (after(seq, call->rx_top)) { | ||
541 | smp_store_release(&call->rx_top, seq); | ||
542 | } else if (before(seq, call->rx_top)) { | ||
543 | /* Send an immediate ACK if we fill in a hole */ | ||
544 | if (!ack) { | ||
545 | ack = RXRPC_ACK_DELAY; | ||
546 | ack_serial = serial; | ||
547 | } | 533 | } |
548 | immediate_ack = true; | ||
549 | } | ||
550 | if (flags & RXRPC_LAST_PACKET) { | ||
551 | set_bit(RXRPC_CALL_RX_LAST, &call->flags); | ||
552 | trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq); | ||
553 | } else { | ||
554 | trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq); | ||
555 | } | ||
556 | queued = true; | ||
557 | 534 | ||
558 | if (after_eq(seq, call->rx_expect_next)) { | ||
559 | if (after(seq, call->rx_expect_next)) { | ||
560 | _net("OOS %u > %u", seq, call->rx_expect_next); | ||
561 | ack = RXRPC_ACK_OUT_OF_SEQUENCE; | ||
562 | ack_serial = serial; | ||
563 | } | ||
564 | call->rx_expect_next = seq + 1; | ||
565 | } | ||
566 | |||
567 | skip: | ||
568 | offset += len; | ||
569 | if (flags & RXRPC_JUMBO_PACKET) { | ||
570 | if (skb_copy_bits(skb, offset, &flags, 1) < 0) { | ||
571 | rxrpc_proto_abort("XJF", call, seq); | ||
572 | goto unlock; | ||
573 | } | ||
574 | offset += sizeof(struct rxrpc_jumbo_header); | ||
575 | seq++; | ||
576 | serial++; | ||
577 | annotation++; | ||
578 | if (flags & RXRPC_JUMBO_PACKET) | ||
579 | annotation |= RXRPC_RX_ANNO_JLAST; | ||
580 | if (after(seq, hard_ack + call->rx_winsize)) { | 535 | if (after(seq, hard_ack + call->rx_winsize)) { |
581 | ack = RXRPC_ACK_EXCEEDS_WINDOW; | 536 | ack = RXRPC_ACK_EXCEEDS_WINDOW; |
582 | ack_serial = serial; | 537 | ack_serial = serial; |
583 | if (!jumbo_bad) { | 538 | if (flags & RXRPC_JUMBO_PACKET) { |
584 | call->nr_jumbo_bad++; | 539 | if (!jumbo_bad) { |
585 | jumbo_bad = true; | 540 | call->nr_jumbo_bad++; |
541 | jumbo_bad = true; | ||
542 | } | ||
586 | } | 543 | } |
544 | |||
587 | goto ack; | 545 | goto ack; |
588 | } | 546 | } |
589 | 547 | ||
590 | _proto("Rx DATA Jumbo %%%u", serial); | 548 | if (flags & RXRPC_REQUEST_ACK && !ack) { |
591 | goto next_subpacket; | 549 | ack = RXRPC_ACK_REQUESTED; |
592 | } | 550 | ack_serial = serial; |
551 | } | ||
552 | |||
553 | /* Queue the packet. We use a couple of memory barriers here as need | ||
554 | * to make sure that rx_top is perceived to be set after the buffer | ||
555 | * pointer and that the buffer pointer is set after the annotation and | ||
556 | * the skb data. | ||
557 | * | ||
558 | * Barriers against rxrpc_recvmsg_data() and rxrpc_rotate_rx_window() | ||
559 | * and also rxrpc_fill_out_ack(). | ||
560 | */ | ||
561 | if (!terminal) | ||
562 | rxrpc_get_skb(skb, rxrpc_skb_got); | ||
563 | call->rxtx_annotations[ix] = annotation; | ||
564 | smp_wmb(); | ||
565 | call->rxtx_buffer[ix] = skb; | ||
566 | if (after(seq, call->rx_top)) { | ||
567 | smp_store_release(&call->rx_top, seq); | ||
568 | } else if (before(seq, call->rx_top)) { | ||
569 | /* Send an immediate ACK if we fill in a hole */ | ||
570 | if (!ack) { | ||
571 | ack = RXRPC_ACK_DELAY; | ||
572 | ack_serial = serial; | ||
573 | } | ||
574 | immediate_ack = true; | ||
575 | } | ||
576 | |||
577 | if (terminal) { | ||
578 | /* From this point on, we're not allowed to touch the | ||
579 | * packet any longer as its ref now belongs to the Rx | ||
580 | * ring. | ||
581 | */ | ||
582 | skb = NULL; | ||
583 | } | ||
593 | 584 | ||
594 | if (queued && flags & RXRPC_LAST_PACKET && !ack) { | 585 | if (last) { |
595 | ack = RXRPC_ACK_DELAY; | 586 | set_bit(RXRPC_CALL_RX_LAST, &call->flags); |
596 | ack_serial = serial; | 587 | if (!ack) { |
588 | ack = RXRPC_ACK_DELAY; | ||
589 | ack_serial = serial; | ||
590 | } | ||
591 | trace_rxrpc_receive(call, rxrpc_receive_queue_last, serial, seq); | ||
592 | } else { | ||
593 | trace_rxrpc_receive(call, rxrpc_receive_queue, serial, seq); | ||
594 | } | ||
595 | |||
596 | if (after_eq(seq, call->rx_expect_next)) { | ||
597 | if (after(seq, call->rx_expect_next)) { | ||
598 | _net("OOS %u > %u", seq, call->rx_expect_next); | ||
599 | ack = RXRPC_ACK_OUT_OF_SEQUENCE; | ||
600 | ack_serial = serial; | ||
601 | } | ||
602 | call->rx_expect_next = seq + 1; | ||
603 | } | ||
597 | } | 604 | } |
598 | 605 | ||
599 | ack: | 606 | ack: |
@@ -606,13 +613,14 @@ ack: | |||
606 | false, true, | 613 | false, true, |
607 | rxrpc_propose_ack_input_data); | 614 | rxrpc_propose_ack_input_data); |
608 | 615 | ||
609 | if (sp->hdr.seq == READ_ONCE(call->rx_hard_ack) + 1) { | 616 | if (seq0 == READ_ONCE(call->rx_hard_ack) + 1) { |
610 | trace_rxrpc_notify_socket(call->debug_id, serial); | 617 | trace_rxrpc_notify_socket(call->debug_id, serial); |
611 | rxrpc_notify_socket(call); | 618 | rxrpc_notify_socket(call); |
612 | } | 619 | } |
613 | 620 | ||
614 | unlock: | 621 | unlock: |
615 | spin_unlock(&call->input_lock); | 622 | spin_unlock(&call->input_lock); |
623 | rxrpc_free_skb(skb, rxrpc_skb_freed); | ||
616 | _leave(" [queued]"); | 624 | _leave(" [queued]"); |
617 | } | 625 | } |
618 | 626 | ||
@@ -1021,7 +1029,7 @@ static void rxrpc_input_call_packet(struct rxrpc_call *call, | |||
1021 | switch (sp->hdr.type) { | 1029 | switch (sp->hdr.type) { |
1022 | case RXRPC_PACKET_TYPE_DATA: | 1030 | case RXRPC_PACKET_TYPE_DATA: |
1023 | rxrpc_input_data(call, skb); | 1031 | rxrpc_input_data(call, skb); |
1024 | break; | 1032 | goto no_free; |
1025 | 1033 | ||
1026 | case RXRPC_PACKET_TYPE_ACK: | 1034 | case RXRPC_PACKET_TYPE_ACK: |
1027 | rxrpc_input_ack(call, skb); | 1035 | rxrpc_input_ack(call, skb); |
@@ -1048,6 +1056,8 @@ static void rxrpc_input_call_packet(struct rxrpc_call *call, | |||
1048 | break; | 1056 | break; |
1049 | } | 1057 | } |
1050 | 1058 | ||
1059 | rxrpc_free_skb(skb, rxrpc_skb_freed); | ||
1060 | no_free: | ||
1051 | _leave(""); | 1061 | _leave(""); |
1052 | } | 1062 | } |
1053 | 1063 | ||
@@ -1109,7 +1119,7 @@ static void rxrpc_post_packet_to_local(struct rxrpc_local *local, | |||
1109 | skb_queue_tail(&local->event_queue, skb); | 1119 | skb_queue_tail(&local->event_queue, skb); |
1110 | rxrpc_queue_local(local); | 1120 | rxrpc_queue_local(local); |
1111 | } else { | 1121 | } else { |
1112 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 1122 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
1113 | } | 1123 | } |
1114 | } | 1124 | } |
1115 | 1125 | ||
@@ -1124,7 +1134,7 @@ static void rxrpc_reject_packet(struct rxrpc_local *local, struct sk_buff *skb) | |||
1124 | skb_queue_tail(&local->reject_queue, skb); | 1134 | skb_queue_tail(&local->reject_queue, skb); |
1125 | rxrpc_queue_local(local); | 1135 | rxrpc_queue_local(local); |
1126 | } else { | 1136 | } else { |
1127 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 1137 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
1128 | } | 1138 | } |
1129 | } | 1139 | } |
1130 | 1140 | ||
@@ -1188,7 +1198,7 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb) | |||
1188 | if (skb->tstamp == 0) | 1198 | if (skb->tstamp == 0) |
1189 | skb->tstamp = ktime_get_real(); | 1199 | skb->tstamp = ktime_get_real(); |
1190 | 1200 | ||
1191 | rxrpc_new_skb(skb, rxrpc_skb_rx_received); | 1201 | rxrpc_new_skb(skb, rxrpc_skb_received); |
1192 | 1202 | ||
1193 | skb_pull(skb, sizeof(struct udphdr)); | 1203 | skb_pull(skb, sizeof(struct udphdr)); |
1194 | 1204 | ||
@@ -1205,7 +1215,7 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb) | |||
1205 | static int lose; | 1215 | static int lose; |
1206 | if ((lose++ & 7) == 7) { | 1216 | if ((lose++ & 7) == 7) { |
1207 | trace_rxrpc_rx_lose(sp); | 1217 | trace_rxrpc_rx_lose(sp); |
1208 | rxrpc_free_skb(skb, rxrpc_skb_rx_lost); | 1218 | rxrpc_free_skb(skb, rxrpc_skb_lost); |
1209 | return 0; | 1219 | return 0; |
1210 | } | 1220 | } |
1211 | } | 1221 | } |
@@ -1237,9 +1247,26 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb) | |||
1237 | if (sp->hdr.callNumber == 0 || | 1247 | if (sp->hdr.callNumber == 0 || |
1238 | sp->hdr.seq == 0) | 1248 | sp->hdr.seq == 0) |
1239 | goto bad_message; | 1249 | goto bad_message; |
1240 | if (sp->hdr.flags & RXRPC_JUMBO_PACKET && | 1250 | if (!rxrpc_validate_data(skb)) |
1241 | !rxrpc_validate_jumbo(skb)) | ||
1242 | goto bad_message; | 1251 | goto bad_message; |
1252 | |||
1253 | /* Unshare the packet so that it can be modified for in-place | ||
1254 | * decryption. | ||
1255 | */ | ||
1256 | if (sp->hdr.securityIndex != 0) { | ||
1257 | struct sk_buff *nskb = skb_unshare(skb, GFP_ATOMIC); | ||
1258 | if (!nskb) { | ||
1259 | rxrpc_eaten_skb(skb, rxrpc_skb_unshared_nomem); | ||
1260 | goto out; | ||
1261 | } | ||
1262 | |||
1263 | if (nskb != skb) { | ||
1264 | rxrpc_eaten_skb(skb, rxrpc_skb_received); | ||
1265 | rxrpc_new_skb(skb, rxrpc_skb_unshared); | ||
1266 | skb = nskb; | ||
1267 | sp = rxrpc_skb(skb); | ||
1268 | } | ||
1269 | } | ||
1243 | break; | 1270 | break; |
1244 | 1271 | ||
1245 | case RXRPC_PACKET_TYPE_CHALLENGE: | 1272 | case RXRPC_PACKET_TYPE_CHALLENGE: |
@@ -1373,11 +1400,14 @@ int rxrpc_input_packet(struct sock *udp_sk, struct sk_buff *skb) | |||
1373 | mutex_unlock(&call->user_mutex); | 1400 | mutex_unlock(&call->user_mutex); |
1374 | } | 1401 | } |
1375 | 1402 | ||
1403 | /* Process a call packet; this either discards or passes on the ref | ||
1404 | * elsewhere. | ||
1405 | */ | ||
1376 | rxrpc_input_call_packet(call, skb); | 1406 | rxrpc_input_call_packet(call, skb); |
1377 | goto discard; | 1407 | goto out; |
1378 | 1408 | ||
1379 | discard: | 1409 | discard: |
1380 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 1410 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
1381 | out: | 1411 | out: |
1382 | trace_rxrpc_rx_done(0, 0); | 1412 | trace_rxrpc_rx_done(0, 0); |
1383 | return 0; | 1413 | return 0; |
diff --git a/net/rxrpc/local_event.c b/net/rxrpc/local_event.c index e93a78f7c05e..3ce6d628cd75 100644 --- a/net/rxrpc/local_event.c +++ b/net/rxrpc/local_event.c | |||
@@ -90,7 +90,7 @@ void rxrpc_process_local_events(struct rxrpc_local *local) | |||
90 | if (skb) { | 90 | if (skb) { |
91 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 91 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
92 | 92 | ||
93 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); | 93 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
94 | _debug("{%d},{%u}", local->debug_id, sp->hdr.type); | 94 | _debug("{%d},{%u}", local->debug_id, sp->hdr.type); |
95 | 95 | ||
96 | switch (sp->hdr.type) { | 96 | switch (sp->hdr.type) { |
@@ -108,7 +108,7 @@ void rxrpc_process_local_events(struct rxrpc_local *local) | |||
108 | break; | 108 | break; |
109 | } | 109 | } |
110 | 110 | ||
111 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 111 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
112 | } | 112 | } |
113 | 113 | ||
114 | _leave(""); | 114 | _leave(""); |
diff --git a/net/rxrpc/local_object.c b/net/rxrpc/local_object.c index 72a6e12a9304..36587260cabd 100644 --- a/net/rxrpc/local_object.c +++ b/net/rxrpc/local_object.c | |||
@@ -426,11 +426,14 @@ static void rxrpc_local_destroyer(struct rxrpc_local *local) | |||
426 | 426 | ||
427 | _enter("%d", local->debug_id); | 427 | _enter("%d", local->debug_id); |
428 | 428 | ||
429 | local->dead = true; | ||
430 | |||
429 | mutex_lock(&rxnet->local_mutex); | 431 | mutex_lock(&rxnet->local_mutex); |
430 | list_del_init(&local->link); | 432 | list_del_init(&local->link); |
431 | mutex_unlock(&rxnet->local_mutex); | 433 | mutex_unlock(&rxnet->local_mutex); |
432 | 434 | ||
433 | ASSERT(RB_EMPTY_ROOT(&local->client_conns)); | 435 | rxrpc_clean_up_local_conns(local); |
436 | rxrpc_service_connection_reaper(&rxnet->service_conn_reaper); | ||
434 | ASSERT(!local->service); | 437 | ASSERT(!local->service); |
435 | 438 | ||
436 | if (socket) { | 439 | if (socket) { |
diff --git a/net/rxrpc/output.c b/net/rxrpc/output.c index 369e516c4bdf..935bb60fff56 100644 --- a/net/rxrpc/output.c +++ b/net/rxrpc/output.c | |||
@@ -565,7 +565,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
565 | memset(&whdr, 0, sizeof(whdr)); | 565 | memset(&whdr, 0, sizeof(whdr)); |
566 | 566 | ||
567 | while ((skb = skb_dequeue(&local->reject_queue))) { | 567 | while ((skb = skb_dequeue(&local->reject_queue))) { |
568 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); | 568 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
569 | sp = rxrpc_skb(skb); | 569 | sp = rxrpc_skb(skb); |
570 | 570 | ||
571 | switch (skb->mark) { | 571 | switch (skb->mark) { |
@@ -581,7 +581,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
581 | ioc = 2; | 581 | ioc = 2; |
582 | break; | 582 | break; |
583 | default: | 583 | default: |
584 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 584 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
585 | continue; | 585 | continue; |
586 | } | 586 | } |
587 | 587 | ||
@@ -606,7 +606,7 @@ void rxrpc_reject_packets(struct rxrpc_local *local) | |||
606 | rxrpc_tx_point_reject); | 606 | rxrpc_tx_point_reject); |
607 | } | 607 | } |
608 | 608 | ||
609 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 609 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
610 | } | 610 | } |
611 | 611 | ||
612 | _leave(""); | 612 | _leave(""); |
diff --git a/net/rxrpc/peer_event.c b/net/rxrpc/peer_event.c index 7666ec72d37e..c97ebdc043e4 100644 --- a/net/rxrpc/peer_event.c +++ b/net/rxrpc/peer_event.c | |||
@@ -163,11 +163,11 @@ void rxrpc_error_report(struct sock *sk) | |||
163 | _leave("UDP socket errqueue empty"); | 163 | _leave("UDP socket errqueue empty"); |
164 | return; | 164 | return; |
165 | } | 165 | } |
166 | rxrpc_new_skb(skb, rxrpc_skb_rx_received); | 166 | rxrpc_new_skb(skb, rxrpc_skb_received); |
167 | serr = SKB_EXT_ERR(skb); | 167 | serr = SKB_EXT_ERR(skb); |
168 | if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { | 168 | if (!skb->len && serr->ee.ee_origin == SO_EE_ORIGIN_TIMESTAMPING) { |
169 | _leave("UDP empty message"); | 169 | _leave("UDP empty message"); |
170 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 170 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
171 | return; | 171 | return; |
172 | } | 172 | } |
173 | 173 | ||
@@ -177,7 +177,7 @@ void rxrpc_error_report(struct sock *sk) | |||
177 | peer = NULL; | 177 | peer = NULL; |
178 | if (!peer) { | 178 | if (!peer) { |
179 | rcu_read_unlock(); | 179 | rcu_read_unlock(); |
180 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 180 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
181 | _leave(" [no peer]"); | 181 | _leave(" [no peer]"); |
182 | return; | 182 | return; |
183 | } | 183 | } |
@@ -189,7 +189,7 @@ void rxrpc_error_report(struct sock *sk) | |||
189 | serr->ee.ee_code == ICMP_FRAG_NEEDED)) { | 189 | serr->ee.ee_code == ICMP_FRAG_NEEDED)) { |
190 | rxrpc_adjust_mtu(peer, serr); | 190 | rxrpc_adjust_mtu(peer, serr); |
191 | rcu_read_unlock(); | 191 | rcu_read_unlock(); |
192 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 192 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
193 | rxrpc_put_peer(peer); | 193 | rxrpc_put_peer(peer); |
194 | _leave(" [MTU update]"); | 194 | _leave(" [MTU update]"); |
195 | return; | 195 | return; |
@@ -197,7 +197,7 @@ void rxrpc_error_report(struct sock *sk) | |||
197 | 197 | ||
198 | rxrpc_store_error(peer, serr); | 198 | rxrpc_store_error(peer, serr); |
199 | rcu_read_unlock(); | 199 | rcu_read_unlock(); |
200 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 200 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
201 | rxrpc_put_peer(peer); | 201 | rxrpc_put_peer(peer); |
202 | 202 | ||
203 | _leave(""); | 203 | _leave(""); |
diff --git a/net/rxrpc/protocol.h b/net/rxrpc/protocol.h index 99ce322d7caa..49bb972539aa 100644 --- a/net/rxrpc/protocol.h +++ b/net/rxrpc/protocol.h | |||
@@ -89,6 +89,15 @@ struct rxrpc_jumbo_header { | |||
89 | #define RXRPC_JUMBO_DATALEN 1412 /* non-terminal jumbo packet data length */ | 89 | #define RXRPC_JUMBO_DATALEN 1412 /* non-terminal jumbo packet data length */ |
90 | #define RXRPC_JUMBO_SUBPKTLEN (RXRPC_JUMBO_DATALEN + sizeof(struct rxrpc_jumbo_header)) | 90 | #define RXRPC_JUMBO_SUBPKTLEN (RXRPC_JUMBO_DATALEN + sizeof(struct rxrpc_jumbo_header)) |
91 | 91 | ||
92 | /* | ||
93 | * The maximum number of subpackets that can possibly fit in a UDP packet is: | ||
94 | * | ||
95 | * ((max_IP - IP_hdr - UDP_hdr) / RXRPC_JUMBO_SUBPKTLEN) + 1 | ||
96 | * = ((65535 - 28 - 28) / 1416) + 1 | ||
97 | * = 46 non-terminal packets and 1 terminal packet. | ||
98 | */ | ||
99 | #define RXRPC_MAX_NR_JUMBO 47 | ||
100 | |||
92 | /*****************************************************************************/ | 101 | /*****************************************************************************/ |
93 | /* | 102 | /* |
94 | * on-the-wire Rx ACK packet data payload | 103 | * on-the-wire Rx ACK packet data payload |
diff --git a/net/rxrpc/recvmsg.c b/net/rxrpc/recvmsg.c index 9a7e1bc9791d..3b0becb12041 100644 --- a/net/rxrpc/recvmsg.c +++ b/net/rxrpc/recvmsg.c | |||
@@ -177,7 +177,8 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call) | |||
177 | struct sk_buff *skb; | 177 | struct sk_buff *skb; |
178 | rxrpc_serial_t serial; | 178 | rxrpc_serial_t serial; |
179 | rxrpc_seq_t hard_ack, top; | 179 | rxrpc_seq_t hard_ack, top; |
180 | u8 flags; | 180 | bool last = false; |
181 | u8 subpacket; | ||
181 | int ix; | 182 | int ix; |
182 | 183 | ||
183 | _enter("%d", call->debug_id); | 184 | _enter("%d", call->debug_id); |
@@ -189,23 +190,25 @@ static void rxrpc_rotate_rx_window(struct rxrpc_call *call) | |||
189 | hard_ack++; | 190 | hard_ack++; |
190 | ix = hard_ack & RXRPC_RXTX_BUFF_MASK; | 191 | ix = hard_ack & RXRPC_RXTX_BUFF_MASK; |
191 | skb = call->rxtx_buffer[ix]; | 192 | skb = call->rxtx_buffer[ix]; |
192 | rxrpc_see_skb(skb, rxrpc_skb_rx_rotated); | 193 | rxrpc_see_skb(skb, rxrpc_skb_rotated); |
193 | sp = rxrpc_skb(skb); | 194 | sp = rxrpc_skb(skb); |
194 | flags = sp->hdr.flags; | 195 | |
195 | serial = sp->hdr.serial; | 196 | subpacket = call->rxtx_annotations[ix] & RXRPC_RX_ANNO_SUBPACKET; |
196 | if (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO) | 197 | serial = sp->hdr.serial + subpacket; |
197 | serial += (call->rxtx_annotations[ix] & RXRPC_RX_ANNO_JUMBO) - 1; | 198 | |
199 | if (subpacket == sp->nr_subpackets - 1 && | ||
200 | sp->rx_flags & RXRPC_SKB_INCL_LAST) | ||
201 | last = true; | ||
198 | 202 | ||
199 | call->rxtx_buffer[ix] = NULL; | 203 | call->rxtx_buffer[ix] = NULL; |
200 | call->rxtx_annotations[ix] = 0; | 204 | call->rxtx_annotations[ix] = 0; |
201 | /* Barrier against rxrpc_input_data(). */ | 205 | /* Barrier against rxrpc_input_data(). */ |
202 | smp_store_release(&call->rx_hard_ack, hard_ack); | 206 | smp_store_release(&call->rx_hard_ack, hard_ack); |
203 | 207 | ||
204 | rxrpc_free_skb(skb, rxrpc_skb_rx_freed); | 208 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
205 | 209 | ||
206 | _debug("%u,%u,%02x", hard_ack, top, flags); | ||
207 | trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack); | 210 | trace_rxrpc_receive(call, rxrpc_receive_rotate, serial, hard_ack); |
208 | if (flags & RXRPC_LAST_PACKET) { | 211 | if (last) { |
209 | rxrpc_end_rx_phase(call, serial); | 212 | rxrpc_end_rx_phase(call, serial); |
210 | } else { | 213 | } else { |
211 | /* Check to see if there's an ACK that needs sending. */ | 214 | /* Check to see if there's an ACK that needs sending. */ |
@@ -233,18 +236,19 @@ static int rxrpc_verify_packet(struct rxrpc_call *call, struct sk_buff *skb, | |||
233 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | 236 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); |
234 | rxrpc_seq_t seq = sp->hdr.seq; | 237 | rxrpc_seq_t seq = sp->hdr.seq; |
235 | u16 cksum = sp->hdr.cksum; | 238 | u16 cksum = sp->hdr.cksum; |
239 | u8 subpacket = annotation & RXRPC_RX_ANNO_SUBPACKET; | ||
236 | 240 | ||
237 | _enter(""); | 241 | _enter(""); |
238 | 242 | ||
239 | /* For all but the head jumbo subpacket, the security checksum is in a | 243 | /* For all but the head jumbo subpacket, the security checksum is in a |
240 | * jumbo header immediately prior to the data. | 244 | * jumbo header immediately prior to the data. |
241 | */ | 245 | */ |
242 | if ((annotation & RXRPC_RX_ANNO_JUMBO) > 1) { | 246 | if (subpacket > 0) { |
243 | __be16 tmp; | 247 | __be16 tmp; |
244 | if (skb_copy_bits(skb, offset - 2, &tmp, 2) < 0) | 248 | if (skb_copy_bits(skb, offset - 2, &tmp, 2) < 0) |
245 | BUG(); | 249 | BUG(); |
246 | cksum = ntohs(tmp); | 250 | cksum = ntohs(tmp); |
247 | seq += (annotation & RXRPC_RX_ANNO_JUMBO) - 1; | 251 | seq += subpacket; |
248 | } | 252 | } |
249 | 253 | ||
250 | return call->conn->security->verify_packet(call, skb, offset, len, | 254 | return call->conn->security->verify_packet(call, skb, offset, len, |
@@ -265,19 +269,18 @@ static int rxrpc_locate_data(struct rxrpc_call *call, struct sk_buff *skb, | |||
265 | u8 *_annotation, | 269 | u8 *_annotation, |
266 | unsigned int *_offset, unsigned int *_len) | 270 | unsigned int *_offset, unsigned int *_len) |
267 | { | 271 | { |
272 | struct rxrpc_skb_priv *sp = rxrpc_skb(skb); | ||
268 | unsigned int offset = sizeof(struct rxrpc_wire_header); | 273 | unsigned int offset = sizeof(struct rxrpc_wire_header); |
269 | unsigned int len; | 274 | unsigned int len; |
270 | int ret; | 275 | int ret; |
271 | u8 annotation = *_annotation; | 276 | u8 annotation = *_annotation; |
277 | u8 subpacket = annotation & RXRPC_RX_ANNO_SUBPACKET; | ||
272 | 278 | ||
273 | /* Locate the subpacket */ | 279 | /* Locate the subpacket */ |
280 | offset += subpacket * RXRPC_JUMBO_SUBPKTLEN; | ||
274 | len = skb->len - offset; | 281 | len = skb->len - offset; |
275 | if ((annotation & RXRPC_RX_ANNO_JUMBO) > 0) { | 282 | if (subpacket < sp->nr_subpackets - 1) |
276 | offset += (((annotation & RXRPC_RX_ANNO_JUMBO) - 1) * | 283 | len = RXRPC_JUMBO_DATALEN; |
277 | RXRPC_JUMBO_SUBPKTLEN); | ||
278 | len = (annotation & RXRPC_RX_ANNO_JLAST) ? | ||
279 | skb->len - offset : RXRPC_JUMBO_SUBPKTLEN; | ||
280 | } | ||
281 | 284 | ||
282 | if (!(annotation & RXRPC_RX_ANNO_VERIFIED)) { | 285 | if (!(annotation & RXRPC_RX_ANNO_VERIFIED)) { |
283 | ret = rxrpc_verify_packet(call, skb, annotation, offset, len); | 286 | ret = rxrpc_verify_packet(call, skb, annotation, offset, len); |
@@ -303,6 +306,7 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, | |||
303 | { | 306 | { |
304 | struct rxrpc_skb_priv *sp; | 307 | struct rxrpc_skb_priv *sp; |
305 | struct sk_buff *skb; | 308 | struct sk_buff *skb; |
309 | rxrpc_serial_t serial; | ||
306 | rxrpc_seq_t hard_ack, top, seq; | 310 | rxrpc_seq_t hard_ack, top, seq; |
307 | size_t remain; | 311 | size_t remain; |
308 | bool last; | 312 | bool last; |
@@ -336,12 +340,15 @@ static int rxrpc_recvmsg_data(struct socket *sock, struct rxrpc_call *call, | |||
336 | break; | 340 | break; |
337 | } | 341 | } |
338 | smp_rmb(); | 342 | smp_rmb(); |
339 | rxrpc_see_skb(skb, rxrpc_skb_rx_seen); | 343 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
340 | sp = rxrpc_skb(skb); | 344 | sp = rxrpc_skb(skb); |
341 | 345 | ||
342 | if (!(flags & MSG_PEEK)) | 346 | if (!(flags & MSG_PEEK)) { |
347 | serial = sp->hdr.serial; | ||
348 | serial += call->rxtx_annotations[ix] & RXRPC_RX_ANNO_SUBPACKET; | ||
343 | trace_rxrpc_receive(call, rxrpc_receive_front, | 349 | trace_rxrpc_receive(call, rxrpc_receive_front, |
344 | sp->hdr.serial, seq); | 350 | serial, seq); |
351 | } | ||
345 | 352 | ||
346 | if (msg) | 353 | if (msg) |
347 | sock_recv_timestamp(msg, sock->sk, skb); | 354 | sock_recv_timestamp(msg, sock->sk, skb); |
diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c index ae8cd8926456..c60c520fde7c 100644 --- a/net/rxrpc/rxkad.c +++ b/net/rxrpc/rxkad.c | |||
@@ -187,10 +187,8 @@ static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call, | |||
187 | struct rxrpc_skb_priv *sp; | 187 | struct rxrpc_skb_priv *sp; |
188 | struct rxrpc_crypt iv; | 188 | struct rxrpc_crypt iv; |
189 | struct scatterlist sg[16]; | 189 | struct scatterlist sg[16]; |
190 | struct sk_buff *trailer; | ||
191 | unsigned int len; | 190 | unsigned int len; |
192 | u16 check; | 191 | u16 check; |
193 | int nsg; | ||
194 | int err; | 192 | int err; |
195 | 193 | ||
196 | sp = rxrpc_skb(skb); | 194 | sp = rxrpc_skb(skb); |
@@ -214,15 +212,14 @@ static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call, | |||
214 | crypto_skcipher_encrypt(req); | 212 | crypto_skcipher_encrypt(req); |
215 | 213 | ||
216 | /* we want to encrypt the skbuff in-place */ | 214 | /* we want to encrypt the skbuff in-place */ |
217 | nsg = skb_cow_data(skb, 0, &trailer); | 215 | err = -EMSGSIZE; |
218 | err = -ENOMEM; | 216 | if (skb_shinfo(skb)->nr_frags > 16) |
219 | if (nsg < 0 || nsg > 16) | ||
220 | goto out; | 217 | goto out; |
221 | 218 | ||
222 | len = data_size + call->conn->size_align - 1; | 219 | len = data_size + call->conn->size_align - 1; |
223 | len &= ~(call->conn->size_align - 1); | 220 | len &= ~(call->conn->size_align - 1); |
224 | 221 | ||
225 | sg_init_table(sg, nsg); | 222 | sg_init_table(sg, ARRAY_SIZE(sg)); |
226 | err = skb_to_sgvec(skb, sg, 0, len); | 223 | err = skb_to_sgvec(skb, sg, 0, len); |
227 | if (unlikely(err < 0)) | 224 | if (unlikely(err < 0)) |
228 | goto out; | 225 | goto out; |
@@ -319,11 +316,10 @@ static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb, | |||
319 | struct rxkad_level1_hdr sechdr; | 316 | struct rxkad_level1_hdr sechdr; |
320 | struct rxrpc_crypt iv; | 317 | struct rxrpc_crypt iv; |
321 | struct scatterlist sg[16]; | 318 | struct scatterlist sg[16]; |
322 | struct sk_buff *trailer; | ||
323 | bool aborted; | 319 | bool aborted; |
324 | u32 data_size, buf; | 320 | u32 data_size, buf; |
325 | u16 check; | 321 | u16 check; |
326 | int nsg, ret; | 322 | int ret; |
327 | 323 | ||
328 | _enter(""); | 324 | _enter(""); |
329 | 325 | ||
@@ -336,11 +332,7 @@ static int rxkad_verify_packet_1(struct rxrpc_call *call, struct sk_buff *skb, | |||
336 | /* Decrypt the skbuff in-place. TODO: We really want to decrypt | 332 | /* Decrypt the skbuff in-place. TODO: We really want to decrypt |
337 | * directly into the target buffer. | 333 | * directly into the target buffer. |
338 | */ | 334 | */ |
339 | nsg = skb_cow_data(skb, 0, &trailer); | 335 | sg_init_table(sg, ARRAY_SIZE(sg)); |
340 | if (nsg < 0 || nsg > 16) | ||
341 | goto nomem; | ||
342 | |||
343 | sg_init_table(sg, nsg); | ||
344 | ret = skb_to_sgvec(skb, sg, offset, 8); | 336 | ret = skb_to_sgvec(skb, sg, offset, 8); |
345 | if (unlikely(ret < 0)) | 337 | if (unlikely(ret < 0)) |
346 | return ret; | 338 | return ret; |
@@ -388,10 +380,6 @@ protocol_error: | |||
388 | if (aborted) | 380 | if (aborted) |
389 | rxrpc_send_abort_packet(call); | 381 | rxrpc_send_abort_packet(call); |
390 | return -EPROTO; | 382 | return -EPROTO; |
391 | |||
392 | nomem: | ||
393 | _leave(" = -ENOMEM"); | ||
394 | return -ENOMEM; | ||
395 | } | 383 | } |
396 | 384 | ||
397 | /* | 385 | /* |
@@ -406,7 +394,6 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb, | |||
406 | struct rxkad_level2_hdr sechdr; | 394 | struct rxkad_level2_hdr sechdr; |
407 | struct rxrpc_crypt iv; | 395 | struct rxrpc_crypt iv; |
408 | struct scatterlist _sg[4], *sg; | 396 | struct scatterlist _sg[4], *sg; |
409 | struct sk_buff *trailer; | ||
410 | bool aborted; | 397 | bool aborted; |
411 | u32 data_size, buf; | 398 | u32 data_size, buf; |
412 | u16 check; | 399 | u16 check; |
@@ -423,12 +410,11 @@ static int rxkad_verify_packet_2(struct rxrpc_call *call, struct sk_buff *skb, | |||
423 | /* Decrypt the skbuff in-place. TODO: We really want to decrypt | 410 | /* Decrypt the skbuff in-place. TODO: We really want to decrypt |
424 | * directly into the target buffer. | 411 | * directly into the target buffer. |
425 | */ | 412 | */ |
426 | nsg = skb_cow_data(skb, 0, &trailer); | ||
427 | if (nsg < 0) | ||
428 | goto nomem; | ||
429 | |||
430 | sg = _sg; | 413 | sg = _sg; |
431 | if (unlikely(nsg > 4)) { | 414 | nsg = skb_shinfo(skb)->nr_frags; |
415 | if (nsg <= 4) { | ||
416 | nsg = 4; | ||
417 | } else { | ||
432 | sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO); | 418 | sg = kmalloc_array(nsg, sizeof(*sg), GFP_NOIO); |
433 | if (!sg) | 419 | if (!sg) |
434 | goto nomem; | 420 | goto nomem; |
diff --git a/net/rxrpc/sendmsg.c b/net/rxrpc/sendmsg.c index bae14438f869..6a1547b270fe 100644 --- a/net/rxrpc/sendmsg.c +++ b/net/rxrpc/sendmsg.c | |||
@@ -176,7 +176,7 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call, | |||
176 | skb->tstamp = ktime_get_real(); | 176 | skb->tstamp = ktime_get_real(); |
177 | 177 | ||
178 | ix = seq & RXRPC_RXTX_BUFF_MASK; | 178 | ix = seq & RXRPC_RXTX_BUFF_MASK; |
179 | rxrpc_get_skb(skb, rxrpc_skb_tx_got); | 179 | rxrpc_get_skb(skb, rxrpc_skb_got); |
180 | call->rxtx_annotations[ix] = annotation; | 180 | call->rxtx_annotations[ix] = annotation; |
181 | smp_wmb(); | 181 | smp_wmb(); |
182 | call->rxtx_buffer[ix] = skb; | 182 | call->rxtx_buffer[ix] = skb; |
@@ -248,7 +248,7 @@ static int rxrpc_queue_packet(struct rxrpc_sock *rx, struct rxrpc_call *call, | |||
248 | } | 248 | } |
249 | 249 | ||
250 | out: | 250 | out: |
251 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 251 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
252 | _leave(" = %d", ret); | 252 | _leave(" = %d", ret); |
253 | return ret; | 253 | return ret; |
254 | } | 254 | } |
@@ -289,7 +289,7 @@ static int rxrpc_send_data(struct rxrpc_sock *rx, | |||
289 | 289 | ||
290 | skb = call->tx_pending; | 290 | skb = call->tx_pending; |
291 | call->tx_pending = NULL; | 291 | call->tx_pending = NULL; |
292 | rxrpc_see_skb(skb, rxrpc_skb_tx_seen); | 292 | rxrpc_see_skb(skb, rxrpc_skb_seen); |
293 | 293 | ||
294 | copied = 0; | 294 | copied = 0; |
295 | do { | 295 | do { |
@@ -336,7 +336,9 @@ static int rxrpc_send_data(struct rxrpc_sock *rx, | |||
336 | if (!skb) | 336 | if (!skb) |
337 | goto maybe_error; | 337 | goto maybe_error; |
338 | 338 | ||
339 | rxrpc_new_skb(skb, rxrpc_skb_tx_new); | 339 | sp = rxrpc_skb(skb); |
340 | sp->rx_flags |= RXRPC_SKB_TX_BUFFER; | ||
341 | rxrpc_new_skb(skb, rxrpc_skb_new); | ||
340 | 342 | ||
341 | _debug("ALLOC SEND %p", skb); | 343 | _debug("ALLOC SEND %p", skb); |
342 | 344 | ||
@@ -346,7 +348,6 @@ static int rxrpc_send_data(struct rxrpc_sock *rx, | |||
346 | skb_reserve(skb, call->conn->security_size); | 348 | skb_reserve(skb, call->conn->security_size); |
347 | skb->len += call->conn->security_size; | 349 | skb->len += call->conn->security_size; |
348 | 350 | ||
349 | sp = rxrpc_skb(skb); | ||
350 | sp->remain = chunk; | 351 | sp->remain = chunk; |
351 | if (sp->remain > skb_tailroom(skb)) | 352 | if (sp->remain > skb_tailroom(skb)) |
352 | sp->remain = skb_tailroom(skb); | 353 | sp->remain = skb_tailroom(skb); |
@@ -439,7 +440,7 @@ out: | |||
439 | return ret; | 440 | return ret; |
440 | 441 | ||
441 | call_terminated: | 442 | call_terminated: |
442 | rxrpc_free_skb(skb, rxrpc_skb_tx_freed); | 443 | rxrpc_free_skb(skb, rxrpc_skb_freed); |
443 | _leave(" = %d", call->error); | 444 | _leave(" = %d", call->error); |
444 | return call->error; | 445 | return call->error; |
445 | 446 | ||
diff --git a/net/rxrpc/skbuff.c b/net/rxrpc/skbuff.c index 9ad5045b7c2f..0348d2bf6f7d 100644 --- a/net/rxrpc/skbuff.c +++ b/net/rxrpc/skbuff.c | |||
@@ -14,7 +14,8 @@ | |||
14 | #include <net/af_rxrpc.h> | 14 | #include <net/af_rxrpc.h> |
15 | #include "ar-internal.h" | 15 | #include "ar-internal.h" |
16 | 16 | ||
17 | #define select_skb_count(op) (op >= rxrpc_skb_tx_cleaned ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs) | 17 | #define is_tx_skb(skb) (rxrpc_skb(skb)->rx_flags & RXRPC_SKB_TX_BUFFER) |
18 | #define select_skb_count(skb) (is_tx_skb(skb) ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs) | ||
18 | 19 | ||
19 | /* | 20 | /* |
20 | * Note the allocation or reception of a socket buffer. | 21 | * Note the allocation or reception of a socket buffer. |
@@ -22,8 +23,9 @@ | |||
22 | void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | 23 | void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) |
23 | { | 24 | { |
24 | const void *here = __builtin_return_address(0); | 25 | const void *here = __builtin_return_address(0); |
25 | int n = atomic_inc_return(select_skb_count(op)); | 26 | int n = atomic_inc_return(select_skb_count(skb)); |
26 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); | 27 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, |
28 | rxrpc_skb(skb)->rx_flags, here); | ||
27 | } | 29 | } |
28 | 30 | ||
29 | /* | 31 | /* |
@@ -33,8 +35,9 @@ void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | |||
33 | { | 35 | { |
34 | const void *here = __builtin_return_address(0); | 36 | const void *here = __builtin_return_address(0); |
35 | if (skb) { | 37 | if (skb) { |
36 | int n = atomic_read(select_skb_count(op)); | 38 | int n = atomic_read(select_skb_count(skb)); |
37 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); | 39 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, |
40 | rxrpc_skb(skb)->rx_flags, here); | ||
38 | } | 41 | } |
39 | } | 42 | } |
40 | 43 | ||
@@ -44,12 +47,23 @@ void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | |||
44 | void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | 47 | void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) |
45 | { | 48 | { |
46 | const void *here = __builtin_return_address(0); | 49 | const void *here = __builtin_return_address(0); |
47 | int n = atomic_inc_return(select_skb_count(op)); | 50 | int n = atomic_inc_return(select_skb_count(skb)); |
48 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); | 51 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, |
52 | rxrpc_skb(skb)->rx_flags, here); | ||
49 | skb_get(skb); | 53 | skb_get(skb); |
50 | } | 54 | } |
51 | 55 | ||
52 | /* | 56 | /* |
57 | * Note the dropping of a ref on a socket buffer by the core. | ||
58 | */ | ||
59 | void rxrpc_eaten_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | ||
60 | { | ||
61 | const void *here = __builtin_return_address(0); | ||
62 | int n = atomic_inc_return(&rxrpc_n_rx_skbs); | ||
63 | trace_rxrpc_skb(skb, op, 0, n, 0, here); | ||
64 | } | ||
65 | |||
66 | /* | ||
53 | * Note the destruction of a socket buffer. | 67 | * Note the destruction of a socket buffer. |
54 | */ | 68 | */ |
55 | void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | 69 | void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) |
@@ -58,8 +72,9 @@ void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op) | |||
58 | if (skb) { | 72 | if (skb) { |
59 | int n; | 73 | int n; |
60 | CHECK_SLAB_OKAY(&skb->users); | 74 | CHECK_SLAB_OKAY(&skb->users); |
61 | n = atomic_dec_return(select_skb_count(op)); | 75 | n = atomic_dec_return(select_skb_count(skb)); |
62 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here); | 76 | trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, |
77 | rxrpc_skb(skb)->rx_flags, here); | ||
63 | kfree_skb(skb); | 78 | kfree_skb(skb); |
64 | } | 79 | } |
65 | } | 80 | } |
@@ -72,9 +87,10 @@ void rxrpc_purge_queue(struct sk_buff_head *list) | |||
72 | const void *here = __builtin_return_address(0); | 87 | const void *here = __builtin_return_address(0); |
73 | struct sk_buff *skb; | 88 | struct sk_buff *skb; |
74 | while ((skb = skb_dequeue((list))) != NULL) { | 89 | while ((skb = skb_dequeue((list))) != NULL) { |
75 | int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged)); | 90 | int n = atomic_dec_return(select_skb_count(skb)); |
76 | trace_rxrpc_skb(skb, rxrpc_skb_rx_purged, | 91 | trace_rxrpc_skb(skb, rxrpc_skb_purged, |
77 | refcount_read(&skb->users), n, here); | 92 | refcount_read(&skb->users), n, |
93 | rxrpc_skb(skb)->rx_flags, here); | ||
78 | kfree_skb(skb); | 94 | kfree_skb(skb); |
79 | } | 95 | } |
80 | } | 96 | } |
diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c index fd1f7e799e23..04b7bd4ec751 100644 --- a/net/sched/act_bpf.c +++ b/net/sched/act_bpf.c | |||
@@ -422,7 +422,7 @@ static __net_init int bpf_init_net(struct net *net) | |||
422 | { | 422 | { |
423 | struct tc_action_net *tn = net_generic(net, bpf_net_id); | 423 | struct tc_action_net *tn = net_generic(net, bpf_net_id); |
424 | 424 | ||
425 | return tc_action_net_init(tn, &act_bpf_ops); | 425 | return tc_action_net_init(net, tn, &act_bpf_ops); |
426 | } | 426 | } |
427 | 427 | ||
428 | static void __net_exit bpf_exit_net(struct list_head *net_list) | 428 | static void __net_exit bpf_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c index 32ac04d77a45..2b43cacf82af 100644 --- a/net/sched/act_connmark.c +++ b/net/sched/act_connmark.c | |||
@@ -231,7 +231,7 @@ static __net_init int connmark_init_net(struct net *net) | |||
231 | { | 231 | { |
232 | struct tc_action_net *tn = net_generic(net, connmark_net_id); | 232 | struct tc_action_net *tn = net_generic(net, connmark_net_id); |
233 | 233 | ||
234 | return tc_action_net_init(tn, &act_connmark_ops); | 234 | return tc_action_net_init(net, tn, &act_connmark_ops); |
235 | } | 235 | } |
236 | 236 | ||
237 | static void __net_exit connmark_exit_net(struct list_head *net_list) | 237 | static void __net_exit connmark_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c index 9b9288267a54..d3cfad88dc3a 100644 --- a/net/sched/act_csum.c +++ b/net/sched/act_csum.c | |||
@@ -714,7 +714,7 @@ static __net_init int csum_init_net(struct net *net) | |||
714 | { | 714 | { |
715 | struct tc_action_net *tn = net_generic(net, csum_net_id); | 715 | struct tc_action_net *tn = net_generic(net, csum_net_id); |
716 | 716 | ||
717 | return tc_action_net_init(tn, &act_csum_ops); | 717 | return tc_action_net_init(net, tn, &act_csum_ops); |
718 | } | 718 | } |
719 | 719 | ||
720 | static void __net_exit csum_exit_net(struct list_head *net_list) | 720 | static void __net_exit csum_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_ct.c b/net/sched/act_ct.c index 33a1a7406e87..cdd6f3818097 100644 --- a/net/sched/act_ct.c +++ b/net/sched/act_ct.c | |||
@@ -939,7 +939,7 @@ static __net_init int ct_init_net(struct net *net) | |||
939 | tn->labels = true; | 939 | tn->labels = true; |
940 | } | 940 | } |
941 | 941 | ||
942 | return tc_action_net_init(&tn->tn, &act_ct_ops); | 942 | return tc_action_net_init(net, &tn->tn, &act_ct_ops); |
943 | } | 943 | } |
944 | 944 | ||
945 | static void __net_exit ct_exit_net(struct list_head *net_list) | 945 | static void __net_exit ct_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_ctinfo.c b/net/sched/act_ctinfo.c index 06ef74b74911..0dbcfd1dca7b 100644 --- a/net/sched/act_ctinfo.c +++ b/net/sched/act_ctinfo.c | |||
@@ -376,7 +376,7 @@ static __net_init int ctinfo_init_net(struct net *net) | |||
376 | { | 376 | { |
377 | struct tc_action_net *tn = net_generic(net, ctinfo_net_id); | 377 | struct tc_action_net *tn = net_generic(net, ctinfo_net_id); |
378 | 378 | ||
379 | return tc_action_net_init(tn, &act_ctinfo_ops); | 379 | return tc_action_net_init(net, tn, &act_ctinfo_ops); |
380 | } | 380 | } |
381 | 381 | ||
382 | static void __net_exit ctinfo_exit_net(struct list_head *net_list) | 382 | static void __net_exit ctinfo_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c index 8f0140c6ca58..324f1d1f6d47 100644 --- a/net/sched/act_gact.c +++ b/net/sched/act_gact.c | |||
@@ -278,7 +278,7 @@ static __net_init int gact_init_net(struct net *net) | |||
278 | { | 278 | { |
279 | struct tc_action_net *tn = net_generic(net, gact_net_id); | 279 | struct tc_action_net *tn = net_generic(net, gact_net_id); |
280 | 280 | ||
281 | return tc_action_net_init(tn, &act_gact_ops); | 281 | return tc_action_net_init(net, tn, &act_gact_ops); |
282 | } | 282 | } |
283 | 283 | ||
284 | static void __net_exit gact_exit_net(struct list_head *net_list) | 284 | static void __net_exit gact_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c index 92ee853d43e6..3a31e241c647 100644 --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c | |||
@@ -890,7 +890,7 @@ static __net_init int ife_init_net(struct net *net) | |||
890 | { | 890 | { |
891 | struct tc_action_net *tn = net_generic(net, ife_net_id); | 891 | struct tc_action_net *tn = net_generic(net, ife_net_id); |
892 | 892 | ||
893 | return tc_action_net_init(tn, &act_ife_ops); | 893 | return tc_action_net_init(net, tn, &act_ife_ops); |
894 | } | 894 | } |
895 | 895 | ||
896 | static void __net_exit ife_exit_net(struct list_head *net_list) | 896 | static void __net_exit ife_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_ipt.c b/net/sched/act_ipt.c index ce2c30a591d2..214a03d405cf 100644 --- a/net/sched/act_ipt.c +++ b/net/sched/act_ipt.c | |||
@@ -61,12 +61,13 @@ static int ipt_init_target(struct net *net, struct xt_entry_target *t, | |||
61 | return 0; | 61 | return 0; |
62 | } | 62 | } |
63 | 63 | ||
64 | static void ipt_destroy_target(struct xt_entry_target *t) | 64 | static void ipt_destroy_target(struct xt_entry_target *t, struct net *net) |
65 | { | 65 | { |
66 | struct xt_tgdtor_param par = { | 66 | struct xt_tgdtor_param par = { |
67 | .target = t->u.kernel.target, | 67 | .target = t->u.kernel.target, |
68 | .targinfo = t->data, | 68 | .targinfo = t->data, |
69 | .family = NFPROTO_IPV4, | 69 | .family = NFPROTO_IPV4, |
70 | .net = net, | ||
70 | }; | 71 | }; |
71 | if (par.target->destroy != NULL) | 72 | if (par.target->destroy != NULL) |
72 | par.target->destroy(&par); | 73 | par.target->destroy(&par); |
@@ -78,7 +79,7 @@ static void tcf_ipt_release(struct tc_action *a) | |||
78 | struct tcf_ipt *ipt = to_ipt(a); | 79 | struct tcf_ipt *ipt = to_ipt(a); |
79 | 80 | ||
80 | if (ipt->tcfi_t) { | 81 | if (ipt->tcfi_t) { |
81 | ipt_destroy_target(ipt->tcfi_t); | 82 | ipt_destroy_target(ipt->tcfi_t, a->idrinfo->net); |
82 | kfree(ipt->tcfi_t); | 83 | kfree(ipt->tcfi_t); |
83 | } | 84 | } |
84 | kfree(ipt->tcfi_tname); | 85 | kfree(ipt->tcfi_tname); |
@@ -180,7 +181,7 @@ static int __tcf_ipt_init(struct net *net, unsigned int id, struct nlattr *nla, | |||
180 | 181 | ||
181 | spin_lock_bh(&ipt->tcf_lock); | 182 | spin_lock_bh(&ipt->tcf_lock); |
182 | if (ret != ACT_P_CREATED) { | 183 | if (ret != ACT_P_CREATED) { |
183 | ipt_destroy_target(ipt->tcfi_t); | 184 | ipt_destroy_target(ipt->tcfi_t, net); |
184 | kfree(ipt->tcfi_tname); | 185 | kfree(ipt->tcfi_tname); |
185 | kfree(ipt->tcfi_t); | 186 | kfree(ipt->tcfi_t); |
186 | } | 187 | } |
@@ -350,7 +351,7 @@ static __net_init int ipt_init_net(struct net *net) | |||
350 | { | 351 | { |
351 | struct tc_action_net *tn = net_generic(net, ipt_net_id); | 352 | struct tc_action_net *tn = net_generic(net, ipt_net_id); |
352 | 353 | ||
353 | return tc_action_net_init(tn, &act_ipt_ops); | 354 | return tc_action_net_init(net, tn, &act_ipt_ops); |
354 | } | 355 | } |
355 | 356 | ||
356 | static void __net_exit ipt_exit_net(struct list_head *net_list) | 357 | static void __net_exit ipt_exit_net(struct list_head *net_list) |
@@ -399,7 +400,7 @@ static __net_init int xt_init_net(struct net *net) | |||
399 | { | 400 | { |
400 | struct tc_action_net *tn = net_generic(net, xt_net_id); | 401 | struct tc_action_net *tn = net_generic(net, xt_net_id); |
401 | 402 | ||
402 | return tc_action_net_init(tn, &act_xt_ops); | 403 | return tc_action_net_init(net, tn, &act_xt_ops); |
403 | } | 404 | } |
404 | 405 | ||
405 | static void __net_exit xt_exit_net(struct list_head *net_list) | 406 | static void __net_exit xt_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c index be3f88dfc37e..9d1bf508075a 100644 --- a/net/sched/act_mirred.c +++ b/net/sched/act_mirred.c | |||
@@ -453,7 +453,7 @@ static __net_init int mirred_init_net(struct net *net) | |||
453 | { | 453 | { |
454 | struct tc_action_net *tn = net_generic(net, mirred_net_id); | 454 | struct tc_action_net *tn = net_generic(net, mirred_net_id); |
455 | 455 | ||
456 | return tc_action_net_init(tn, &act_mirred_ops); | 456 | return tc_action_net_init(net, tn, &act_mirred_ops); |
457 | } | 457 | } |
458 | 458 | ||
459 | static void __net_exit mirred_exit_net(struct list_head *net_list) | 459 | static void __net_exit mirred_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_mpls.c b/net/sched/act_mpls.c index 0f299e3b618c..e168df0e008a 100644 --- a/net/sched/act_mpls.c +++ b/net/sched/act_mpls.c | |||
@@ -375,7 +375,7 @@ static __net_init int mpls_init_net(struct net *net) | |||
375 | { | 375 | { |
376 | struct tc_action_net *tn = net_generic(net, mpls_net_id); | 376 | struct tc_action_net *tn = net_generic(net, mpls_net_id); |
377 | 377 | ||
378 | return tc_action_net_init(tn, &act_mpls_ops); | 378 | return tc_action_net_init(net, tn, &act_mpls_ops); |
379 | } | 379 | } |
380 | 380 | ||
381 | static void __net_exit mpls_exit_net(struct list_head *net_list) | 381 | static void __net_exit mpls_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c index 7b858c11b1b5..ea4c5359e7df 100644 --- a/net/sched/act_nat.c +++ b/net/sched/act_nat.c | |||
@@ -327,7 +327,7 @@ static __net_init int nat_init_net(struct net *net) | |||
327 | { | 327 | { |
328 | struct tc_action_net *tn = net_generic(net, nat_net_id); | 328 | struct tc_action_net *tn = net_generic(net, nat_net_id); |
329 | 329 | ||
330 | return tc_action_net_init(tn, &act_nat_ops); | 330 | return tc_action_net_init(net, tn, &act_nat_ops); |
331 | } | 331 | } |
332 | 332 | ||
333 | static void __net_exit nat_exit_net(struct list_head *net_list) | 333 | static void __net_exit nat_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c index 17360c6faeaa..cdfaa79382a2 100644 --- a/net/sched/act_pedit.c +++ b/net/sched/act_pedit.c | |||
@@ -498,7 +498,7 @@ static __net_init int pedit_init_net(struct net *net) | |||
498 | { | 498 | { |
499 | struct tc_action_net *tn = net_generic(net, pedit_net_id); | 499 | struct tc_action_net *tn = net_generic(net, pedit_net_id); |
500 | 500 | ||
501 | return tc_action_net_init(tn, &act_pedit_ops); | 501 | return tc_action_net_init(net, tn, &act_pedit_ops); |
502 | } | 502 | } |
503 | 503 | ||
504 | static void __net_exit pedit_exit_net(struct list_head *net_list) | 504 | static void __net_exit pedit_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_police.c b/net/sched/act_police.c index 49cec3e64a4d..6315e0f8d26e 100644 --- a/net/sched/act_police.c +++ b/net/sched/act_police.c | |||
@@ -371,7 +371,7 @@ static __net_init int police_init_net(struct net *net) | |||
371 | { | 371 | { |
372 | struct tc_action_net *tn = net_generic(net, police_net_id); | 372 | struct tc_action_net *tn = net_generic(net, police_net_id); |
373 | 373 | ||
374 | return tc_action_net_init(tn, &act_police_ops); | 374 | return tc_action_net_init(net, tn, &act_police_ops); |
375 | } | 375 | } |
376 | 376 | ||
377 | static void __net_exit police_exit_net(struct list_head *net_list) | 377 | static void __net_exit police_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c index 595308d60133..10229124a992 100644 --- a/net/sched/act_sample.c +++ b/net/sched/act_sample.c | |||
@@ -102,13 +102,17 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, | |||
102 | goto_ch = tcf_action_set_ctrlact(*a, parm->action, goto_ch); | 102 | goto_ch = tcf_action_set_ctrlact(*a, parm->action, goto_ch); |
103 | s->rate = rate; | 103 | s->rate = rate; |
104 | s->psample_group_num = psample_group_num; | 104 | s->psample_group_num = psample_group_num; |
105 | RCU_INIT_POINTER(s->psample_group, psample_group); | 105 | rcu_swap_protected(s->psample_group, psample_group, |
106 | lockdep_is_held(&s->tcf_lock)); | ||
106 | 107 | ||
107 | if (tb[TCA_SAMPLE_TRUNC_SIZE]) { | 108 | if (tb[TCA_SAMPLE_TRUNC_SIZE]) { |
108 | s->truncate = true; | 109 | s->truncate = true; |
109 | s->trunc_size = nla_get_u32(tb[TCA_SAMPLE_TRUNC_SIZE]); | 110 | s->trunc_size = nla_get_u32(tb[TCA_SAMPLE_TRUNC_SIZE]); |
110 | } | 111 | } |
111 | spin_unlock_bh(&s->tcf_lock); | 112 | spin_unlock_bh(&s->tcf_lock); |
113 | |||
114 | if (psample_group) | ||
115 | psample_group_put(psample_group); | ||
112 | if (goto_ch) | 116 | if (goto_ch) |
113 | tcf_chain_put_by_act(goto_ch); | 117 | tcf_chain_put_by_act(goto_ch); |
114 | 118 | ||
@@ -265,7 +269,7 @@ static __net_init int sample_init_net(struct net *net) | |||
265 | { | 269 | { |
266 | struct tc_action_net *tn = net_generic(net, sample_net_id); | 270 | struct tc_action_net *tn = net_generic(net, sample_net_id); |
267 | 271 | ||
268 | return tc_action_net_init(tn, &act_sample_ops); | 272 | return tc_action_net_init(net, tn, &act_sample_ops); |
269 | } | 273 | } |
270 | 274 | ||
271 | static void __net_exit sample_exit_net(struct list_head *net_list) | 275 | static void __net_exit sample_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c index 33aefa25b545..6120e56117ca 100644 --- a/net/sched/act_simple.c +++ b/net/sched/act_simple.c | |||
@@ -232,7 +232,7 @@ static __net_init int simp_init_net(struct net *net) | |||
232 | { | 232 | { |
233 | struct tc_action_net *tn = net_generic(net, simp_net_id); | 233 | struct tc_action_net *tn = net_generic(net, simp_net_id); |
234 | 234 | ||
235 | return tc_action_net_init(tn, &act_simp_ops); | 235 | return tc_action_net_init(net, tn, &act_simp_ops); |
236 | } | 236 | } |
237 | 237 | ||
238 | static void __net_exit simp_exit_net(struct list_head *net_list) | 238 | static void __net_exit simp_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index 37dced00b63d..6a8d3337c577 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c | |||
@@ -336,7 +336,7 @@ static __net_init int skbedit_init_net(struct net *net) | |||
336 | { | 336 | { |
337 | struct tc_action_net *tn = net_generic(net, skbedit_net_id); | 337 | struct tc_action_net *tn = net_generic(net, skbedit_net_id); |
338 | 338 | ||
339 | return tc_action_net_init(tn, &act_skbedit_ops); | 339 | return tc_action_net_init(net, tn, &act_skbedit_ops); |
340 | } | 340 | } |
341 | 341 | ||
342 | static void __net_exit skbedit_exit_net(struct list_head *net_list) | 342 | static void __net_exit skbedit_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c index 7da3518e18ef..888437f97ba6 100644 --- a/net/sched/act_skbmod.c +++ b/net/sched/act_skbmod.c | |||
@@ -287,7 +287,7 @@ static __net_init int skbmod_init_net(struct net *net) | |||
287 | { | 287 | { |
288 | struct tc_action_net *tn = net_generic(net, skbmod_net_id); | 288 | struct tc_action_net *tn = net_generic(net, skbmod_net_id); |
289 | 289 | ||
290 | return tc_action_net_init(tn, &act_skbmod_ops); | 290 | return tc_action_net_init(net, tn, &act_skbmod_ops); |
291 | } | 291 | } |
292 | 292 | ||
293 | static void __net_exit skbmod_exit_net(struct list_head *net_list) | 293 | static void __net_exit skbmod_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c index 6d0debdc9b97..2f83a79f76aa 100644 --- a/net/sched/act_tunnel_key.c +++ b/net/sched/act_tunnel_key.c | |||
@@ -600,7 +600,7 @@ static __net_init int tunnel_key_init_net(struct net *net) | |||
600 | { | 600 | { |
601 | struct tc_action_net *tn = net_generic(net, tunnel_key_net_id); | 601 | struct tc_action_net *tn = net_generic(net, tunnel_key_net_id); |
602 | 602 | ||
603 | return tc_action_net_init(tn, &act_tunnel_key_ops); | 603 | return tc_action_net_init(net, tn, &act_tunnel_key_ops); |
604 | } | 604 | } |
605 | 605 | ||
606 | static void __net_exit tunnel_key_exit_net(struct list_head *net_list) | 606 | static void __net_exit tunnel_key_exit_net(struct list_head *net_list) |
diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c index a3c9eea1ee8a..287a30bf8930 100644 --- a/net/sched/act_vlan.c +++ b/net/sched/act_vlan.c | |||
@@ -334,7 +334,7 @@ static __net_init int vlan_init_net(struct net *net) | |||
334 | { | 334 | { |
335 | struct tc_action_net *tn = net_generic(net, vlan_net_id); | 335 | struct tc_action_net *tn = net_generic(net, vlan_net_id); |
336 | 336 | ||
337 | return tc_action_net_init(tn, &act_vlan_ops); | 337 | return tc_action_net_init(net, tn, &act_vlan_ops); |
338 | } | 338 | } |
339 | 339 | ||
340 | static void __net_exit vlan_exit_net(struct list_head *net_list) | 340 | static void __net_exit vlan_exit_net(struct list_head *net_list) |
diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c index 732e109c3055..810645b5c086 100644 --- a/net/sched/sch_cbs.c +++ b/net/sched/sch_cbs.c | |||
@@ -181,11 +181,6 @@ static struct sk_buff *cbs_dequeue_soft(struct Qdisc *sch) | |||
181 | s64 credits; | 181 | s64 credits; |
182 | int len; | 182 | int len; |
183 | 183 | ||
184 | if (atomic64_read(&q->port_rate) == -1) { | ||
185 | WARN_ONCE(1, "cbs: dequeue() called with unknown port rate."); | ||
186 | return NULL; | ||
187 | } | ||
188 | |||
189 | if (q->credits < 0) { | 184 | if (q->credits < 0) { |
190 | credits = timediff_to_credits(now - q->last, q->idleslope); | 185 | credits = timediff_to_credits(now - q->last, q->idleslope); |
191 | 186 | ||
@@ -303,11 +298,19 @@ static int cbs_enable_offload(struct net_device *dev, struct cbs_sched_data *q, | |||
303 | static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q) | 298 | static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q) |
304 | { | 299 | { |
305 | struct ethtool_link_ksettings ecmd; | 300 | struct ethtool_link_ksettings ecmd; |
301 | int speed = SPEED_10; | ||
306 | int port_rate = -1; | 302 | int port_rate = -1; |
303 | int err; | ||
304 | |||
305 | err = __ethtool_get_link_ksettings(dev, &ecmd); | ||
306 | if (err < 0) | ||
307 | goto skip; | ||
308 | |||
309 | if (ecmd.base.speed != SPEED_UNKNOWN) | ||
310 | speed = ecmd.base.speed; | ||
307 | 311 | ||
308 | if (!__ethtool_get_link_ksettings(dev, &ecmd) && | 312 | skip: |
309 | ecmd.base.speed != SPEED_UNKNOWN) | 313 | port_rate = speed * 1000 * BYTES_PER_KBIT; |
310 | port_rate = ecmd.base.speed * 1000 * BYTES_PER_KBIT; | ||
311 | 314 | ||
312 | atomic64_set(&q->port_rate, port_rate); | 315 | atomic64_set(&q->port_rate, port_rate); |
313 | netdev_dbg(dev, "cbs: set %s's port_rate to: %lld, linkspeed: %d\n", | 316 | netdev_dbg(dev, "cbs: set %s's port_rate to: %lld, linkspeed: %d\n", |
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 11c03cf4aa74..137db1cbde85 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -624,8 +624,12 @@ static int pfifo_fast_enqueue(struct sk_buff *skb, struct Qdisc *qdisc, | |||
624 | 624 | ||
625 | err = skb_array_produce(q, skb); | 625 | err = skb_array_produce(q, skb); |
626 | 626 | ||
627 | if (unlikely(err)) | 627 | if (unlikely(err)) { |
628 | return qdisc_drop_cpu(skb, qdisc, to_free); | 628 | if (qdisc_is_percpu_stats(qdisc)) |
629 | return qdisc_drop_cpu(skb, qdisc, to_free); | ||
630 | else | ||
631 | return qdisc_drop(skb, qdisc, to_free); | ||
632 | } | ||
629 | 633 | ||
630 | qdisc_update_stats_at_enqueue(qdisc, pkt_len); | 634 | qdisc_update_stats_at_enqueue(qdisc, pkt_len); |
631 | return NET_XMIT_SUCCESS; | 635 | return NET_XMIT_SUCCESS; |
@@ -688,11 +692,14 @@ static void pfifo_fast_reset(struct Qdisc *qdisc) | |||
688 | kfree_skb(skb); | 692 | kfree_skb(skb); |
689 | } | 693 | } |
690 | 694 | ||
691 | for_each_possible_cpu(i) { | 695 | if (qdisc_is_percpu_stats(qdisc)) { |
692 | struct gnet_stats_queue *q = per_cpu_ptr(qdisc->cpu_qstats, i); | 696 | for_each_possible_cpu(i) { |
697 | struct gnet_stats_queue *q; | ||
693 | 698 | ||
694 | q->backlog = 0; | 699 | q = per_cpu_ptr(qdisc->cpu_qstats, i); |
695 | q->qlen = 0; | 700 | q->backlog = 0; |
701 | q->qlen = 0; | ||
702 | } | ||
696 | } | 703 | } |
697 | } | 704 | } |
698 | 705 | ||
diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c index e25d414ae12f..8d8bc2ec5cd6 100644 --- a/net/sched/sch_taprio.c +++ b/net/sched/sch_taprio.c | |||
@@ -477,11 +477,6 @@ static struct sk_buff *taprio_dequeue(struct Qdisc *sch) | |||
477 | u32 gate_mask; | 477 | u32 gate_mask; |
478 | int i; | 478 | int i; |
479 | 479 | ||
480 | if (atomic64_read(&q->picos_per_byte) == -1) { | ||
481 | WARN_ONCE(1, "taprio: dequeue() called with unknown picos per byte."); | ||
482 | return NULL; | ||
483 | } | ||
484 | |||
485 | rcu_read_lock(); | 480 | rcu_read_lock(); |
486 | entry = rcu_dereference(q->current_entry); | 481 | entry = rcu_dereference(q->current_entry); |
487 | /* if there's no entry, it means that the schedule didn't | 482 | /* if there's no entry, it means that the schedule didn't |
@@ -958,12 +953,20 @@ static void taprio_set_picos_per_byte(struct net_device *dev, | |||
958 | struct taprio_sched *q) | 953 | struct taprio_sched *q) |
959 | { | 954 | { |
960 | struct ethtool_link_ksettings ecmd; | 955 | struct ethtool_link_ksettings ecmd; |
961 | int picos_per_byte = -1; | 956 | int speed = SPEED_10; |
957 | int picos_per_byte; | ||
958 | int err; | ||
962 | 959 | ||
963 | if (!__ethtool_get_link_ksettings(dev, &ecmd) && | 960 | err = __ethtool_get_link_ksettings(dev, &ecmd); |
964 | ecmd.base.speed != SPEED_UNKNOWN) | 961 | if (err < 0) |
965 | picos_per_byte = div64_s64(NSEC_PER_SEC * 1000LL * 8, | 962 | goto skip; |
966 | ecmd.base.speed * 1000 * 1000); | 963 | |
964 | if (ecmd.base.speed != SPEED_UNKNOWN) | ||
965 | speed = ecmd.base.speed; | ||
966 | |||
967 | skip: | ||
968 | picos_per_byte = div64_s64(NSEC_PER_SEC * 1000LL * 8, | ||
969 | speed * 1000 * 1000); | ||
967 | 970 | ||
968 | atomic64_set(&q->picos_per_byte, picos_per_byte); | 971 | atomic64_set(&q->picos_per_byte, picos_per_byte); |
969 | netdev_dbg(dev, "taprio: set %s's picos_per_byte to: %lld, linkspeed: %d\n", | 972 | netdev_dbg(dev, "taprio: set %s's picos_per_byte to: %lld, linkspeed: %d\n", |
@@ -1249,6 +1252,10 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt, | |||
1249 | */ | 1252 | */ |
1250 | q->clockid = -1; | 1253 | q->clockid = -1; |
1251 | 1254 | ||
1255 | spin_lock(&taprio_list_lock); | ||
1256 | list_add(&q->taprio_list, &taprio_list); | ||
1257 | spin_unlock(&taprio_list_lock); | ||
1258 | |||
1252 | if (sch->parent != TC_H_ROOT) | 1259 | if (sch->parent != TC_H_ROOT) |
1253 | return -EOPNOTSUPP; | 1260 | return -EOPNOTSUPP; |
1254 | 1261 | ||
@@ -1266,10 +1273,6 @@ static int taprio_init(struct Qdisc *sch, struct nlattr *opt, | |||
1266 | if (!opt) | 1273 | if (!opt) |
1267 | return -EINVAL; | 1274 | return -EINVAL; |
1268 | 1275 | ||
1269 | spin_lock(&taprio_list_lock); | ||
1270 | list_add(&q->taprio_list, &taprio_list); | ||
1271 | spin_unlock(&taprio_list_lock); | ||
1272 | |||
1273 | for (i = 0; i < dev->num_tx_queues; i++) { | 1276 | for (i = 0; i < dev->num_tx_queues; i++) { |
1274 | struct netdev_queue *dev_queue; | 1277 | struct netdev_queue *dev_queue; |
1275 | struct Qdisc *qdisc; | 1278 | struct Qdisc *qdisc; |
diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c index f0de323d15d6..6c8f09c1ce51 100644 --- a/net/smc/smc_tx.c +++ b/net/smc/smc_tx.c | |||
@@ -76,13 +76,11 @@ static int smc_tx_wait(struct smc_sock *smc, int flags) | |||
76 | DEFINE_WAIT_FUNC(wait, woken_wake_function); | 76 | DEFINE_WAIT_FUNC(wait, woken_wake_function); |
77 | struct smc_connection *conn = &smc->conn; | 77 | struct smc_connection *conn = &smc->conn; |
78 | struct sock *sk = &smc->sk; | 78 | struct sock *sk = &smc->sk; |
79 | bool noblock; | ||
80 | long timeo; | 79 | long timeo; |
81 | int rc = 0; | 80 | int rc = 0; |
82 | 81 | ||
83 | /* similar to sk_stream_wait_memory */ | 82 | /* similar to sk_stream_wait_memory */ |
84 | timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); | 83 | timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); |
85 | noblock = timeo ? false : true; | ||
86 | add_wait_queue(sk_sleep(sk), &wait); | 84 | add_wait_queue(sk_sleep(sk), &wait); |
87 | while (1) { | 85 | while (1) { |
88 | sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); | 86 | sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk); |
@@ -97,8 +95,8 @@ static int smc_tx_wait(struct smc_sock *smc, int flags) | |||
97 | break; | 95 | break; |
98 | } | 96 | } |
99 | if (!timeo) { | 97 | if (!timeo) { |
100 | if (noblock) | 98 | /* ensure EPOLLOUT is subsequently generated */ |
101 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); | 99 | set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); |
102 | rc = -EAGAIN; | 100 | rc = -EAGAIN; |
103 | break; | 101 | break; |
104 | } | 102 | } |
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index d8679b6027e9..a07b516e503a 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1970,6 +1970,7 @@ call_bind(struct rpc_task *task) | |||
1970 | static void | 1970 | static void |
1971 | call_bind_status(struct rpc_task *task) | 1971 | call_bind_status(struct rpc_task *task) |
1972 | { | 1972 | { |
1973 | struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; | ||
1973 | int status = -EIO; | 1974 | int status = -EIO; |
1974 | 1975 | ||
1975 | if (rpc_task_transmitted(task)) { | 1976 | if (rpc_task_transmitted(task)) { |
@@ -1977,14 +1978,15 @@ call_bind_status(struct rpc_task *task) | |||
1977 | return; | 1978 | return; |
1978 | } | 1979 | } |
1979 | 1980 | ||
1980 | if (task->tk_status >= 0) { | 1981 | dprint_status(task); |
1981 | dprint_status(task); | 1982 | trace_rpc_bind_status(task); |
1983 | if (task->tk_status >= 0) | ||
1984 | goto out_next; | ||
1985 | if (xprt_bound(xprt)) { | ||
1982 | task->tk_status = 0; | 1986 | task->tk_status = 0; |
1983 | task->tk_action = call_connect; | 1987 | goto out_next; |
1984 | return; | ||
1985 | } | 1988 | } |
1986 | 1989 | ||
1987 | trace_rpc_bind_status(task); | ||
1988 | switch (task->tk_status) { | 1990 | switch (task->tk_status) { |
1989 | case -ENOMEM: | 1991 | case -ENOMEM: |
1990 | dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid); | 1992 | dprintk("RPC: %5u rpcbind out of memory\n", task->tk_pid); |
@@ -2003,6 +2005,9 @@ call_bind_status(struct rpc_task *task) | |||
2003 | task->tk_rebind_retry--; | 2005 | task->tk_rebind_retry--; |
2004 | rpc_delay(task, 3*HZ); | 2006 | rpc_delay(task, 3*HZ); |
2005 | goto retry_timeout; | 2007 | goto retry_timeout; |
2008 | case -ENOBUFS: | ||
2009 | rpc_delay(task, HZ >> 2); | ||
2010 | goto retry_timeout; | ||
2006 | case -EAGAIN: | 2011 | case -EAGAIN: |
2007 | goto retry_timeout; | 2012 | goto retry_timeout; |
2008 | case -ETIMEDOUT: | 2013 | case -ETIMEDOUT: |
@@ -2026,7 +2031,6 @@ call_bind_status(struct rpc_task *task) | |||
2026 | case -ENETDOWN: | 2031 | case -ENETDOWN: |
2027 | case -EHOSTUNREACH: | 2032 | case -EHOSTUNREACH: |
2028 | case -ENETUNREACH: | 2033 | case -ENETUNREACH: |
2029 | case -ENOBUFS: | ||
2030 | case -EPIPE: | 2034 | case -EPIPE: |
2031 | dprintk("RPC: %5u remote rpcbind unreachable: %d\n", | 2035 | dprintk("RPC: %5u remote rpcbind unreachable: %d\n", |
2032 | task->tk_pid, task->tk_status); | 2036 | task->tk_pid, task->tk_status); |
@@ -2043,7 +2047,9 @@ call_bind_status(struct rpc_task *task) | |||
2043 | 2047 | ||
2044 | rpc_call_rpcerror(task, status); | 2048 | rpc_call_rpcerror(task, status); |
2045 | return; | 2049 | return; |
2046 | 2050 | out_next: | |
2051 | task->tk_action = call_connect; | ||
2052 | return; | ||
2047 | retry_timeout: | 2053 | retry_timeout: |
2048 | task->tk_status = 0; | 2054 | task->tk_status = 0; |
2049 | task->tk_action = call_bind; | 2055 | task->tk_action = call_bind; |
@@ -2090,6 +2096,7 @@ call_connect(struct rpc_task *task) | |||
2090 | static void | 2096 | static void |
2091 | call_connect_status(struct rpc_task *task) | 2097 | call_connect_status(struct rpc_task *task) |
2092 | { | 2098 | { |
2099 | struct rpc_xprt *xprt = task->tk_rqstp->rq_xprt; | ||
2093 | struct rpc_clnt *clnt = task->tk_client; | 2100 | struct rpc_clnt *clnt = task->tk_client; |
2094 | int status = task->tk_status; | 2101 | int status = task->tk_status; |
2095 | 2102 | ||
@@ -2099,8 +2106,17 @@ call_connect_status(struct rpc_task *task) | |||
2099 | } | 2106 | } |
2100 | 2107 | ||
2101 | dprint_status(task); | 2108 | dprint_status(task); |
2102 | |||
2103 | trace_rpc_connect_status(task); | 2109 | trace_rpc_connect_status(task); |
2110 | |||
2111 | if (task->tk_status == 0) { | ||
2112 | clnt->cl_stats->netreconn++; | ||
2113 | goto out_next; | ||
2114 | } | ||
2115 | if (xprt_connected(xprt)) { | ||
2116 | task->tk_status = 0; | ||
2117 | goto out_next; | ||
2118 | } | ||
2119 | |||
2104 | task->tk_status = 0; | 2120 | task->tk_status = 0; |
2105 | switch (status) { | 2121 | switch (status) { |
2106 | case -ECONNREFUSED: | 2122 | case -ECONNREFUSED: |
@@ -2117,8 +2133,6 @@ call_connect_status(struct rpc_task *task) | |||
2117 | case -ENETDOWN: | 2133 | case -ENETDOWN: |
2118 | case -ENETUNREACH: | 2134 | case -ENETUNREACH: |
2119 | case -EHOSTUNREACH: | 2135 | case -EHOSTUNREACH: |
2120 | case -EADDRINUSE: | ||
2121 | case -ENOBUFS: | ||
2122 | case -EPIPE: | 2136 | case -EPIPE: |
2123 | xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, | 2137 | xprt_conditional_disconnect(task->tk_rqstp->rq_xprt, |
2124 | task->tk_rqstp->rq_connect_cookie); | 2138 | task->tk_rqstp->rq_connect_cookie); |
@@ -2127,17 +2141,20 @@ call_connect_status(struct rpc_task *task) | |||
2127 | /* retry with existing socket, after a delay */ | 2141 | /* retry with existing socket, after a delay */ |
2128 | rpc_delay(task, 3*HZ); | 2142 | rpc_delay(task, 3*HZ); |
2129 | /* fall through */ | 2143 | /* fall through */ |
2144 | case -EADDRINUSE: | ||
2130 | case -ENOTCONN: | 2145 | case -ENOTCONN: |
2131 | case -EAGAIN: | 2146 | case -EAGAIN: |
2132 | case -ETIMEDOUT: | 2147 | case -ETIMEDOUT: |
2133 | goto out_retry; | 2148 | goto out_retry; |
2134 | case 0: | 2149 | case -ENOBUFS: |
2135 | clnt->cl_stats->netreconn++; | 2150 | rpc_delay(task, HZ >> 2); |
2136 | task->tk_action = call_transmit; | 2151 | goto out_retry; |
2137 | return; | ||
2138 | } | 2152 | } |
2139 | rpc_call_rpcerror(task, status); | 2153 | rpc_call_rpcerror(task, status); |
2140 | return; | 2154 | return; |
2155 | out_next: | ||
2156 | task->tk_action = call_transmit; | ||
2157 | return; | ||
2141 | out_retry: | 2158 | out_retry: |
2142 | /* Check for timeouts before looping back to call_bind */ | 2159 | /* Check for timeouts before looping back to call_bind */ |
2143 | task->tk_action = call_bind; | 2160 | task->tk_action = call_bind; |
@@ -2365,7 +2382,7 @@ call_status(struct rpc_task *task) | |||
2365 | case -ECONNABORTED: | 2382 | case -ECONNABORTED: |
2366 | case -ENOTCONN: | 2383 | case -ENOTCONN: |
2367 | rpc_force_rebind(clnt); | 2384 | rpc_force_rebind(clnt); |
2368 | /* fall through */ | 2385 | break; |
2369 | case -EADDRINUSE: | 2386 | case -EADDRINUSE: |
2370 | rpc_delay(task, 3*HZ); | 2387 | rpc_delay(task, 3*HZ); |
2371 | /* fall through */ | 2388 | /* fall through */ |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 783748dc5e6f..2e71f5455c6c 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -1408,13 +1408,6 @@ xprt_request_transmit(struct rpc_rqst *req, struct rpc_task *snd_task) | |||
1408 | status = -EBADMSG; | 1408 | status = -EBADMSG; |
1409 | goto out_dequeue; | 1409 | goto out_dequeue; |
1410 | } | 1410 | } |
1411 | if (task->tk_ops->rpc_call_prepare_transmit) { | ||
1412 | task->tk_ops->rpc_call_prepare_transmit(task, | ||
1413 | task->tk_calldata); | ||
1414 | status = task->tk_status; | ||
1415 | if (status < 0) | ||
1416 | goto out_dequeue; | ||
1417 | } | ||
1418 | if (RPC_SIGNALLED(task)) { | 1411 | if (RPC_SIGNALLED(task)) { |
1419 | status = -ERESTARTSYS; | 1412 | status = -ERESTARTSYS; |
1420 | goto out_dequeue; | 1413 | goto out_dequeue; |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 4831ad745f91..327479ce69f5 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -2788,7 +2788,7 @@ static void reg_process_pending_hints(void) | |||
2788 | 2788 | ||
2789 | /* When last_request->processed becomes true this will be rescheduled */ | 2789 | /* When last_request->processed becomes true this will be rescheduled */ |
2790 | if (lr && !lr->processed) { | 2790 | if (lr && !lr->processed) { |
2791 | reg_process_hint(lr); | 2791 | pr_debug("Pending regulatory request, waiting for it to be processed...\n"); |
2792 | return; | 2792 | return; |
2793 | } | 2793 | } |
2794 | 2794 | ||
diff --git a/net/wireless/util.c b/net/wireless/util.c index d0e35b7b9e35..e74837824cea 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c | |||
@@ -233,25 +233,30 @@ int cfg80211_validate_key_settings(struct cfg80211_registered_device *rdev, | |||
233 | 233 | ||
234 | switch (params->cipher) { | 234 | switch (params->cipher) { |
235 | case WLAN_CIPHER_SUITE_TKIP: | 235 | case WLAN_CIPHER_SUITE_TKIP: |
236 | /* Extended Key ID can only be used with CCMP/GCMP ciphers */ | ||
237 | if ((pairwise && key_idx) || | ||
238 | params->mode != NL80211_KEY_RX_TX) | ||
239 | return -EINVAL; | ||
240 | break; | ||
236 | case WLAN_CIPHER_SUITE_CCMP: | 241 | case WLAN_CIPHER_SUITE_CCMP: |
237 | case WLAN_CIPHER_SUITE_CCMP_256: | 242 | case WLAN_CIPHER_SUITE_CCMP_256: |
238 | case WLAN_CIPHER_SUITE_GCMP: | 243 | case WLAN_CIPHER_SUITE_GCMP: |
239 | case WLAN_CIPHER_SUITE_GCMP_256: | 244 | case WLAN_CIPHER_SUITE_GCMP_256: |
240 | /* IEEE802.11-2016 allows only 0 and - when using Extended Key | 245 | /* IEEE802.11-2016 allows only 0 and - when supporting |
241 | * ID - 1 as index for pairwise keys. | 246 | * Extended Key ID - 1 as index for pairwise keys. |
242 | * @NL80211_KEY_NO_TX is only allowed for pairwise keys when | 247 | * @NL80211_KEY_NO_TX is only allowed for pairwise keys when |
243 | * the driver supports Extended Key ID. | 248 | * the driver supports Extended Key ID. |
244 | * @NL80211_KEY_SET_TX can't be set when installing and | 249 | * @NL80211_KEY_SET_TX can't be set when installing and |
245 | * validating a key. | 250 | * validating a key. |
246 | */ | 251 | */ |
247 | if (params->mode == NL80211_KEY_NO_TX) { | 252 | if ((params->mode == NL80211_KEY_NO_TX && !pairwise) || |
248 | if (!wiphy_ext_feature_isset(&rdev->wiphy, | 253 | params->mode == NL80211_KEY_SET_TX) |
249 | NL80211_EXT_FEATURE_EXT_KEY_ID)) | 254 | return -EINVAL; |
250 | return -EINVAL; | 255 | if (wiphy_ext_feature_isset(&rdev->wiphy, |
251 | else if (!pairwise || key_idx < 0 || key_idx > 1) | 256 | NL80211_EXT_FEATURE_EXT_KEY_ID)) { |
257 | if (pairwise && (key_idx < 0 || key_idx > 1)) | ||
252 | return -EINVAL; | 258 | return -EINVAL; |
253 | } else if ((pairwise && key_idx) || | 259 | } else if (pairwise && key_idx) { |
254 | params->mode == NL80211_KEY_SET_TX) { | ||
255 | return -EINVAL; | 260 | return -EINVAL; |
256 | } | 261 | } |
257 | break; | 262 | break; |
diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c index 83de74ca729a..688aac7a6943 100644 --- a/net/xdp/xdp_umem.c +++ b/net/xdp/xdp_umem.c | |||
@@ -365,7 +365,7 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr) | |||
365 | umem->pages = kcalloc(umem->npgs, sizeof(*umem->pages), GFP_KERNEL); | 365 | umem->pages = kcalloc(umem->npgs, sizeof(*umem->pages), GFP_KERNEL); |
366 | if (!umem->pages) { | 366 | if (!umem->pages) { |
367 | err = -ENOMEM; | 367 | err = -ENOMEM; |
368 | goto out_account; | 368 | goto out_pin; |
369 | } | 369 | } |
370 | 370 | ||
371 | for (i = 0; i < umem->npgs; i++) | 371 | for (i = 0; i < umem->npgs; i++) |
@@ -373,6 +373,8 @@ static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr) | |||
373 | 373 | ||
374 | return 0; | 374 | return 0; |
375 | 375 | ||
376 | out_pin: | ||
377 | xdp_umem_unpin_pages(umem); | ||
376 | out_account: | 378 | out_account: |
377 | xdp_umem_unaccount_pages(umem); | 379 | xdp_umem_unaccount_pages(umem); |
378 | return err; | 380 | return err; |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 8ca637a72697..ec94f5795ea4 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -3269,7 +3269,7 @@ decode_session4(struct sk_buff *skb, struct flowi *fl, bool reverse) | |||
3269 | struct flowi4 *fl4 = &fl->u.ip4; | 3269 | struct flowi4 *fl4 = &fl->u.ip4; |
3270 | int oif = 0; | 3270 | int oif = 0; |
3271 | 3271 | ||
3272 | if (skb_dst(skb)) | 3272 | if (skb_dst(skb) && skb_dst(skb)->dev) |
3273 | oif = skb_dst(skb)->dev->ifindex; | 3273 | oif = skb_dst(skb)->dev->ifindex; |
3274 | 3274 | ||
3275 | memset(fl4, 0, sizeof(struct flowi4)); | 3275 | memset(fl4, 0, sizeof(struct flowi4)); |
@@ -3387,7 +3387,7 @@ decode_session6(struct sk_buff *skb, struct flowi *fl, bool reverse) | |||
3387 | 3387 | ||
3388 | nexthdr = nh[nhoff]; | 3388 | nexthdr = nh[nhoff]; |
3389 | 3389 | ||
3390 | if (skb_dst(skb)) | 3390 | if (skb_dst(skb) && skb_dst(skb)->dev) |
3391 | oif = skb_dst(skb)->dev->ifindex; | 3391 | oif = skb_dst(skb)->dev->ifindex; |
3392 | 3392 | ||
3393 | memset(fl6, 0, sizeof(struct flowi6)); | 3393 | memset(fl6, 0, sizeof(struct flowi6)); |