Netdev List
 help / color / mirror / Atom feed
From: Maxim Mikityanskiy <maximmi@mellanox.com>
To: "David S. Miller" <davem@davemloft.net>,
	Saeed Mahameed <saeedm@mellanox.com>,
	Willem de Bruijn <willemb@google.com>,
	Jason Wang <jasowang@redhat.com>,
	Eric Dumazet <edumazet@google.com>
Cc: "netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	Eran Ben Elisha <eranbe@mellanox.com>,
	Tariq Toukan <tariqt@mellanox.com>,
	Maxim Mikityanskiy <maximmi@mellanox.com>
Subject: [PATCH 4/7] net/packet: Ask driver for protocol if not provided by user
Date: Mon, 14 Jan 2019 13:19:02 +0000	[thread overview]
Message-ID: <20190114131841.1932-5-maximmi@mellanox.com> (raw)
In-Reply-To: <20190114131841.1932-1-maximmi@mellanox.com>

If a socket was created with socket(AF_PACKET, SOCK_RAW, 0), the
protocol number is unavailable. Try to ask the driver to extract it from
the L2 header in order for skb_try_probe_transport_header to succeed.

Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
---
 net/packet/af_packet.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 8fc76e68777a..d1d89749a17a 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -1850,6 +1850,15 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
 	return 0;
 }
 
+static void packet_parse_headers(struct sk_buff *skb, struct socket *sock)
+{
+	if (!skb->protocol && sock->type == SOCK_RAW) {
+		skb_reset_mac_header(skb);
+		skb->protocol = dev_parse_header_protocol(skb);
+	}
+
+	skb_try_probe_transport_header(skb);
+}
 
 /*
  *	Output a raw packet to a device layer. This bypasses all the other
@@ -1970,7 +1979,7 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg,
 	if (unlikely(extra_len == 4))
 		skb->no_fcs = 1;
 
-	skb_try_probe_transport_header(skb);
+	packet_parse_headers(skb, sock);
 
 	dev_queue_xmit(skb);
 	rcu_read_unlock();
@@ -2519,7 +2528,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
 		len = ((to_write > len_max) ? len_max : to_write);
 	}
 
-	skb_try_probe_transport_header(skb);
+	packet_parse_headers(skb, sock);
 
 	return tp_len;
 }
@@ -2924,7 +2933,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
 		virtio_net_hdr_set_proto(skb, &vnet_hdr);
 	}
 
-	skb_try_probe_transport_header(skb);
+	packet_parse_headers(skb, sock);
 
 	if (unlikely(extra_len == 4))
 		skb->no_fcs = 1;
-- 
2.19.1

  parent reply	other threads:[~2019-01-14 13:19 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-01-14 13:18 [PATCH 0/7] AF_PACKET transport_offset fix Maxim Mikityanskiy
2019-01-14 13:18 ` [PATCH 1/7] net: Don't set transport offset to invalid value Maxim Mikityanskiy
2019-01-14 16:49   ` Willem de Bruijn
2019-01-17  9:10     ` Maxim Mikityanskiy
2019-01-17 15:16       ` Willem de Bruijn
2019-01-23 10:16         ` Maxim Mikityanskiy
2019-01-23 14:11           ` Willem de Bruijn
2019-01-24  9:47             ` Maxim Mikityanskiy
2019-01-24 14:19               ` Willem de Bruijn
2019-01-14 13:18 ` [PATCH 2/7] net: Introduce parse_protocol header_ops callback Maxim Mikityanskiy
2019-01-14 13:19 ` [PATCH 3/7] net/ethernet: Add parse_protocol header_ops support Maxim Mikityanskiy
2019-01-23 14:14   ` Willem de Bruijn
2019-01-24  9:47     ` Maxim Mikityanskiy
2019-01-24 14:21       ` Willem de Bruijn
2019-01-25  8:51         ` Maxim Mikityanskiy
2019-01-25 13:52           ` Willem de Bruijn
2019-01-14 13:19 ` Maxim Mikityanskiy [this message]
2019-01-14 16:52   ` [PATCH 4/7] net/packet: Ask driver for protocol if not provided by user Willem de Bruijn
2019-01-15 16:32     ` Willem de Bruijn
2019-01-17  9:10       ` Maxim Mikityanskiy
2019-01-17 15:41         ` Willem de Bruijn
2019-01-14 13:19 ` [PATCH 5/7] net/packet: Remove redundant skb->protocol set Maxim Mikityanskiy
2019-01-14 13:19 ` [PATCH 6/7] net/mlx5e: Remove the wrong assumption about transport offset Maxim Mikityanskiy
2019-01-14 13:19 ` [PATCH 7/7] net/mlx5e: Trust kernel regarding " Maxim Mikityanskiy
2019-01-14 13:52 ` [PATCH 0/7] AF_PACKET transport_offset fix Maxim Mikityanskiy
2019-01-23 10:16 ` Maxim Mikityanskiy
2019-01-23 14:12   ` Willem de Bruijn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190114131841.1932-5-maximmi@mellanox.com \
    --to=maximmi@mellanox.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=eranbe@mellanox.com \
    --cc=jasowang@redhat.com \
    --cc=netdev@vger.kernel.org \
    --cc=saeedm@mellanox.com \
    --cc=tariqt@mellanox.com \
    --cc=willemb@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox