From e92b067b7fdcf36032d2bfbd06c4dc20164acf83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jani=20Hirsim=C3=A4ki?= Date: Wed, 4 Jan 2023 08:52:27 +0200 Subject: [PATCH] net: ip: net_context: AF_PACKET/SOCK_RAW/IPPROTO_RAW: set pkt family MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Setting a detected packet family (ipv4 or ipv6) in net_context level instead in lower layers for AF_PACKET/SOCK_RAW/IPPROTO_RAW type sockets when sending data. Signed-off-by: Jani Hirsimäki --- drivers/net/ppp.c | 16 +--------------- subsys/net/ip/net_context.c | 15 +++++++++++++++ subsys/net/l2/ethernet/ethernet.c | 15 --------------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/drivers/net/ppp.c b/drivers/net/ppp.c index 31d58acb106..67ebc0f3b0c 100644 --- a/drivers/net/ppp.c +++ b/drivers/net/ppp.c @@ -747,21 +747,7 @@ static int ppp_send(const struct device *dev, struct net_pkt *pkt) protocol = htons(PPP_IP); } else if (net_pkt_family(pkt) == AF_INET6) { protocol = htons(PPP_IPV6); - } else if (IS_ENABLED(CONFIG_NET_SOCKETS_PACKET) && - net_pkt_family(pkt) == AF_PACKET) { - char type = (NET_IPV6_HDR(pkt)->vtc & 0xf0); - - switch (type) { - case 0x60: - protocol = htons(PPP_IPV6); - break; - case 0x40: - protocol = htons(PPP_IP); - break; - default: - return -EPROTONOSUPPORT; - } - } else { + } else { return -EPROTONOSUPPORT; } } diff --git a/subsys/net/ip/net_context.c b/subsys/net/ip/net_context.c index 5216a031dc5..9fbcd270b65 100644 --- a/subsys/net/ip/net_context.c +++ b/subsys/net/ip/net_context.c @@ -1763,6 +1763,21 @@ static int context_sendto(struct net_context *context, net_pkt_cursor_init(pkt); if (net_context_get_proto(context) == IPPROTO_RAW) { + char type = (NET_IPV6_HDR(pkt)->vtc & 0xf0); + + /* Set the family to pkt if detected */ + switch (type) { + case 0x60: + net_pkt_set_family(pkt, AF_INET6); + break; + case 0x40: + net_pkt_set_family(pkt, AF_INET); + break; + default: + /* Not IP traffic, let it go forward as it is */ + break; + } + /* Pass to L2: */ ret = net_send_data(pkt); } else { diff --git a/subsys/net/l2/ethernet/ethernet.c b/subsys/net/l2/ethernet/ethernet.c index 10bb808276a..f5cd3bf0fd1 100644 --- a/subsys/net/l2/ethernet/ethernet.c +++ b/subsys/net/l2/ethernet/ethernet.c @@ -667,21 +667,6 @@ static int ethernet_send(struct net_if *iface, struct net_pkt *pkt) net_pkt_lladdr_src(pkt)->len = sizeof(struct net_eth_addr); ptype = dst_addr->sll_protocol; - } else if (context && net_context_get_type(context) == SOCK_RAW && - net_context_get_proto(context) == IPPROTO_RAW) { - char type = (NET_IPV6_HDR(pkt)->vtc & 0xf0); - - switch (type) { - case 0x60: - ptype = htons(NET_ETH_PTYPE_IPV6); - break; - case 0x40: - ptype = htons(NET_ETH_PTYPE_IP); - break; - default: - ret = -ENOTSUP; - goto error; - } } else { goto send; }