packet: add TP_STATUS_GSO_TCP for tp_status
authorXin Long <lucien.xin@gmail.com>
Sat, 28 Jan 2023 15:58:37 +0000 (10:58 -0500)
committerJakub Kicinski <kuba@kernel.org>
Thu, 2 Feb 2023 04:54:27 +0000 (20:54 -0800)
Introduce TP_STATUS_GSO_TCP tp_status flag to tell the af_packet user
that this is a TCP GSO packet. When parsing IPv4 BIG TCP packets in
tcpdump/libpcap, it can use tp_len as the IPv4 packet len when this
flag is set, as iph tot_len is set to 0 for IPv4 BIG TCP packets.

Signed-off-by: Xin Long <lucien.xin@gmail.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/uapi/linux/if_packet.h
net/packet/af_packet.c

index a8516b3..78c981d 100644 (file)
@@ -115,6 +115,7 @@ struct tpacket_auxdata {
 #define TP_STATUS_BLK_TMO              (1 << 5)
 #define TP_STATUS_VLAN_TPID_VALID      (1 << 6) /* auxdata has valid tp_vlan_tpid */
 #define TP_STATUS_CSUM_VALID           (1 << 7)
+#define TP_STATUS_GSO_TCP              (1 << 8)
 
 /* Tx ring - header status */
 #define TP_STATUS_AVAILABLE          0
index b5ab98c..8ffb19c 100644 (file)
@@ -2296,6 +2296,8 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
        else if (skb->pkt_type != PACKET_OUTGOING &&
                 skb_csum_unnecessary(skb))
                status |= TP_STATUS_CSUM_VALID;
+       if (skb_is_gso(skb) && skb_is_gso_tcp(skb))
+               status |= TP_STATUS_GSO_TCP;
 
        if (snaplen > res)
                snaplen = res;
@@ -3522,6 +3524,8 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
                else if (skb->pkt_type != PACKET_OUTGOING &&
                         skb_csum_unnecessary(skb))
                        aux.tp_status |= TP_STATUS_CSUM_VALID;
+               if (skb_is_gso(skb) && skb_is_gso_tcp(skb))
+                       aux.tp_status |= TP_STATUS_GSO_TCP;
 
                aux.tp_len = origlen;
                aux.tp_snaplen = skb->len;