mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	af_packet: pass checksum validation status to the user
Introduce TP_STATUS_CSUM_VALID tp_status flag to tell the af_packet user that at least the transport header checksum has been already validated. For now, the flag may be set for incoming packets only. Signed-off-by: Alexander Drozdov <al.drozdov@gmail.com> Cc: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									68c2e5de36
								
							
						
					
					
						commit
						682f048bd4
					
				
					 3 changed files with 20 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -440,9 +440,10 @@ and the following flags apply:
 | 
			
		|||
+++ Capture process:
 | 
			
		||||
     from include/linux/if_packet.h
 | 
			
		||||
 | 
			
		||||
     #define TP_STATUS_COPY          2 
 | 
			
		||||
     #define TP_STATUS_LOSING        4 
 | 
			
		||||
     #define TP_STATUS_CSUMNOTREADY  8 
 | 
			
		||||
     #define TP_STATUS_COPY          (1 << 1)
 | 
			
		||||
     #define TP_STATUS_LOSING        (1 << 2)
 | 
			
		||||
     #define TP_STATUS_CSUMNOTREADY  (1 << 3)
 | 
			
		||||
     #define TP_STATUS_CSUM_VALID    (1 << 7)
 | 
			
		||||
 | 
			
		||||
TP_STATUS_COPY        : This flag indicates that the frame (and associated
 | 
			
		||||
                        meta information) has been truncated because it's 
 | 
			
		||||
| 
						 | 
				
			
			@ -466,6 +467,12 @@ TP_STATUS_CSUMNOTREADY: currently it's used for outgoing IP packets which
 | 
			
		|||
                        reading the packet we should not try to check the 
 | 
			
		||||
                        checksum. 
 | 
			
		||||
 | 
			
		||||
TP_STATUS_CSUM_VALID  : This flag indicates that at least the transport
 | 
			
		||||
                        header checksum of the packet has been already
 | 
			
		||||
                        validated on the kernel side. If the flag is not set
 | 
			
		||||
                        then we are free to check the checksum by ourselves
 | 
			
		||||
                        provided that TP_STATUS_CSUMNOTREADY is also not set.
 | 
			
		||||
 | 
			
		||||
for convenience there are also the following defines:
 | 
			
		||||
 | 
			
		||||
     #define TP_STATUS_KERNEL        0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,6 +99,7 @@ struct tpacket_auxdata {
 | 
			
		|||
#define TP_STATUS_VLAN_VALID		(1 << 4) /* auxdata has valid tp_vlan_tci */
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
/* Tx ring - header status */
 | 
			
		||||
#define TP_STATUS_AVAILABLE	      0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1924,6 +1924,10 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
 | 
			
		|||
 | 
			
		||||
	if (skb->ip_summed == CHECKSUM_PARTIAL)
 | 
			
		||||
		status |= TP_STATUS_CSUMNOTREADY;
 | 
			
		||||
	else if (skb->pkt_type != PACKET_OUTGOING &&
 | 
			
		||||
		 (skb->ip_summed == CHECKSUM_COMPLETE ||
 | 
			
		||||
		  skb_csum_unnecessary(skb)))
 | 
			
		||||
		status |= TP_STATUS_CSUM_VALID;
 | 
			
		||||
 | 
			
		||||
	if (snaplen > res)
 | 
			
		||||
		snaplen = res;
 | 
			
		||||
| 
						 | 
				
			
			@ -3031,6 +3035,11 @@ static int packet_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 | 
			
		|||
		aux.tp_status = TP_STATUS_USER;
 | 
			
		||||
		if (skb->ip_summed == CHECKSUM_PARTIAL)
 | 
			
		||||
			aux.tp_status |= TP_STATUS_CSUMNOTREADY;
 | 
			
		||||
		else if (skb->pkt_type != PACKET_OUTGOING &&
 | 
			
		||||
			 (skb->ip_summed == CHECKSUM_COMPLETE ||
 | 
			
		||||
			  skb_csum_unnecessary(skb)))
 | 
			
		||||
			aux.tp_status |= TP_STATUS_CSUM_VALID;
 | 
			
		||||
 | 
			
		||||
		aux.tp_len = origlen;
 | 
			
		||||
		aux.tp_snaplen = skb->len;
 | 
			
		||||
		aux.tp_mac = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue