summaryrefslogtreecommitdiffstats
path: root/net/packet
diff options
context:
space:
mode:
authorEdward Jee <edjee@google.com>2015-10-08 17:56:49 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-12 22:25:22 -0400
commitc7d39e32632e5db9dc4da51198b76d8c315946ff (patch)
tree924e6fc7379bf29d87f07fe4c1b203c9ceab0043 /net/packet
parentf28ea365cdefc3b4fd0373e70b0106a0cd9b4c23 (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.c10
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