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