1 #ifndef _IP_H_ 2 #define _IP_H_ 1 3 #if defined(__cplusplus) 4 extern "C" { 5 #endif 6 7 AUTOLIB(ip) 8 /* 9 #pragma src "/sys/src/libip" 10 #pragma lib "libip.a" 11 #pragma varargck type "I" uchar* 12 #pragma varargck type "V" uchar* 13 #pragma varargck type "E" uchar* 14 #pragma varargck type "M" uchar* 15 */ 16 enum 17 { 18 IPaddrlen= 16, 19 IPv4addrlen= 4, 20 IPv4off= 12, 21 IPllen= 4 22 }; 23 24 /* 25 * for reading /net/ipifc 26 */ 27 typedef struct Ipifc Ipifc; 28 typedef struct Iplifc Iplifc; 29 typedef struct Ipv6rp Ipv6rp; 30 31 /* local address */ 32 struct Iplifc 33 { 34 Iplifc *next; 35 36 /* per address on the ip interface */ 37 uchar ip[IPaddrlen]; 38 uchar mask[IPaddrlen]; 39 uchar net[IPaddrlen]; /* ip & mask */ 40 ulong preflt; /* preferred lifetime */ 41 ulong validlt; /* valid lifetime */ 42 }; 43 44 /* default values, one per stack */ 45 struct Ipv6rp 46 { 47 int mflag; 48 int oflag; 49 int maxraint; 50 int minraint; 51 int linkmtu; 52 int reachtime; 53 int rxmitra; 54 int ttl; 55 int routerlt; 56 }; 57 58 /* actual interface */ 59 struct Ipifc 60 { 61 Ipifc *next; 62 Iplifc *lifc; 63 64 /* per ip interface */ 65 int index; /* number of interface in ipifc dir */ 66 char dev[64]; 67 uchar ether[6]; 68 uchar sendra6; /* on == send router adv */ 69 uchar recvra6; /* on == rcv router adv */ 70 int mtu; 71 ulong pktin; 72 ulong pktout; 73 ulong errin; 74 ulong errout; 75 Ipv6rp rp; 76 }; 77 78 /* 79 * user level udp headers 80 */ 81 enum 82 { 83 Udphdrsize= 52 /* size of a Udphdr */ 84 }; 85 86 typedef struct Udphdr Udphdr; 87 struct Udphdr 88 { 89 uchar raddr[IPaddrlen]; /* remote address and port */ 90 uchar laddr[IPaddrlen]; /* local address and port */ 91 uchar ifcaddr[IPaddrlen]; /* address of ifc message was received from */ 92 uchar rport[2]; 93 uchar lport[2]; 94 }; 95 96 uchar* defmask(uchar*); 97 void maskip(uchar*, uchar*, uchar*); 98 int eipfmt(Fmt*); 99 int isv4(uchar*); 100 ulong parseip(uchar*, char*); 101 ulong parseipmask(uchar*, char*); 102 char* v4parseip(uchar*, char*); 103 char* v4parsecidr(uchar*, uchar*, char*); 104 int parseether(uchar*, char*); 105 int myipaddr(uchar*, char*); 106 int myetheraddr(uchar*, char*); 107 int equivip(uchar*, uchar*); 108 long udpread(int, Udphdr*, void*, long); 109 long udpwrite(int, Udphdr*, void*, long); 110 111 Ipifc* readipifc(char*, Ipifc*, int); 112 void freeipifc(Ipifc*); 113 114 void hnputv(void*, uvlong); 115 void hnputl(void*, uint); 116 void hnputs(void*, ushort); 117 uint nhgetl(void*); 118 uvlong nhgetv(void*); 119 ushort nhgets(void*); 120 ushort ptclbsum(uchar*, int); 121 122 int v6tov4(uchar*, uchar*); 123 void v4tov6(uchar*, uchar*); 124 125 #define ipcmp(x, y) memcmp(x, y, IPaddrlen) 126 #define ipmove(x, y) memmove(x, y, IPaddrlen) 127 128 extern uchar IPv4bcast[IPaddrlen]; 129 extern uchar IPv4bcastobs[IPaddrlen]; 130 extern uchar IPv4allsys[IPaddrlen]; 131 extern uchar IPv4allrouter[IPaddrlen]; 132 extern uchar IPnoaddr[IPaddrlen]; 133 extern uchar v4prefix[IPaddrlen]; 134 extern uchar IPallbits[IPaddrlen]; 135 136 #define CLASS(p) ((*(uchar*)(p))>>6) 137 138 #if defined(__cplusplus) 139 } 140 #endif 141 #endif 142