aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-03-01 17:22:19 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-01 17:22:19 -0500
commit5df65e5567a497a28067019b8ff08f98fb026629 (patch)
tree776a8a2cfa2cf5962ea0d53dea8c6c8360a0c58d
parent420d44daa7aa1cc847e9e527f0a27a9ce61768ca (diff)
net: Add FLOWI_FLAG_CAN_SLEEP.
And set is in contexts where the route resolution can sleep. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--include/net/flow.h1
-rw-r--r--include/net/route.h2
-rw-r--r--net/ipv4/raw.c3
-rw-r--r--net/ipv4/udp.c6
-rw-r--r--net/ipv6/ip6_output.c2
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);