Logo Search packages:      
Sourcecode: nmap version File versions  Download package

ip6.h

/*
 * ip6.h
 *
 * Internet Protocol, Version 6 (RFC 2460).
 *
 * Copyright (c) 2002 Dug Song <dugsong@monkey.org>
 *
 * $Id: ip6.h 486 2004-02-23 10:01:15Z dugsong $
 */

#ifndef DNET_IP6_H
#define DNET_IP6_H

#define IP6_ADDR_LEN    16
#define IP6_ADDR_BITS   128

#define IP6_HDR_LEN     40          /* IPv6 header length */
#define IP6_LEN_MIN     IP6_HDR_LEN
#define IP6_LEN_MAX     65535       /* non-jumbo payload */

#define IP6_MTU_MIN     1280        /* minimum MTU (1024 + 256) */

00023 typedef struct ip6_addr {
      uint8_t         data[IP6_ADDR_LEN];
} ip6_addr_t;

#ifndef __GNUC__
#ifndef __attribute__
# define __attribute__(x)
#endif
# pragma pack(1)
#endif

/*
 * IPv6 header
 */
00037 struct ip6_hdr {
      union {
            struct ip6_hdr_ctl {
                  uint32_t    ip6_un1_flow; /* 20 bits of flow ID */
                  uint16_t    ip6_un1_plen; /* payload length */
                  uint8_t           ip6_un1_nxt;  /* next header */
                  uint8_t           ip6_un1_hlim; /* hop limit */
            } ip6_un1;
            uint8_t     ip6_un2_vfc;      /* 4 bits version, top 4 bits class */
      } ip6_ctlun;
      ip6_addr_t  ip6_src;
      ip6_addr_t  ip6_dst;
} __attribute__((__packed__));

#define ip6_vfc         ip6_ctlun.ip6_un2_vfc
#define ip6_flow  ip6_ctlun.ip6_un1.ip6_un1_flow
#define ip6_plen  ip6_ctlun.ip6_un1.ip6_un1_plen
#define ip6_nxt         ip6_ctlun.ip6_un1.ip6_un1_nxt /* IP_PROTO_* */
#define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim

#define IP6_VERSION           0x60
#define IP6_VERSION_MASK      0xf0        /* ip6_vfc version */

#if DNET_BYTESEX == DNET_BIG_ENDIAN
#define IP6_FLOWINFO_MASK     0x0fffffff  /* ip6_flow info (28 bits) */
#define IP6_FLOWLABEL_MASK    0x000fffff  /* ip6_flow label (20 bits) */
#elif DNET_BYTESEX == DNET_LIL_ENDIAN
#define IP6_FLOWINFO_MASK     0xffffff0f  /* ip6_flow info (28 bits) */
#define IP6_FLOWLABEL_MASK    0xffff0f00  /* ip6_flow label (20 bits) */
#endif

/*
 * Hop limit (ip6_hlim)
 */
#define IP6_HLIM_DEFAULT      64
#define IP6_HLIM_MAX          255

/*
 * Preferred extension header order from RFC 2460, 4.1:
 *
 * IP_PROTO_IPV6, IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS, IP_PROTO_ROUTING,
 * IP_PROTO_FRAGMENT, IP_PROTO_AH, IP_PROTO_ESP, IP_PROTO_DSTOPTS, IP_PROTO_*
 */

/*
 * Routing header data (IP_PROTO_ROUTING)
 */
00084 struct ip6_ext_data_routing {
      uint8_t  type;                /* routing type */
      uint8_t  segleft;       /* segments left */
      /* followed by routing type specific data */
} __attribute__((__packed__));

00090 struct ip6_ext_data_routing0 {
      uint8_t  type;                /* always zero */
      uint8_t  segleft;       /* segments left */
      uint8_t  reserved;            /* reserved field */
      uint8_t  slmap[3];            /* strict/loose bit map */
      ip6_addr_t  addr[1];          /* up to 23 addresses */
} __attribute__((__packed__));

/*
 * Fragment header data (IP_PROTO_FRAGMENT)
 */
00101 struct ip6_ext_data_fragment {
      uint16_t  offlg;        /* offset, reserved, and flag */
      uint32_t  ident;        /* identification */
} __attribute__((__packed__));

