diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/sock.c | 7 | ||||
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 3 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 9 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 9 |
4 files changed, 19 insertions, 9 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 653f8c0aedc5..9e5b71fda6ec 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1592,6 +1592,11 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, | |||
1592 | gfp_t gfp_mask; | 1592 | gfp_t gfp_mask; |
1593 | long timeo; | 1593 | long timeo; |
1594 | int err; | 1594 | int err; |
1595 | int npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
1596 | |||
1597 | err = -EMSGSIZE; | ||
1598 | if (npages > MAX_SKB_FRAGS) | ||
1599 | goto failure; | ||
1595 | 1600 | ||
1596 | gfp_mask = sk->sk_allocation; | 1601 | gfp_mask = sk->sk_allocation; |
1597 | if (gfp_mask & __GFP_WAIT) | 1602 | if (gfp_mask & __GFP_WAIT) |
@@ -1610,14 +1615,12 @@ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len, | |||
1610 | if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { | 1615 | if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { |
1611 | skb = alloc_skb(header_len, gfp_mask); | 1616 | skb = alloc_skb(header_len, gfp_mask); |
1612 | if (skb) { | 1617 | if (skb) { |
1613 | int npages; | ||
1614 | int i; | 1618 | int i; |
1615 | 1619 | ||
1616 | /* No pages, we're done... */ | 1620 | /* No pages, we're done... */ |
1617 | if (!data_len) | 1621 | if (!data_len) |
1618 | break; | 1622 | break; |
1619 | 1623 | ||
1620 | npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT; | ||
1621 | skb->truesize += data_len; | 1624 | skb->truesize += data_len; |
1622 | skb_shinfo(skb)->nr_frags = npages; | 1625 | skb_shinfo(skb)->nr_frags = npages; |
1623 | for (i = 0; i < npages; i++) { | 1626 | for (i = 0; i < npages; i++) { |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 95e61596e605..f9ee7417f6a0 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -377,7 +377,8 @@ struct dst_entry *inet_csk_route_req(struct sock *sk, | |||
377 | 377 | ||
378 | flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark, | 378 | flowi4_init_output(fl4, sk->sk_bound_dev_if, sk->sk_mark, |
379 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, | 379 | RT_CONN_FLAGS(sk), RT_SCOPE_UNIVERSE, |
380 | sk->sk_protocol, inet_sk_flowi_flags(sk), | 380 | sk->sk_protocol, |
381 | inet_sk_flowi_flags(sk) & ~FLOWI_FLAG_PRECOW_METRICS, | ||
381 | (opt && opt->opt.srr) ? opt->opt.faddr : ireq->rmt_addr, | 382 | (opt && opt->opt.srr) ? opt->opt.faddr : ireq->rmt_addr, |
382 | ireq->loc_addr, ireq->rmt_port, inet_sk(sk)->inet_sport); | 383 | ireq->loc_addr, ireq->rmt_port, inet_sk(sk)->inet_sport); |
383 | security_req_classify_flow(req, flowi4_to_flowi(fl4)); | 384 | security_req_classify_flow(req, flowi4_to_flowi(fl4)); |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index a43b87dfe800..c8d28c433b2b 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -824,7 +824,8 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb, | |||
824 | */ | 824 | */ |
825 | static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, | 825 | static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, |
826 | struct request_sock *req, | 826 | struct request_sock *req, |
827 | struct request_values *rvp) | 827 | struct request_values *rvp, |
828 | u16 queue_mapping) | ||
828 | { | 829 | { |
829 | const struct inet_request_sock *ireq = inet_rsk(req); | 830 | const struct inet_request_sock *ireq = inet_rsk(req); |
830 | struct flowi4 fl4; | 831 | struct flowi4 fl4; |
@@ -840,6 +841,7 @@ static int tcp_v4_send_synack(struct sock *sk, struct dst_entry *dst, | |||
840 | if (skb) { | 841 | if (skb) { |
841 | __tcp_v4_send_check(skb, ireq->loc_addr, ireq->rmt_addr); | 842 | __tcp_v4_send_check(skb, ireq->loc_addr, ireq->rmt_addr); |
842 | 843 | ||
844 | skb_set_queue_mapping(skb, queue_mapping); | ||
843 | err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr, | 845 | err = ip_build_and_send_pkt(skb, sk, ireq->loc_addr, |
844 | ireq->rmt_addr, | 846 | ireq->rmt_addr, |
845 | ireq->opt); | 847 | ireq->opt); |
@@ -854,7 +856,7 @@ static int tcp_v4_rtx_synack(struct sock *sk, struct request_sock *req, | |||
854 | struct request_values *rvp) | 856 | struct request_values *rvp) |
855 | { | 857 | { |
856 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); | 858 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); |
857 | return tcp_v4_send_synack(sk, NULL, req, rvp); | 859 | return tcp_v4_send_synack(sk, NULL, req, rvp, 0); |
858 | } | 860 | } |
859 | 861 | ||
860 | /* | 862 | /* |
@@ -1422,7 +1424,8 @@ int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb) | |||
1422 | tcp_rsk(req)->snt_synack = tcp_time_stamp; | 1424 | tcp_rsk(req)->snt_synack = tcp_time_stamp; |
1423 | 1425 | ||
1424 | if (tcp_v4_send_synack(sk, dst, req, | 1426 | if (tcp_v4_send_synack(sk, dst, req, |
1425 | (struct request_values *)&tmp_ext) || | 1427 | (struct request_values *)&tmp_ext, |
1428 | skb_get_queue_mapping(skb)) || | ||
1426 | want_cookie) | 1429 | want_cookie) |
1427 | goto drop_and_free; | 1430 | goto drop_and_free; |
1428 | 1431 | ||
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 554d5999abc4..3a9aec29581a 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -476,7 +476,8 @@ out: | |||
476 | 476 | ||
477 | 477 | ||
478 | static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | 478 | static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, |
479 | struct request_values *rvp) | 479 | struct request_values *rvp, |
480 | u16 queue_mapping) | ||
480 | { | 481 | { |
481 | struct inet6_request_sock *treq = inet6_rsk(req); | 482 | struct inet6_request_sock *treq = inet6_rsk(req); |
482 | struct ipv6_pinfo *np = inet6_sk(sk); | 483 | struct ipv6_pinfo *np = inet6_sk(sk); |
@@ -513,6 +514,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, | |||
513 | __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); | 514 | __tcp_v6_send_check(skb, &treq->loc_addr, &treq->rmt_addr); |
514 | 515 | ||
515 | fl6.daddr = treq->rmt_addr; | 516 | fl6.daddr = treq->rmt_addr; |
517 | skb_set_queue_mapping(skb, queue_mapping); | ||
516 | err = ip6_xmit(sk, skb, &fl6, opt, np->tclass); | 518 | err = ip6_xmit(sk, skb, &fl6, opt, np->tclass); |
517 | err = net_xmit_eval(err); | 519 | err = net_xmit_eval(err); |
518 | } | 520 | } |
@@ -528,7 +530,7 @@ static int tcp_v6_rtx_synack(struct sock *sk, struct request_sock *req, | |||
528 | struct request_values *rvp) | 530 | struct request_values *rvp) |
529 | { | 531 | { |
530 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); | 532 | TCP_INC_STATS_BH(sock_net(sk), TCP_MIB_RETRANSSEGS); |
531 | return tcp_v6_send_synack(sk, req, rvp); | 533 | return tcp_v6_send_synack(sk, req, rvp, 0); |
532 | } | 534 | } |
533 | 535 | ||
534 | static void tcp_v6_reqsk_destructor(struct request_sock *req) | 536 | static void tcp_v6_reqsk_destructor(struct request_sock *req) |
@@ -1213,7 +1215,8 @@ have_isn: | |||
1213 | security_inet_conn_request(sk, skb, req); | 1215 | security_inet_conn_request(sk, skb, req); |
1214 | 1216 | ||
1215 | if (tcp_v6_send_synack(sk, req, | 1217 | if (tcp_v6_send_synack(sk, req, |
1216 | (struct request_values *)&tmp_ext) || | 1218 | (struct request_values *)&tmp_ext, |
1219 | skb_get_queue_mapping(skb)) || | ||
1217 | want_cookie) | 1220 | want_cookie) |
1218 | goto drop_and_free; | 1221 | goto drop_and_free; |
1219 | 1222 | ||