#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;