/*
 * Fragmentation offset, reserved, and flags (offlg)
 */
#if DNET_BYTESEX == DNET_BIG_ENDIAN
#define IP6_OFF_MASK          0xfff8      /* mask out offset from offlg */
#define IP6_RESERVED_MASK     0x0006      /* reserved bits in offlg */
#define IP6_MORE_FRAG         0x0001      /* more-fragments flag */
#elif DNET_BYTESEX == DNET_LIL_ENDIAN
#define IP6_OFF_MASK          0xf8ff      /* mask out offset from offlg */
#define IP6_RESERVED_MASK     0x0600      /* reserved bits in offlg */
#define IP6_MORE_FRAG         0x0100      /* more-fragments flag */
#endif

/*
 * Option types, for IP_PROTO_HOPOPTS, IP_PROTO_DSTOPTS headers
 */
#define IP6_OPT_PAD1          0x00  /* 00 0 00000 */
#define IP6_OPT_PADN          0x01  /* 00 0 00001 */
#define IP6_OPT_JUMBO         0xC2  /* 11 0 00010 = 194 */
#define IP6_OPT_JUMBO_LEN     6
#define IP6_OPT_RTALERT       0x05  /* 00 0 00101 */
#define IP6_OPT_RTALERT_LEN   4
#define IP6_OPT_RTALERT_MLD   0     /* Datagram contains an MLD message */
#define IP6_OPT_RTALERT_RSVP  1     /* Datagram contains an RSVP message */
#define IP6_OPT_RTALERT_ACTNET      2     /* contains an Active Networks msg */
#define IP6_OPT_LEN_MIN       2

#define IP6_OPT_TYPE(o)       ((o) & 0xC0)      /* high 2 bits of opt_type */
#define IP6_OPT_TYPE_SKIP     0x00  /* continue processing on failure */
#define IP6_OPT_TYPE_DISCARD  0x40  /* discard packet on failure */
#define IP6_OPT_TYPE_FORCEICMP      0x80  /* discard and send ICMP on failure */
#define IP6_OPT_TYPE_ICMP     0xC0  /* ...only if non-multicast dst */

#define IP6_OPT_MUTABLE       0x20  /* option data may change en route */

/*
 * Extension header (chained via {ip6,ext}_nxt, following IPv6 header)
 */
00144 struct ip6_ext_hdr {
      uint8_t  ext_nxt; /* next header */
      uint8_t  ext_len; /* following length in units of 8 octets */
      union {
            struct ip6_ext_data_routing   routing;
            struct ip6_ext_data_fragment  fragment;
      } ext_data;
} __attribute__((__packed__));

#ifndef __GNUC__
# pragma pack()
#endif

/*
 * Reserved addresses
 */
#define IP6_ADDR_UNSPEC \
      "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
#define IP6_ADDR_LOOPBACK \
      "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"

#define ip6_pack_hdr(hdr, fc, fl, plen, nxt, hlim, src, dst) do { \
      struct ip6_hdr *ip6 = (struct ip6_hdr *)(hdr);              \
      ip6->ip6_flow = htonl(((uint32_t)(fc) << 28) &              \
          (IP6_FLOWLABEL_MASK | (fl)));                     \
      ip6->ip6_vfc = (IP6_VERSION | ((fc) >> 4));                 \
      ip6->ip6_plen = htons((plen));                              \
      ip6->ip6_nxt = (nxt); ip6->ip6_hlim = (hlim);               \
      memmove(&ip6->ip6_src, &(src), IP6_ADDR_LEN);               \
      memmove(&ip6->ip6_dst, &(dst), IP6_ADDR_LEN);               \
} while (0);

__BEGIN_DECLS
char  *ip6_ntop(const ip6_addr_t *ip6, char *dst, size_t size);
int    ip6_pton(const char *src, ip6_addr_t *dst);
char  *ip6_ntoa(const ip6_addr_t *ip6);
#define      ip6_aton ip6_pton

void   ip6_checksum(void *buf, size_t len);
__END_DECLS

#endif /* DNET_IP6_H */

Generated by  Doxygen 1.6.0   Back to index