diff options
| author | Willem de Bruijn <willemb@google.com> | 2019-09-11 15:50:51 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2019-09-13 15:44:19 -0400 |
| commit | c6af0c227a22bb6bb8ff72f043e0fb6d99fd6515 (patch) | |
| tree | 12f4f3b38877b029a5342e2a8f63d8131dad9b27 /net/ipv4 | |
| parent | 823eb2a3c4c7f1b3e749f0dddb70bf8b09a76a10 (diff) | |
ip: support SO_MARK cmsg
Enable setting skb->mark for UDP and RAW sockets using cmsg.
This is analogous to existing support for TOS, TTL, txtime, etc.
Packet sockets already support this as of commit c7d39e32632e
("packet: support per-packet fwmark for af_packet sendmsg").
Similar to other fields, implement by
1. initialize the sockcm_cookie.mark from socket option sk_mark
2. optionally overwrite this in ip_cmsg_send/ip6_datagram_send_ctl
3. initialize inet_cork.mark from sockcm_cookie.mark
4. initialize each (usually just one) skb->mark from inet_cork.mark
Step 1 is handled in one location for most protocols by ipcm_init_sk
as of commit 351782067b6b ("ipv4: ipcm_cookie initializers").
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/ip_output.c | 3 | ||||
| -rw-r--r-- | net/ipv4/ping.c | 2 | ||||
| -rw-r--r-- | net/ipv4/raw.c | 4 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 2 |
4 files changed, 6 insertions, 5 deletions
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index cc7ef0d05bbd..5eb73775c3f7 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -1266,6 +1266,7 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, | |||
| 1266 | cork->length = 0; | 1266 | cork->length = 0; |
| 1267 | cork->ttl = ipc->ttl; | 1267 | cork->ttl = ipc->ttl; |
| 1268 | cork->tos = ipc->tos; | 1268 | cork->tos = ipc->tos; |
| 1269 | cork->mark = ipc->sockc.mark; | ||
| 1269 | cork->priority = ipc->priority; | 1270 | cork->priority = ipc->priority; |
| 1270 | cork->transmit_time = ipc->sockc.transmit_time; | 1271 | cork->transmit_time = ipc->sockc.transmit_time; |
| 1271 | cork->tx_flags = 0; | 1272 | cork->tx_flags = 0; |
| @@ -1529,7 +1530,7 @@ struct sk_buff *__ip_make_skb(struct sock *sk, | |||
| 1529 | } | 1530 | } |
| 1530 | 1531 | ||
| 1531 | skb->priority = (cork->tos != -1) ? cork->priority: sk->sk_priority; | 1532 | skb->priority = (cork->tos != -1) ? cork->priority: sk->sk_priority; |
| 1532 | skb->mark = sk->sk_mark; | 1533 | skb->mark = cork->mark; |
| 1533 | skb->tstamp = cork->transmit_time; | 1534 | skb->tstamp = cork->transmit_time; |
| 1534 | /* | 1535 | /* |
| 1535 | * Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec | 1536 | * Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec |
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 9d24ef5c5d8f..535427292194 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c | |||
| @@ -781,7 +781,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 781 | } else if (!ipc.oif) | 781 | } else if (!ipc.oif) |
| 782 | ipc.oif = inet->uc_index; | 782 | ipc.oif = inet->uc_index; |
| 783 | 783 | ||
| 784 | flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, | 784 | flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, |
| 785 | RT_SCOPE_UNIVERSE, sk->sk_protocol, | 785 | RT_SCOPE_UNIVERSE, sk->sk_protocol, |
| 786 | inet_sk_flowi_flags(sk), faddr, saddr, 0, 0, | 786 | inet_sk_flowi_flags(sk), faddr, saddr, 0, 0, |
| 787 | sk->sk_uid); | 787 | sk->sk_uid); |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 40a6abbc9cf6..80da5a66d5d7 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
| @@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4, | |||
| 375 | skb_reserve(skb, hlen); | 375 | skb_reserve(skb, hlen); |
| 376 | 376 | ||
| 377 | skb->priority = sk->sk_priority; | 377 | skb->priority = sk->sk_priority; |
| 378 | skb->mark = sk->sk_mark; | 378 | skb->mark = sockc->mark; |
| 379 | skb->tstamp = sockc->transmit_time; | 379 | skb->tstamp = sockc->transmit_time; |
| 380 | skb_dst_set(skb, &rt->dst); | 380 | skb_dst_set(skb, &rt->dst); |
| 381 | *rtp = NULL; | 381 | *rtp = NULL; |
| @@ -623,7 +623,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 623 | } | 623 | } |
| 624 | } | 624 | } |
| 625 | 625 | ||
| 626 | flowi4_init_output(&fl4, ipc.oif, sk->sk_mark, tos, | 626 | flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, |
| 627 | RT_SCOPE_UNIVERSE, | 627 | RT_SCOPE_UNIVERSE, |
| 628 | hdrincl ? IPPROTO_RAW : sk->sk_protocol, | 628 | hdrincl ? IPPROTO_RAW : sk->sk_protocol, |
| 629 | inet_sk_flowi_flags(sk) | | 629 | inet_sk_flowi_flags(sk) | |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index d88821c794fb..fbcd9be3a470 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1130,7 +1130,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) | |||
| 1130 | 1130 | ||
| 1131 | fl4 = &fl4_stack; | 1131 | fl4 = &fl4_stack; |
| 1132 | 1132 | ||
| 1133 | flowi4_init_output(fl4, ipc.oif, sk->sk_mark, tos, | 1133 | flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark, tos, |
| 1134 | RT_SCOPE_UNIVERSE, sk->sk_protocol, | 1134 | RT_SCOPE_UNIVERSE, sk->sk_protocol, |
| 1135 | flow_flags, | 1135 | flow_flags, |
| 1136 | faddr, saddr, dport, inet->inet_sport, | 1136 | faddr, saddr, dport, inet->inet_sport, |
