diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 16:47:56 +0300 |
commit | c558a99e0be506a9abdf677f0ca4490644e05fc1 (patch) | |
tree | 17aef678ad05a32ef96ce8385703cb3fe089a5c7 /sys/include/ip.h | |
parent | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (diff) |
Import sources from 2011-03-30 iso image - sys/include
Diffstat (limited to 'sys/include/ip.h')
-rwxr-xr-x | sys/include/ip.h | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/sys/include/ip.h b/sys/include/ip.h new file mode 100755 index 000000000..a719a1b41 --- /dev/null +++ b/sys/include/ip.h @@ -0,0 +1,202 @@ +#pragma src "/sys/src/libip" +#pragma lib "libip.a" + +enum +{ + IPaddrlen= 16, + IPv4addrlen= 4, + IPv4off= 12, + IPllen= 4, + IPV4HDR_LEN= 20, + + /* vihl & vcf[0] values */ + IP_VER4= 0x40, + IP_VER6= 0x60, +}; + +/* + * for reading /net/ipifc + */ +typedef struct Ipifc Ipifc; +typedef struct Iplifc Iplifc; +typedef struct Ipv6rp Ipv6rp; + +/* local address */ +struct Iplifc +{ + Iplifc *next; + + /* per address on the ip interface */ + uchar ip[IPaddrlen]; + uchar mask[IPaddrlen]; + uchar net[IPaddrlen]; /* ip & mask */ + ulong preflt; /* preferred lifetime */ + ulong validlt; /* valid lifetime */ +}; + +/* default values, one per stack */ +struct Ipv6rp +{ + int mflag; + int oflag; + int maxraint; + int minraint; + int linkmtu; + int reachtime; + int rxmitra; + int ttl; + int routerlt; +}; + +/* actual interface */ +struct Ipifc +{ + Ipifc *next; + Iplifc *lifc; + + /* per ip interface */ + int index; /* number of interface in ipifc dir */ + char dev[64]; + uchar sendra6; /* on == send router adv */ + uchar recvra6; /* on == rcv router adv */ + int mtu; + ulong pktin; + ulong pktout; + ulong errin; + ulong errout; + Ipv6rp rp; +}; + +#define ISIPV6MCAST(addr) ((addr)[0] == 0xff) +#define ISIPV6LINKLOCAL(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) + +/* + * ipv6 constants + * `ra' is `router advertisement', `rs' is `router solicitation'. + * `na' is `neighbour advertisement'. + */ +enum { + IPV6HDR_LEN = 40, + + /* neighbour discovery option types */ + V6nd_srclladdr = 1, + V6nd_targlladdr = 2, + V6nd_pfxinfo = 3, + V6nd_redirhdr = 4, + V6nd_mtu = 5, + /* new since rfc2461; see iana.org/assignments/icmpv6-parameters */ + V6nd_home = 8, + V6nd_srcaddrs = 9, /* rfc3122 */ + V6nd_ip = 17, + /* /lib/rfc/drafts/draft-jeong-dnsop-ipv6-dns-discovery-12.txt */ + V6nd_rdns = 25, + /* plan 9 extensions */ + V6nd_9fs = 250, + V6nd_9auth = 251, + + /* Router constants (all times in ms.) */ + Maxv6initraintvl= 16000, + Maxv6initras = 3, + Maxv6finalras = 3, + Minv6interradelay= 3000, + Maxv6radelay = 500, + + /* Host constants */ + Maxv6rsdelay = 1000, + V6rsintvl = 4000, + Maxv6rss = 3, + + /* Node constants */ + Maxv6mcastrss = 3, + Maxv6unicastrss = 3, + Maxv6anycastdelay= 1000, + Maxv6na = 3, + V6reachabletime = 30000, + V6retranstimer = 1000, + V6initprobedelay= 5000, +}; + +/* V6 header on the wire */ +typedef struct Ip6hdr Ip6hdr; +struct Ip6hdr { + uchar vcf[4]; /* version:4, traffic class:8, flow label:20 */ + uchar ploadlen[2]; /* payload length: packet length - 40 */ + uchar proto; /* next header type */ + uchar ttl; /* hop limit */ + uchar src[IPaddrlen]; /* source address */ + uchar dst[IPaddrlen]; /* destination address */ + uchar payload[]; +}; + +/* + * user-level icmpv6 with control message "headers" + */ +typedef struct Icmp6hdr Icmp6hdr; +struct Icmp6hdr { + uchar _0_[8]; + uchar laddr[IPaddrlen]; /* local address */ + uchar raddr[IPaddrlen]; /* remote address */ +}; + +/* + * user level udp headers with control message "headers" + */ +enum +{ + Udphdrsize= 52, /* size of a Udphdr */ +}; + +typedef struct Udphdr Udphdr; +struct Udphdr +{ + uchar raddr[IPaddrlen]; /* V6 remote address */ + uchar laddr[IPaddrlen]; /* V6 local address */ + uchar ifcaddr[IPaddrlen]; /* V6 ifc addr msg was received on */ + uchar rport[2]; /* remote port */ + uchar lport[2]; /* local port */ +}; + +uchar* defmask(uchar*); +void maskip(uchar*, uchar*, uchar*); +int eipfmt(Fmt*); +int isv4(uchar*); +vlong parseip(uchar*, char*); +vlong parseipmask(uchar*, char*); +char* v4parseip(uchar*, char*); +char* v4parsecidr(uchar*, uchar*, char*); +int parseether(uchar*, char*); +int myipaddr(uchar*, char*); +int myetheraddr(uchar*, char*); +int equivip4(uchar*, uchar*); +int equivip6(uchar*, uchar*); + +Ipifc* readipifc(char*, Ipifc*, int); + +void hnputv(void*, uvlong); +void hnputl(void*, uint); +void hnputs(void*, ushort); +uvlong nhgetv(void*); +uint nhgetl(void*); +ushort nhgets(void*); +ushort ptclbsum(uchar*, int); + +int v6tov4(uchar*, uchar*); +void v4tov6(uchar*, uchar*); + +#define ipcmp(x, y) memcmp(x, y, IPaddrlen) +#define ipmove(x, y) memmove(x, y, IPaddrlen) + +extern uchar IPv4bcast[IPaddrlen]; +extern uchar IPv4bcastobs[IPaddrlen]; +extern uchar IPv4allsys[IPaddrlen]; +extern uchar IPv4allrouter[IPaddrlen]; +extern uchar IPnoaddr[IPaddrlen]; +extern uchar v4prefix[IPaddrlen]; +extern uchar IPallbits[IPaddrlen]; + +#define CLASS(p) ((*(uchar*)(p))>>6) + +#pragma varargck type "I" uchar* +#pragma varargck type "V" uchar* +#pragma varargck type "E" uchar* +#pragma varargck type "M" uchar* |