diff options
author | Edward Jee <edjee@google.com> | 2015-10-08 17:56:49 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-10-12 22:25:22 -0400 |
commit | c7d39e32632e5db9dc4da51198b76d8c315946ff (patch) | |
tree | 924e6fc7379bf29d87f07fe4c1b203c9ceab0043 /net/packet | |
parent | f28ea365cdefc3b4fd0373e70b0106a0cd9b4c23 (diff) |
packet: support per-packet fwmark for af_packet sendmsg
Signed-off-by: Edward Hyunkoo Jee <edjee@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/packet')
-rw-r--r-- | net/packet/af_packet.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 104910f7d1fb..20c44e2e1e4e 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -2630,6 +2630,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2630 | __be16 proto; | 2630 | __be16 proto; |
2631 | unsigned char *addr; | 2631 | unsigned char *addr; |
2632 | int err, reserve = 0; | 2632 | int err, reserve = 0; |
2633 | struct sockcm_cookie sockc; | ||
2633 | struct virtio_net_hdr vnet_hdr = { 0 }; | 2634 | struct virtio_net_hdr vnet_hdr = { 0 }; |
2634 | int offset = 0; | 2635 | int offset = 0; |
2635 | int vnet_hdr_len; | 2636 | int vnet_hdr_len; |
@@ -2665,6 +2666,13 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2665 | if (unlikely(!(dev->flags & IFF_UP))) | 2666 | if (unlikely(!(dev->flags & IFF_UP))) |
2666 | goto out_unlock; | 2667 | goto out_unlock; |
2667 | 2668 | ||
2669 | sockc.mark = sk->sk_mark; | ||
2670 | if (msg->msg_controllen) { | ||
2671 | err = sock_cmsg_send(sk, msg, &sockc); | ||
2672 | if (unlikely(err)) | ||
2673 | goto out_unlock; | ||
2674 | } | ||
2675 | |||
2668 | if (sock->type == SOCK_RAW) | 2676 | if (sock->type == SOCK_RAW) |
2669 | reserve = dev->hard_header_len; | 2677 | reserve = dev->hard_header_len; |
2670 | if (po->has_vnet_hdr) { | 2678 | if (po->has_vnet_hdr) { |
@@ -2774,7 +2782,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | |||
2774 | skb->protocol = proto; | 2782 | skb->protocol = proto; |
2775 | skb->dev = dev; | 2783 | skb->dev = dev; |
2776 | skb->priority = sk->sk_priority; | 2784 | skb->priority = sk->sk_priority; |
2777 | skb->mark = sk->sk_mark; | 2785 | skb->mark = sockc.mark; |
2778 | 2786 | ||
2779 | packet_pick_tx_queue(dev, skb); | 2787 | packet_pick_tx_queue(dev, skb); |
2780 | 2788 | ||