1*76404edcSAsim Jamshed #ifndef __IP_IN_H_
2*76404edcSAsim Jamshed #define __IP_IN_H_
3*76404edcSAsim Jamshed 
4*76404edcSAsim Jamshed #include "mtcp.h"
5*76404edcSAsim Jamshed #include "mos_api.h"
6*76404edcSAsim Jamshed 
7*76404edcSAsim Jamshed int
8*76404edcSAsim Jamshed ProcessInIPv4Packet(mtcp_manager_t mtcp, struct pkt_ctx *pctx);
9*76404edcSAsim Jamshed 
ip_fast_csum(const void * iph,unsigned int ihl)10*76404edcSAsim Jamshed static inline __sum16 ip_fast_csum(const void *iph, unsigned int ihl)
11*76404edcSAsim Jamshed {
12*76404edcSAsim Jamshed 	unsigned int sum;
13*76404edcSAsim Jamshed 
14*76404edcSAsim Jamshed 	asm("  movl (%1), %0\n"
15*76404edcSAsim Jamshed 	    "  subl $4, %2\n"
16*76404edcSAsim Jamshed 	    "  jbe 2f\n"
17*76404edcSAsim Jamshed 	    "  addl 4(%1), %0\n"
18*76404edcSAsim Jamshed 	    "  adcl 8(%1), %0\n"
19*76404edcSAsim Jamshed 	    "  adcl 12(%1), %0\n"
20*76404edcSAsim Jamshed 	    "1: adcl 16(%1), %0\n"
21*76404edcSAsim Jamshed 	    "  lea 4(%1), %1\n"
22*76404edcSAsim Jamshed 	    "  decl %2\n"
23*76404edcSAsim Jamshed 	    "  jne      1b\n"
24*76404edcSAsim Jamshed 	    "  adcl $0, %0\n"
25*76404edcSAsim Jamshed 	    "  movl %0, %2\n"
26*76404edcSAsim Jamshed 	    "  shrl $16, %0\n"
27*76404edcSAsim Jamshed 	    "  addw %w2, %w0\n"
28*76404edcSAsim Jamshed 	    "  adcl $0, %0\n"
29*76404edcSAsim Jamshed 	    "  notl %0\n"
30*76404edcSAsim Jamshed 	    "2:"
31*76404edcSAsim Jamshed 	    /* Since the input registers which are loaded with iph and ih
32*76404edcSAsim Jamshed 	       are modified, we must also specify them as outputs, or gcc
33*76404edcSAsim Jamshed 	       will assume they contain their original values. */
34*76404edcSAsim Jamshed 	    : "=r" (sum), "=r" (iph), "=r" (ihl)
35*76404edcSAsim Jamshed 	    : "1" (iph), "2" (ihl)
36*76404edcSAsim Jamshed 	       : "memory");
37*76404edcSAsim Jamshed 	return (__sum16)sum;
38*76404edcSAsim Jamshed }
39*76404edcSAsim Jamshed 
40*76404edcSAsim Jamshed #endif /* __IP_IN_H_ */
41