ヘッダ構造体メモ

Ethernetヘッダ(DIX規格)

 struct ethhdr
 {
    unsigned char   h_dest[ETH_ALEN];   /* destination eth addr */
    unsigned char   h_source[ETH_ALEN]; /* source ether addr    */
    unsigned short  h_proto;        /* packet type ID field */
 };

IPv4ヘッダ

  • netinet/ip.h
 struct iphdr
   {
 #if __BYTE_ORDER == __LITTLE_ENDIAN
     unsigned int ihl:4;
     unsigned int version:4;
 #elif __BYTE_ORDER == __BIG_ENDIAN
     unsigned int version:4;
     unsigned int ihl:4;
 #else
 # error "Please fix <bits/endian.h>"
 #endif
     u_int8_t tos;
     u_int16_t tot_len;
     u_int16_t id;
     u_int16_t frag_off;
     u_int8_t ttl;
     u_int8_t protocol;
     u_int16_t check;
     u_int32_t saddr;
     u_int32_t daddr;
     /*The options start here. */
   };

IPv6ヘッダ

  • netinet/ip6.h
 struct ip6_hdr
  {
    union
      {
        struct ip6_hdrctl
          {
            uint32_t ip6_un1_flow;   /* 4 bits version, 8 bits TC, 20 bits 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 tclass */
      } ip6_ctlun;
    struct in6_addr ip6_src;      /* source address */
    struct in6_addr ip6_dst;      /* destination address */
  };
 #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
 #define ip6_hlim  ip6_ctlun.ip6_un1.ip6_un1_hlim
 #define ip6_hops  ip6_ctlun.ip6_un1.ip6_un1_hlim

ICMPヘッダ

  • netinet/ip_icmp.h
 struct icmp
 {
   u_int8_t  icmp_type;  /* type of message, see below */
   u_int8_t  icmp_code;  /* type sub code */
   u_int16_t icmp_cksum; /* ones complement checksum of struct */
   union
   {
     u_char ih_pptr;     /* ICMP_PARAMPROB */
     struct in_addr ih_gwaddr;   /* gateway address */
     struct ih_idseq     /* echo datagram */
     {
       u_int16_t icd_id;
       u_int16_t icd_seq;
     } ih_idseq;
     u_int32_t ih_void;

     /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
     struct ih_pmtu
     {
       u_int16_t ipm_void;
       u_int16_t ipm_nextmtu;
     } ih_pmtu;

     struct ih_rtradv
     {
       u_int8_t irt_num_addrs;
       u_int8_t irt_wpa;
       u_int16_t irt_lifetime;
     } ih_rtradv;
   } icmp_hun;
 #define icmp_pptr   icmp_hun.ih_pptr
 #define icmp_gwaddr icmp_hun.ih_gwaddr
 #define icmp_id     icmp_hun.ih_idseq.icd_id
 #define icmp_seq    icmp_hun.ih_idseq.icd_seq
 #define icmp_void   icmp_hun.ih_void
 #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
 #define icmp_nextmtu    icmp_hun.ih_pmtu.ipm_nextmtu
 #define icmp_num_addrs  icmp_hun.ih_rtradv.irt_num_addrs
 #define icmp_wpa    icmp_hun.ih_rtradv.irt_wpa
 #define icmp_lifetime   icmp_hun.ih_rtradv.irt_lifetime
  union
  {
    struct
    {
      u_int32_t its_otime;
      u_int32_t its_rtime;
      u_int32_t its_ttime;
    } id_ts;
    struct    
    {
      struct ip idi_ip;
      /* options and then 64 bits of data */
    } id_ip;
    struct icmp_ra_addr id_radv;
    u_int32_t   id_mask;
    u_int8_t    id_data[1];
  } icmp_dun;
 #define icmp_otime  icmp_dun.id_ts.its_otime
 #define icmp_rtime  icmp_dun.id_ts.its_rtime
 #define icmp_ttime  icmp_dun.id_ts.its_ttime
 #define icmp_ip     icmp_dun.id_ip.idi_ip
 #define icmp_radv   icmp_dun.id_radv
 #define icmp_mask   icmp_dun.id_mask
 #define icmp_data   icmp_dun.id_data
 };

UDPヘッダ

  • netinet/udp.h
 struct udphdr {
         u_int16_t uh_sport;           /* source port */
         u_int16_t uh_dport;           /* destination port */
         u_int16_t uh_ulen;            /* udp length */
         u_int16_t uh_sum;             /* udp checksum */
 };
 struct udphdr {
    __u16   source;
    __u16   dest;
    __u16   len;
    __u16   check;
 };

TCPヘッダ

  • netinet/tcp.h
 struct tcphdr
   {
    u_int16_t source;
    u_int16_t dest;
    u_int32_t seq;
    u_int32_t ack_seq;
 #  if __BYTE_ORDER == __LITTLE_ENDIAN
    u_int16_t res1:4;
    u_int16_t doff:4;
    u_int16_t fin:1;
    u_int16_t syn:1;
    u_int16_t rst:1;
    u_int16_t psh:1;
    u_int16_t ack:1;
    u_int16_t urg:1;
    u_int16_t res2:2;
 #  elif __BYTE_ORDER == __BIG_ENDIAN
    u_int16_t doff:4;
    u_int16_t res1:4;
    u_int16_t res2:2;
    u_int16_t urg:1;
    u_int16_t ack:1;
    u_int16_t psh:1;
    u_int16_t rst:1;
    u_int16_t syn:1;
    u_int16_t fin:1;
 #  else
 #   error "Adjust your <bits/endian.h> defines"
 #  endif
    u_int16_t window;
    u_int16_t check;
    u_int16_t urg_ptr;
 };