Commit 8e08bb75 authored by Xin Long's avatar Xin Long Committed by Jakub Kicinski
Browse files

packet: add TP_STATUS_GSO_TCP for tp_status



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: default avatarXin Long <lucien.xin@gmail.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 50e6fb5c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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;