home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / net / if_inet6.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  6.2 KB  |  285 lines

  1. /*
  2.  *    inet6 interface/address list definitions
  3.  *    Linux INET6 implementation 
  4.  *
  5.  *    Authors:
  6.  *    Pedro Roque        <roque@di.fc.ul.pt>    
  7.  *
  8.  *
  9.  *    This program is free software; you can redistribute it and/or
  10.  *      modify it under the terms of the GNU General Public License
  11.  *      as published by the Free Software Foundation; either version
  12.  *      2 of the License, or (at your option) any later version.
  13.  */
  14.  
  15. #ifndef _NET_IF_INET6_H
  16. #define _NET_IF_INET6_H
  17.  
  18. #include <net/snmp.h>
  19. #include <linux/ipv6.h>
  20.  
  21. /* inet6_dev.if_flags */
  22.  
  23. #define IF_RA_OTHERCONF    0x80
  24. #define IF_RA_MANAGED    0x40
  25. #define IF_RA_RCVD    0x20
  26. #define IF_RS_SENT    0x10
  27. #define IF_READY    0x80000000
  28.  
  29. /* prefix flags */
  30. #define IF_PREFIX_ONLINK    0x01
  31. #define IF_PREFIX_AUTOCONF    0x02
  32.  
  33. #ifdef __KERNEL__
  34.  
  35. struct inet6_ifaddr 
  36. {
  37.     struct in6_addr        addr;
  38.     __u32            prefix_len;
  39.     
  40.     __u32            valid_lft;
  41.     __u32            prefered_lft;
  42.     unsigned long        cstamp;    /* created timestamp */
  43.     unsigned long        tstamp; /* updated timestamp */
  44.     atomic_t        refcnt;
  45.     spinlock_t        lock;
  46.  
  47.     __u8            probes;
  48.     __u8            flags;
  49.  
  50.     __u16            scope;
  51.  
  52.     struct timer_list    timer;
  53.  
  54.     struct inet6_dev    *idev;
  55.     struct rt6_info        *rt;
  56.  
  57.     struct inet6_ifaddr    *lst_next;      /* next addr in addr_lst */
  58.     struct inet6_ifaddr    *if_next;       /* next addr in inet6_dev */
  59.  
  60. #ifdef CONFIG_IPV6_PRIVACY
  61.     struct inet6_ifaddr    *tmp_next;    /* next addr in tempaddr_lst */
  62.     struct inet6_ifaddr    *ifpub;
  63.     int            regen_count;
  64. #endif
  65.  
  66.     int            dead;
  67. };
  68.  
  69. struct ip6_sf_socklist
  70. {
  71.     unsigned int        sl_max;
  72.     unsigned int        sl_count;
  73.     struct in6_addr        sl_addr[0];
  74. };
  75.  
  76. #define IP6_SFLSIZE(count)    (sizeof(struct ip6_sf_socklist) + \
  77.     (count) * sizeof(struct in6_addr))
  78.  
  79. #define IP6_SFBLOCK    10    /* allocate this many at once */
  80.  
  81. struct ipv6_mc_socklist
  82. {
  83.     struct in6_addr        addr;
  84.     int            ifindex;
  85.     struct ipv6_mc_socklist *next;
  86.     rwlock_t        sflock;
  87.     unsigned int        sfmode;        /* MCAST_{INCLUDE,EXCLUDE} */
  88.     struct ip6_sf_socklist    *sflist;
  89. };
  90.  
  91. struct ip6_sf_list
  92. {
  93.     struct ip6_sf_list    *sf_next;
  94.     struct in6_addr        sf_addr;
  95.     unsigned long        sf_count[2];    /* include/exclude counts */
  96.     unsigned char        sf_gsresp;    /* include in g & s response? */
  97.     unsigned char        sf_oldin;    /* change state */
  98.     unsigned char        sf_crcount;    /* retrans. left to send */
  99. };
  100.  
  101. #define MAF_TIMER_RUNNING    0x01
  102. #define MAF_LAST_REPORTER    0x02
  103. #define MAF_LOADED        0x04
  104. #define MAF_NOREPORT        0x08
  105. #define MAF_GSQUERY        0x10
  106.  
  107. struct ifmcaddr6
  108. {
  109.     struct in6_addr        mca_addr;
  110.     struct inet6_dev    *idev;
  111.     struct ifmcaddr6    *next;
  112.     struct ip6_sf_list    *mca_sources;
  113.     struct ip6_sf_list    *mca_tomb;
  114.     unsigned int        mca_sfmode;
  115.     unsigned long        mca_sfcount[2];
  116.     struct timer_list    mca_timer;
  117.     unsigned        mca_flags;
  118.     int            mca_users;
  119.     atomic_t        mca_refcnt;
  120.     spinlock_t        mca_lock;
  121.     unsigned char        mca_crcount;
  122.     unsigned long        mca_cstamp;
  123.     unsigned long        mca_tstamp;
  124. };
  125.  
  126. /* Anycast stuff */
  127.  
  128. struct ipv6_ac_socklist
  129. {
  130.     struct in6_addr        acl_addr;
  131.     int            acl_ifindex;
  132.     struct ipv6_ac_socklist *acl_next;
  133. };
  134.  
  135. struct ifacaddr6
  136. {
  137.     struct in6_addr        aca_addr;
  138.     struct inet6_dev    *aca_idev;
  139.     struct rt6_info        *aca_rt;
  140.     struct ifacaddr6    *aca_next;
  141.     int            aca_users;
  142.     atomic_t        aca_refcnt;
  143.     spinlock_t        aca_lock;
  144.     unsigned long        aca_cstamp;
  145.     unsigned long        aca_tstamp;
  146. };
  147.  
  148. #define    IFA_HOST    IPV6_ADDR_LOOPBACK
  149. #define    IFA_LINK    IPV6_ADDR_LINKLOCAL
  150. #define    IFA_SITE    IPV6_ADDR_SITELOCAL
  151. #define    IFA_GLOBAL    0x0000U
  152.  
  153. struct ipv6_devstat {
  154.     struct proc_dir_entry    *proc_dir_entry;
  155.     DEFINE_SNMP_STAT(struct icmpv6_mib, icmpv6);
  156. };
  157.  
  158. struct inet6_dev 
  159. {
  160.     struct net_device        *dev;
  161.  
  162.     struct inet6_ifaddr    *addr_list;
  163.  
  164.     struct ifmcaddr6    *mc_list;
  165.     struct ifmcaddr6    *mc_tomb;
  166.     rwlock_t        mc_lock;
  167.     unsigned long        mc_v1_seen;
  168.     unsigned long        mc_maxdelay;
  169.     unsigned char        mc_qrv;
  170.     unsigned char        mc_gq_running;
  171.     unsigned char        mc_ifc_count;
  172.     struct timer_list    mc_gq_timer;    /* general query timer */
  173.     struct timer_list    mc_ifc_timer;    /* interface change timer */
  174.  
  175.     struct ifacaddr6    *ac_list;
  176.     rwlock_t        lock;
  177.     atomic_t        refcnt;
  178.     __u32            if_flags;
  179.     int            dead;
  180.  
  181. #ifdef CONFIG_IPV6_PRIVACY
  182.     u8            rndid[8];
  183.     struct timer_list    regen_timer;
  184.     struct inet6_ifaddr    *tempaddr_list;
  185. #endif
  186.  
  187.     struct neigh_parms    *nd_parms;
  188.     struct inet6_dev    *next;
  189.     struct ipv6_devconf    cnf;
  190.     struct ipv6_devstat    stats;
  191.     unsigned long        tstamp; /* ipv6InterfaceTable update timestamp */
  192. };
  193.  
  194. extern struct ipv6_devconf ipv6_devconf;
  195.  
  196. static inline void ipv6_eth_mc_map(struct in6_addr *addr, char *buf)
  197. {
  198.     /*
  199.      *    +-------+-------+-------+-------+-------+-------+
  200.      *      |   33  |   33  | DST13 | DST14 | DST15 | DST16 |
  201.      *      +-------+-------+-------+-------+-------+-------+
  202.      */
  203.  
  204.     buf[0]= 0x33;
  205.     buf[1]= 0x33;
  206.  
  207.     memcpy(buf + 2, &addr->s6_addr32[3], sizeof(__u32));
  208. }
  209.  
  210. static inline void ipv6_tr_mc_map(struct in6_addr *addr, char *buf)
  211. {
  212.     /* All nodes FF01::1, FF02::1, FF02::1:FFxx:xxxx */
  213.  
  214.     if (((addr->s6_addr[0] == 0xFF) &&
  215.         ((addr->s6_addr[1] == 0x01) || (addr->s6_addr[1] == 0x02)) &&
  216.          (addr->s6_addr16[1] == 0) &&
  217.          (addr->s6_addr32[1] == 0) &&
  218.          (addr->s6_addr32[2] == 0) &&
  219.          (addr->s6_addr16[6] == 0) &&
  220.          (addr->s6_addr[15] == 1)) ||
  221.         ((addr->s6_addr[0] == 0xFF) &&
  222.          (addr->s6_addr[1] == 0x02) &&
  223.          (addr->s6_addr16[1] == 0) &&
  224.          (addr->s6_addr32[1] == 0) &&
  225.          (addr->s6_addr16[4] == 0) &&
  226.          (addr->s6_addr[10] == 0) &&
  227.          (addr->s6_addr[11] == 1) &&
  228.          (addr->s6_addr[12] == 0xff)))
  229.     {
  230.         buf[0]=0xC0;
  231.         buf[1]=0x00;
  232.         buf[2]=0x01;
  233.         buf[3]=0x00;
  234.         buf[4]=0x00;
  235.         buf[5]=0x00;
  236.     /* All routers FF0x::2 */
  237.     } else if ((addr->s6_addr[0] ==0xff) &&
  238.         ((addr->s6_addr[1] & 0xF0) == 0) &&
  239.         (addr->s6_addr16[1] == 0) &&
  240.         (addr->s6_addr32[1] == 0) &&
  241.         (addr->s6_addr32[2] == 0) &&
  242.         (addr->s6_addr16[6] == 0) &&
  243.         (addr->s6_addr[15] == 2))
  244.     {
  245.         buf[0]=0xC0;
  246.         buf[1]=0x00;
  247.         buf[2]=0x02;
  248.         buf[3]=0x00;
  249.         buf[4]=0x00;
  250.         buf[5]=0x00;
  251.     } else {
  252.         unsigned char i ; 
  253.         
  254.         i = addr->s6_addr[15] & 7 ; 
  255.         buf[0]=0xC0;
  256.         buf[1]=0x00;
  257.         buf[2]=0x00;
  258.         buf[3]=0x01 << i ; 
  259.         buf[4]=0x00;
  260.         buf[5]=0x00;
  261.     }
  262. }
  263.  
  264. static inline void ipv6_arcnet_mc_map(const struct in6_addr *addr, char *buf)
  265. {
  266.     buf[0] = 0x00;
  267. }
  268.  
  269. static inline void ipv6_ib_mc_map(struct in6_addr *addr, char *buf)
  270. {
  271.     buf[0]  = 0;        /* Reserved */
  272.     buf[1]  = 0xff;        /* Multicast QPN */
  273.     buf[2]  = 0xff;
  274.     buf[3]  = 0xff;
  275.     buf[4]  = 0xff;
  276.     buf[5]  = 0x12;        /* link local scope */
  277.     buf[6]  = 0x60;        /* IPv6 signature */
  278.     buf[7]  = 0x1b;
  279.     buf[8]  = 0;        /* P_Key */
  280.     buf[9]  = 0;
  281.     memcpy(buf + 10, addr->s6_addr + 6, 10);
  282. }
  283. #endif
  284. #endif
  285.