diff options
| author | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
|---|---|---|
| committer | Charles.Forsyth <devnull@localhost> | 2006-12-22 21:39:35 +0000 |
| commit | 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch) | |
| tree | c6e220ba61db3a6ea4052e6841296d829654e664 /os/ip/ipv6.h | |
| parent | 46439007cf417cbd9ac8049bb4122c890097a0fa (diff) | |
20060303
Diffstat (limited to 'os/ip/ipv6.h')
| -rw-r--r-- | os/ip/ipv6.h | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/os/ip/ipv6.h b/os/ip/ipv6.h new file mode 100644 index 00000000..8da63cfd --- /dev/null +++ b/os/ip/ipv6.h @@ -0,0 +1,185 @@ +#define MIN(a, b) ((a) <= (b) ? (a) : (b)) + +/* rfc 3513 defines the address prefices */ +#define isv6mcast(addr) ((addr)[0] == 0xff) +#define islinklocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0x80) +#define issitelocal(addr) ((addr)[0] == 0xfe && ((addr)[1] & 0xc0) == 0xc0) +#define isv6global(addr) (((addr)[0] & 0xe0) == 0x20) + +#define optexsts(np) (nhgets((np)->ploadlen) > 24) +#define issmcast(addr) (memcmp((addr), v6solicitednode, 13) == 0) + +/* from RFC 2460 */ + +typedef struct Ip6hdr Ip6hdr; +typedef struct Opthdr Opthdr; +typedef struct Routinghdr Routinghdr; +typedef struct Fraghdr6 Fraghdr6; + +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]; + uchar dst[IPaddrlen]; +}; + +struct Opthdr { + uchar nexthdr; + uchar len; +}; + +struct Routinghdr { + uchar nexthdr; + uchar len; + uchar rtetype; + uchar segrem; +}; + +struct Fraghdr6 { + uchar nexthdr; + uchar res; + uchar offsetRM[2]; // Offset, Res, M flag + uchar id[4]; +}; + + +enum { /* Header Types */ + HBH = 0, //? + ICMP = 1, + IGMP = 2, + GGP = 3, + IPINIP = 4, + ST = 5, + TCP = 6, + UDP = 17, + ISO_TP4 = 29, + RH = 43, + FH = 44, + IDRP = 45, + RSVP = 46, + AH = 51, + ESP = 52, + ICMPv6 = 58, + NNH = 59, + DOH = 60, + ISO_IP = 80, + IGRP = 88, + OSPF = 89, + + Maxhdrtype = 256, +}; + + +enum { + // multicast flgs and scop + + well_known_flg = 0, + transient_flg = 1, + + node_local_scop = 1, + link_local_scop = 2, + site_local_scop = 5, + org_local_scop = 8, + global_scop = 14, + + // various prefix lengths + + SOLN_PREF_LEN = 13, + + // icmpv6 unreach codes + icmp6_no_route = 0, + icmp6_ad_prohib = 1, + icmp6_unassigned = 2, + icmp6_adr_unreach = 3, + icmp6_port_unreach = 4, + icmp6_unkn_code = 5, + + // various flags & constants + + v6MINTU = 1280, + HOP_LIMIT = 255, + ETHERHDR_LEN = 14, + IPV6HDR_LEN = 40, + IPV4HDR_LEN = 20, + + // option types + + SRC_LLADDRESS = 1, + TARGET_LLADDRESS = 2, + PREFIX_INFO = 3, + REDIR_HEADER = 4, + MTU_OPTION = 5, + + SRC_UNSPEC = 0, + SRC_UNI = 1, + TARG_UNI = 2, + TARG_MULTI = 3, + + t_unitent = 1, + t_uniproxy = 2, + t_unirany = 3, + + // Router constants (all times in milliseconds) + + MAX_INITIAL_RTR_ADVERT_INTERVAL = 16000, + MAX_INITIAL_RTR_ADVERTISEMENTS = 3, + MAX_FINAL_RTR_ADVERTISEMENTS = 3, + MIN_DELAY_BETWEEN_RAS = 3000, + MAX_RA_DELAY_TIME = 500, + + // Host constants + + MAX_RTR_SOLICITATION_DELAY = 1000, + RTR_SOLICITATION_INTERVAL = 4000, + MAX_RTR_SOLICITATIONS = 3, + + // Node constants + + MAX_MULTICAST_SOLICIT = 3, + MAX_UNICAST_SOLICIT = 3, + MAX_ANYCAST_DELAY_TIME = 1000, + MAX_NEIGHBOR_ADVERTISEMENT = 3, + REACHABLE_TIME = 30000, + RETRANS_TIMER = 1000, + DELAY_FIRST_PROBE_TIME = 5000, + +}; + +extern void ipv62smcast(uchar *, uchar *); +extern void icmpns(Fs *f, uchar* src, int suni, uchar* targ, int tuni, uchar* mac); +extern void icmpna(Fs *f, uchar* src, uchar* dst, uchar* targ, uchar* mac, uchar flags); +extern void icmpttlexceeded6(Fs *f, Ipifc *ifc, Block *bp); +extern void icmppkttoobig6(Fs *f, Ipifc *ifc, Block *bp); +extern void icmphostunr(Fs *f, Ipifc *ifc, Block *bp, int code, int free); + +extern uchar v6allnodesN[IPaddrlen]; +extern uchar v6allnodesL[IPaddrlen]; +extern uchar v6allroutersN[IPaddrlen]; +extern uchar v6allroutersL[IPaddrlen]; +extern uchar v6allnodesNmask[IPaddrlen]; +extern uchar v6allnodesLmask[IPaddrlen]; +extern uchar v6allroutersS[IPaddrlen]; +extern uchar v6solicitednode[IPaddrlen]; +extern uchar v6solicitednodemask[IPaddrlen]; +extern uchar v6Unspecified[IPaddrlen]; +extern uchar v6loopback[IPaddrlen]; +extern uchar v6loopbackmask[IPaddrlen]; +extern uchar v6linklocal[IPaddrlen]; +extern uchar v6linklocalmask[IPaddrlen]; +extern uchar v6sitelocal[IPaddrlen]; +extern uchar v6sitelocalmask[IPaddrlen]; +extern uchar v6glunicast[IPaddrlen]; +extern uchar v6multicast[IPaddrlen]; +extern uchar v6multicastmask[IPaddrlen]; + +extern int v6llpreflen; +extern int v6slpreflen; +extern int v6lbpreflen; +extern int v6mcpreflen; +extern int v6snpreflen; +extern int v6aNpreflen; +extern int v6aLpreflen; + +extern int ReTransTimer; |
