diff options
-rw-r--r-- | include/net/flow.h | 1 | ||||
-rw-r--r-- | include/net/route.h | 2 | ||||
-rw-r--r-- | net/ipv4/raw.c | 3 | ||||
-rw-r--r-- | net/ipv4/udp.c | 6 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 2 |
5 files changed, 11 insertions, 3 deletions
diff --git a/include/net/flow.h b/include/net/flow.h index f2080e65276d..fd0413873b8e 100644 --- a/include/net/flow.h +++ b/include/net/flow.h | |||
@@ -50,6 +50,7 @@ struct flowi { | |||
50 | __u8 flags; | 50 | __u8 flags; |
51 | #define FLOWI_FLAG_ANYSRC 0x01 | 51 | #define FLOWI_FLAG_ANYSRC 0x01 |
52 | #define FLOWI_FLAG_PRECOW_METRICS 0x02 | 52 | #define FLOWI_FLAG_PRECOW_METRICS 0x02 |
53 | #define FLOWI_FLAG_CAN_SLEEP 0x04 | ||
53 | union { | 54 | union { |
54 | struct { | 55 | struct { |
55 | __be16 sport; | 56 | __be16 sport; |
diff --git a/include/net/route.h b/include/net/route.h index 6de4333d6002..1be5c05a0905 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
@@ -185,6 +185,8 @@ static inline int ip_route_connect(struct rtable **rp, __be32 dst, | |||
185 | fl.flags |= FLOWI_FLAG_ANYSRC; | 185 | fl.flags |= FLOWI_FLAG_ANYSRC; |
186 | if (protocol == IPPROTO_TCP) | 186 | if (protocol == IPPROTO_TCP) |
187 | fl.flags |= FLOWI_FLAG_PRECOW_METRICS; | 187 | fl.flags |= FLOWI_FLAG_PRECOW_METRICS; |
188 | if (can_sleep) | ||
189 | fl.flags |= FLOWI_FLAG_CAN_SLEEP; | ||
188 | 190 | ||
189 | if (!dst || !src) { | 191 | if (!dst || !src) { |
190 | err = __ip_route_output_key(net, rp, &fl); | 192 | err = __ip_route_output_key(net, rp, &fl); |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index e1857658964d..e8e8613bcbcc 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -555,7 +555,8 @@ static int raw_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
555 | .fl4_tos = tos, | 555 | .fl4_tos = tos, |
556 | .proto = inet->hdrincl ? IPPROTO_RAW : | 556 | .proto = inet->hdrincl ? IPPROTO_RAW : |
557 | sk->sk_protocol, | 557 | sk->sk_protocol, |
558 | }; | 558 | .flags = FLOWI_FLAG_CAN_SLEEP, |
559 | }; | ||
559 | if (!inet->hdrincl) { | 560 | if (!inet->hdrincl) { |
560 | err = raw_probe_proto_opt(&fl, msg); | 561 | err = raw_probe_proto_opt(&fl, msg); |
561 | if (err) | 562 | if (err) |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 790187b5c308..c6bcc93debd5 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -914,9 +914,11 @@ int udp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
914 | .fl4_src = saddr, | 914 | .fl4_src = saddr, |
915 | .fl4_tos = tos, | 915 | .fl4_tos = tos, |
916 | .proto = sk->sk_protocol, | 916 | .proto = sk->sk_protocol, |
917 | .flags = inet_sk_flowi_flags(sk), | 917 | .flags = (inet_sk_flowi_flags(sk) | |
918 | FLOWI_FLAG_CAN_SLEEP), | ||
918 | .fl_ip_sport = inet->inet_sport, | 919 | .fl_ip_sport = inet->inet_sport, |
919 | .fl_ip_dport = dport }; | 920 | .fl_ip_dport = dport |
921 | }; | ||
920 | struct net *net = sock_net(sk); | 922 | struct net *net = sock_net(sk); |
921 | 923 | ||
922 | security_sk_classify_flow(sk, &fl); | 924 | security_sk_classify_flow(sk, &fl); |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 28209b2d254d..77b1942f335b 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -1026,6 +1026,7 @@ struct dst_entry *ip6_dst_lookup_flow(struct sock *sk, struct flowi *fl, | |||
1026 | if (final_dst) | 1026 | if (final_dst) |
1027 | ipv6_addr_copy(&fl->fl6_dst, final_dst); | 1027 | ipv6_addr_copy(&fl->fl6_dst, final_dst); |
1028 | if (want_blackhole) { | 1028 | if (want_blackhole) { |
1029 | fl->flags |= FLOWI_FLAG_CAN_SLEEP; | ||
1029 | err = __xfrm_lookup(sock_net(sk), &dst, fl, sk, XFRM_LOOKUP_WAIT); | 1030 | err = __xfrm_lookup(sock_net(sk), &dst, fl, sk, XFRM_LOOKUP_WAIT); |
1030 | if (err == -EREMOTE) | 1031 | if (err == -EREMOTE) |
1031 | err = ip6_dst_blackhole(sk, &dst, fl); | 1032 | err = ip6_dst_blackhole(sk, &dst, fl); |
@@ -1070,6 +1071,7 @@ struct dst_entry *ip6_sk_dst_lookup_flow(struct sock *sk, struct flowi *fl, | |||
1070 | if (final_dst) | 1071 | if (final_dst) |
1071 | ipv6_addr_copy(&fl->fl6_dst, final_dst); | 1072 | ipv6_addr_copy(&fl->fl6_dst, final_dst); |
1072 | if (want_blackhole) { | 1073 | if (want_blackhole) { |
1074 | fl->flags |= FLOWI_FLAG_CAN_SLEEP; | ||
1073 | err = __xfrm_lookup(sock_net(sk), &dst, fl, sk, XFRM_LOOKUP_WAIT); | 1075 | err = __xfrm_lookup(sock_net(sk), &dst, fl, sk, XFRM_LOOKUP_WAIT); |
1074 | if (err == -EREMOTE) | 1076 | if (err == -EREMOTE) |
1075 | err = ip6_dst_blackhole(sk, &dst, fl); | 1077 | err = ip6_dst_blackhole(sk, &dst, fl); |