home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / igmp.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.2 KB  |  241 lines

  1. /*
  2.  *    Linux NET3:    Internet Group Management Protocol  [IGMP]
  3.  *
  4.  *    Authors:
  5.  *        Alan Cox <alan@lxorguk.ukuu.org.uk>
  6.  *
  7.  *    Extended to talk the BSD extended IGMP protocol of mrouted 3.6
  8.  *
  9.  *
  10.  *    This program is free software; you can redistribute it and/or
  11.  *    modify it under the terms of the GNU General Public License
  12.  *    as published by the Free Software Foundation; either version
  13.  *    2 of the License, or (at your option) any later version.
  14.  */
  15.  
  16. #ifndef _LINUX_IGMP_H
  17. #define _LINUX_IGMP_H
  18.  
  19. #include <asm/byteorder.h>
  20.  
  21. /*
  22.  *    IGMP protocol structures
  23.  */
  24.  
  25. /*
  26.  *    Header in on cable format
  27.  */
  28.  
  29. struct igmphdr
  30. {
  31.     __u8 type;
  32.     __u8 code;        /* For newer IGMP */
  33.     __sum16 csum;
  34.     __be32 group;
  35. };
  36.  
  37. /* V3 group record types [grec_type] */
  38. #define IGMPV3_MODE_IS_INCLUDE        1
  39. #define IGMPV3_MODE_IS_EXCLUDE        2
  40. #define IGMPV3_CHANGE_TO_INCLUDE    3
  41. #define IGMPV3_CHANGE_TO_EXCLUDE    4
  42. #define IGMPV3_ALLOW_NEW_SOURCES    5
  43. #define IGMPV3_BLOCK_OLD_SOURCES    6
  44.  
  45. struct igmpv3_grec {
  46.     __u8    grec_type;
  47.     __u8    grec_auxwords;
  48.     __be16    grec_nsrcs;
  49.     __be32    grec_mca;
  50.     __be32    grec_src[0];
  51. };
  52.  
  53. struct igmpv3_report {
  54.     __u8 type;
  55.     __u8 resv1;
  56.     __be16 csum;
  57.     __be16 resv2;
  58.     __be16 ngrec;
  59.     struct igmpv3_grec grec[0];
  60. };
  61.  
  62. struct igmpv3_query {
  63.     __u8 type;
  64.     __u8 code;
  65.     __be16 csum;
  66.     __be32 group;
  67. #if defined(__LITTLE_ENDIAN_BITFIELD)
  68.     __u8 qrv:3,
  69.          suppress:1,
  70.          resv:4;
  71. #elif defined(__BIG_ENDIAN_BITFIELD)
  72.     __u8 resv:4,
  73.          suppress:1,
  74.          qrv:3;
  75. #else
  76. #error "Please fix <asm/byteorder.h>"
  77. #endif
  78.     __u8 qqic;
  79.     __be16 nsrcs;
  80.     __be32 srcs[0];
  81. };
  82.  
  83. #define IGMP_HOST_MEMBERSHIP_QUERY    0x11    /* From RFC1112 */
  84. #define IGMP_HOST_MEMBERSHIP_REPORT    0x12    /* Ditto */
  85. #define IGMP_DVMRP            0x13    /* DVMRP routing */
  86. #define IGMP_PIM            0x14    /* PIM routing */
  87. #define IGMP_TRACE            0x15
  88. #define IGMPV2_HOST_MEMBERSHIP_REPORT    0x16    /* V2 version of 0x11 */
  89. #define IGMP_HOST_LEAVE_MESSAGE     0x17
  90. #define IGMPV3_HOST_MEMBERSHIP_REPORT    0x22    /* V3 version of 0x11 */
  91.  
  92. #define IGMP_MTRACE_RESP        0x1e
  93. #define IGMP_MTRACE            0x1f
  94.  
  95.  
  96. /*
  97.  *    Use the BSD names for these for compatibility
  98.  */
  99.  
  100. #define IGMP_DELAYING_MEMBER        0x01
  101. #define IGMP_IDLE_MEMBER        0x02
  102. #define IGMP_LAZY_MEMBER        0x03
  103. #define IGMP_SLEEPING_MEMBER        0x04
  104. #define IGMP_AWAKENING_MEMBER        0x05
  105.  
  106. #define IGMP_MINLEN            8
  107.  
  108. #define IGMP_MAX_HOST_REPORT_DELAY    10    /* max delay for response to */
  109.                         /* query (in seconds)    */
  110.  
  111. #define IGMP_TIMER_SCALE        10    /* denotes that the igmphdr->timer field */
  112.                         /* specifies time in 10th of seconds     */
  113.  
  114. #define IGMP_AGE_THRESHOLD        400    /* If this host don't hear any IGMP V1    */
  115.                         /* message in this period of time,    */
  116.                         /* revert to IGMP v2 router.        */
  117.  
  118. #define IGMP_ALL_HOSTS        htonl(0xE0000001L)
  119. #define IGMP_ALL_ROUTER     htonl(0xE0000002L)
  120. #define IGMPV3_ALL_MCR         htonl(0xE0000016L)
  121. #define IGMP_LOCAL_GROUP    htonl(0xE0000000L)
  122. #define IGMP_LOCAL_GROUP_MASK    htonl(0xFFFFFF00L)
  123.  
  124. /*
  125.  * struct for keeping the multicast list in
  126.  */
  127.  
  128. #ifdef __KERNEL__
  129. #include <linux/skbuff.h>
  130. #include <linux/timer.h>
  131. #include <linux/in.h>
  132.  
  133. static inline struct igmphdr *igmp_hdr(const struct sk_buff *skb)
  134. {
  135.     return (struct igmphdr *)skb_transport_header(skb);
  136. }
  137.  
  138. static inline struct igmpv3_report *
  139.             igmpv3_report_hdr(const struct sk_buff *skb)
  140. {
  141.     return (struct igmpv3_report *)skb_transport_header(skb);
  142. }
  143.  
  144. static inline struct igmpv3_query *
  145.             igmpv3_query_hdr(const struct sk_buff *skb)
  146. {
  147.     return (struct igmpv3_query *)skb_transport_header(skb);
  148. }
  149.  
  150. extern int sysctl_igmp_max_memberships;
  151. extern int sysctl_igmp_max_msf;
  152.  
  153. struct ip_sf_socklist
  154. {
  155.     unsigned int        sl_max;
  156.     unsigned int        sl_count;
  157.     __be32            sl_addr[0];
  158. };
  159.  
  160. #define IP_SFLSIZE(count)    (sizeof(struct ip_sf_socklist) + \
  161.     (count) * sizeof(__be32))
  162.  
  163. #define IP_SFBLOCK    10    /* allocate this many at once */
  164.  
  165. /* ip_mc_socklist is real list now. Speed is not argument;
  166.    this list never used in fast path code
  167.  */
  168.  
  169. struct ip_mc_socklist
  170. {
  171.     struct ip_mc_socklist    *next;
  172.     struct ip_mreqn        multi;
  173.     unsigned int        sfmode;        /* MCAST_{INCLUDE,EXCLUDE} */
  174.     struct ip_sf_socklist    *sflist;
  175. };
  176.  
  177. struct ip_sf_list
  178. {
  179.     struct ip_sf_list    *sf_next;
  180.     __be32            sf_inaddr;
  181.     unsigned long        sf_count[2];    /* include/exclude counts */
  182.     unsigned char        sf_gsresp;    /* include in g & s response? */
  183.     unsigned char        sf_oldin;    /* change state */
  184.     unsigned char        sf_crcount;    /* retrans. left to send */
  185. };
  186.  
  187. struct ip_mc_list
  188. {
  189.     struct in_device    *interface;
  190.     __be32            multiaddr;
  191.     struct ip_sf_list    *sources;
  192.     struct ip_sf_list    *tomb;
  193.     unsigned int        sfmode;
  194.     unsigned long        sfcount[2];
  195.     struct ip_mc_list    *next;
  196.     struct timer_list    timer;
  197.     int            users;
  198.     atomic_t        refcnt;
  199.     spinlock_t        lock;
  200.     char            tm_running;
  201.     char            reporter;
  202.     char            unsolicit_count;
  203.     char            loaded;
  204.     unsigned char        gsquery;    /* check source marks? */
  205.     unsigned char        crcount;
  206. };
  207.  
  208. /* V3 exponential field decoding */
  209. #define IGMPV3_MASK(value, nb) ((nb)>=32 ? (value) : ((1<<(nb))-1) & (value))
  210. #define IGMPV3_EXP(thresh, nbmant, nbexp, value) \
  211.     ((value) < (thresh) ? (value) : \
  212.         ((IGMPV3_MASK(value, nbmant) | (1<<(nbmant))) << \
  213.          (IGMPV3_MASK((value) >> (nbmant), nbexp) + (nbexp))))
  214.  
  215. #define IGMPV3_QQIC(value) IGMPV3_EXP(0x80, 4, 3, value)
  216. #define IGMPV3_MRC(value) IGMPV3_EXP(0x80, 4, 3, value)
  217.  
  218. extern int ip_check_mc(struct in_device *dev, __be32 mc_addr, __be32 src_addr, u16 proto);
  219. extern int igmp_rcv(struct sk_buff *);
  220. extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
  221. extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
  222. extern void ip_mc_drop_socket(struct sock *sk);
  223. extern int ip_mc_source(int add, int omode, struct sock *sk,
  224.         struct ip_mreq_source *mreqs, int ifindex);
  225. extern int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf,int ifindex);
  226. extern int ip_mc_msfget(struct sock *sk, struct ip_msfilter *msf,
  227.         struct ip_msfilter __user *optval, int __user *optlen);
  228. extern int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
  229.         struct group_filter __user *optval, int __user *optlen);
  230. extern int ip_mc_sf_allow(struct sock *sk, __be32 local, __be32 rmt, int dif);
  231. extern void ip_mc_init_dev(struct in_device *);
  232. extern void ip_mc_destroy_dev(struct in_device *);
  233. extern void ip_mc_up(struct in_device *);
  234. extern void ip_mc_down(struct in_device *);
  235. extern void ip_mc_dec_group(struct in_device *in_dev, __be32 addr);
  236. extern void ip_mc_inc_group(struct in_device *in_dev, __be32 addr);
  237. extern void ip_mc_rejoin_group(struct ip_mc_list *im);
  238.  
  239. #endif
  240. #endif
  241.