1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2019 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef _LINUX_IP_H 16*4882a593Smuzhiyun #define _LINUX_IP_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* SOL_IP socket options */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define IPTOS_TOS_MASK 0x1E 21*4882a593Smuzhiyun #define IPTOS_TOS(tos) ((tos)&IPTOS_TOS_MASK) 22*4882a593Smuzhiyun #define IPTOS_LOWDELAY 0x10 23*4882a593Smuzhiyun #define IPTOS_THROUGHPUT 0x08 24*4882a593Smuzhiyun #define IPTOS_RELIABILITY 0x04 25*4882a593Smuzhiyun #define IPTOS_MINCOST 0x02 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define IPTOS_PREC_MASK 0xE0 28*4882a593Smuzhiyun #define IPTOS_PREC(tos) ((tos)&IPTOS_PREC_MASK) 29*4882a593Smuzhiyun #define IPTOS_PREC_NETCONTROL 0xe0 30*4882a593Smuzhiyun #define IPTOS_PREC_INTERNETCONTROL 0xc0 31*4882a593Smuzhiyun #define IPTOS_PREC_CRITIC_ECP 0xa0 32*4882a593Smuzhiyun #define IPTOS_PREC_FLASHOVERRIDE 0x80 33*4882a593Smuzhiyun #define IPTOS_PREC_FLASH 0x60 34*4882a593Smuzhiyun #define IPTOS_PREC_IMMEDIATE 0x40 35*4882a593Smuzhiyun #define IPTOS_PREC_PRIORITY 0x20 36*4882a593Smuzhiyun #define IPTOS_PREC_ROUTINE 0x00 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* IP options */ 40*4882a593Smuzhiyun #define IPOPT_COPY 0x80 41*4882a593Smuzhiyun #define IPOPT_CLASS_MASK 0x60 42*4882a593Smuzhiyun #define IPOPT_NUMBER_MASK 0x1f 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define IPOPT_COPIED(o) ((o)&IPOPT_COPY) 45*4882a593Smuzhiyun #define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) 46*4882a593Smuzhiyun #define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define IPOPT_CONTROL 0x00 49*4882a593Smuzhiyun #define IPOPT_RESERVED1 0x20 50*4882a593Smuzhiyun #define IPOPT_MEASUREMENT 0x40 51*4882a593Smuzhiyun #define IPOPT_RESERVED2 0x60 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define IPOPT_END (0 | IPOPT_CONTROL) 54*4882a593Smuzhiyun #define IPOPT_NOOP (1 | IPOPT_CONTROL) 55*4882a593Smuzhiyun #define IPOPT_SEC (2 | IPOPT_CONTROL | IPOPT_COPY) 56*4882a593Smuzhiyun #define IPOPT_LSRR (3 | IPOPT_CONTROL | IPOPT_COPY) 57*4882a593Smuzhiyun #define IPOPT_TIMESTAMP (4 | IPOPT_MEASUREMENT) 58*4882a593Smuzhiyun #define IPOPT_RR (7 | IPOPT_CONTROL) 59*4882a593Smuzhiyun #define IPOPT_SID (8 | IPOPT_CONTROL | IPOPT_COPY) 60*4882a593Smuzhiyun #define IPOPT_SSRR (9 | IPOPT_CONTROL | IPOPT_COPY) 61*4882a593Smuzhiyun #define IPOPT_RA (20 | IPOPT_CONTROL | IPOPT_COPY) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define IPVERSION 4 64*4882a593Smuzhiyun #define MAXTTL 255 65*4882a593Smuzhiyun #define IPDEFTTL 64 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* struct timestamp, struct route and MAX_ROUTES are removed. 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun REASONS: it is clear that nobody used them because: 70*4882a593Smuzhiyun - MAX_ROUTES value was wrong. 71*4882a593Smuzhiyun - "struct route" was wrong. 72*4882a593Smuzhiyun - "struct timestamp" had fatally misaligned bitfields and was completely unusable. 73*4882a593Smuzhiyun */ 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define IPOPT_OPTVAL 0 76*4882a593Smuzhiyun #define IPOPT_OLEN 1 77*4882a593Smuzhiyun #define IPOPT_OFFSET 2 78*4882a593Smuzhiyun #define IPOPT_MINOFF 4 79*4882a593Smuzhiyun #define MAX_IPOPTLEN 40 80*4882a593Smuzhiyun #define IPOPT_NOP IPOPT_NOOP 81*4882a593Smuzhiyun #define IPOPT_EOL IPOPT_END 82*4882a593Smuzhiyun #define IPOPT_TS IPOPT_TIMESTAMP 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun #define IPOPT_TS_TSONLY 0 /* timestamps only */ 85*4882a593Smuzhiyun #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ 86*4882a593Smuzhiyun #define IPOPT_TS_PRESPEC 3 /* specified modules only */ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #ifdef PLATFORM_LINUX 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct ip_options { 91*4882a593Smuzhiyun __u32 faddr; /* Saved first hop address */ 92*4882a593Smuzhiyun unsigned char optlen; 93*4882a593Smuzhiyun unsigned char srr; 94*4882a593Smuzhiyun unsigned char rr; 95*4882a593Smuzhiyun unsigned char ts; 96*4882a593Smuzhiyun unsigned char is_setbyuser:1, /* Set by setsockopt? */ 97*4882a593Smuzhiyun is_data:1, /* Options in __data, rather than skb */ 98*4882a593Smuzhiyun is_strictroute:1, /* Strict source route */ 99*4882a593Smuzhiyun srr_is_hit:1, /* Packet destination addr was our one */ 100*4882a593Smuzhiyun is_changed:1, /* IP checksum more not valid */ 101*4882a593Smuzhiyun rr_needaddr:1, /* Need to record addr of outgoing dev */ 102*4882a593Smuzhiyun ts_needtime:1, /* Need to record timestamp */ 103*4882a593Smuzhiyun ts_needaddr:1; /* Need to record addr of outgoing dev */ 104*4882a593Smuzhiyun unsigned char router_alert; 105*4882a593Smuzhiyun unsigned char __pad1; 106*4882a593Smuzhiyun unsigned char __pad2; 107*4882a593Smuzhiyun unsigned char __data[0]; 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun #define optlength(opt) (sizeof(struct ip_options) + opt->optlen) 111*4882a593Smuzhiyun #endif 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun struct iphdr { 114*4882a593Smuzhiyun #if defined(__LITTLE_ENDIAN_BITFIELD) 115*4882a593Smuzhiyun __u8 ihl:4, 116*4882a593Smuzhiyun version:4; 117*4882a593Smuzhiyun #elif defined (__BIG_ENDIAN_BITFIELD) 118*4882a593Smuzhiyun __u8 version:4, 119*4882a593Smuzhiyun ihl:4; 120*4882a593Smuzhiyun #else 121*4882a593Smuzhiyun #error "Please fix <asm/byteorder.h>" 122*4882a593Smuzhiyun #endif 123*4882a593Smuzhiyun __u8 tos; 124*4882a593Smuzhiyun __u16 tot_len; 125*4882a593Smuzhiyun __u16 id; 126*4882a593Smuzhiyun __u16 frag_off; 127*4882a593Smuzhiyun __u8 ttl; 128*4882a593Smuzhiyun __u8 protocol; 129*4882a593Smuzhiyun __u16 check; 130*4882a593Smuzhiyun __u32 saddr; 131*4882a593Smuzhiyun __u32 daddr; 132*4882a593Smuzhiyun /*The options start here. */ 133*4882a593Smuzhiyun }; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #endif /* _LINUX_IP_H */ 136