ip_mroute.h
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:11k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ip_mroute.h - internet multicast routing header file */
  2. /* Copyright 1984 - 2001 Wind River Systems, Inc. */
  3. /*
  4.  * Copyright (c) 1989 Stephen Deering.
  5.  * Copyright (c) 1992, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * This code is derived from software contributed to Berkeley by
  9.  * Stephen Deering of Stanford University.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in the
  18.  *    documentation and/or other materials provided with the distribution.
  19.  * 3. All advertising materials mentioning features or use of this software
  20.  *    must display the following acknowledgement:
  21.  * This product includes software developed by the University of
  22.  * California, Berkeley and its contributors.
  23.  * 4. Neither the name of the University nor the names of its contributors
  24.  *    may be used to endorse or promote products derived from this software
  25.  *    without specific prior written permission.
  26.  *
  27.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  28.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  29.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  30.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  31.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  32.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  33.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  34.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  35.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  36.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  37.  * SUCH DAMAGE.
  38.  *
  39.  * @(#)ip_mroute.h 8.1 (Berkeley) 6/10/93
  40.  * $Id: ip_mroute.h,v 1.15 1999/01/18 02:06:59 fenner Exp $
  41.  */
  42. /*
  43. modification history
  44. --------------------
  45. 01c,10oct01,rae  merge from truestack ver 01k (v2 upgrade)
  46. 01b,08apr97,vin  removed declarations for ip_mforward and ip_mrouter_done.
  47.  implemented ip_mforward as a hook for scalability.
  48. 01a,03mar96,vin  created from BSD4.4lite2.
  49. */
  50. #ifndef __INCip_mrouteh
  51. #define __INCip_mrouteh
  52. #include "netinet/in_pcb.h"
  53. #ifdef __cplusplus
  54. extern "C" {
  55. #endif
  56. /*
  57.  * Definitions for IP multicast forwarding.
  58.  *
  59.  * Written by David Waitzman, BBN Labs, August 1988.
  60.  * Modified by Steve Deering, Stanford, February 1989.
  61.  * Modified by Ajit Thyagarajan, PARC, August 1993.
  62.  * Modified by Ajit Thyagarajan, PARC, August 1994.
  63.  *
  64.  * MROUTING Revision: 3.3.1.3
  65.  */
  66. #define ENCAP_TTL 64
  67. #define ENCAP_PROTO IPPROTO_IPIP /* 4 */
  68. /* should be in netinetin.h in BSD */
  69. #define IPPROTO_IPIP 4  /* IP encapsulation in IP*//* added 8.22.00 chall */
  70. #define IPPROTO_RSVP 46  /* resource reservation */
  71. /*
  72.  * Multicast Routing set/getsockopt commands.
  73.  */
  74. #define MRT_INIT 100 /* initialize forwarder */
  75. #define MRT_DONE 101 /* shut down forwarder */
  76. #define MRT_ADD_VIF 102 /* create virtual interface */
  77. #define MRT_DEL_VIF 103 /* delete virtual interface */
  78. #define MRT_ADD_MFC 104 /* insert forwarding cache entry */
  79. #define MRT_DEL_MFC 105 /* delete forwarding cache entry */
  80. #define MRT_VERSION 106 /* get kernel version number */
  81. #define MRT_ASSERT  107 /* enable PIM assert processing */
  82. #define MRT_DEBUG 108
  83. #define EXPIRE_TIMEOUT 250000000/* nanoseconds */ /*(hz / 4) 4x / second */
  84. #define UPCALL_EXPIRE 6 /* number of timeouts */
  85. #define TBF_REPROCESS 10000000  /* nanoseconds */   /*(hz / 100) 100x / second */
  86. #define DEBUG_MFC 0x02
  87. #define DEBUG_FORWARD 0x04
  88. #define DEBUG_EXPIRE 0x08
  89. #define DEBUG_XMIT 0x10
  90. #define DEBUG_TABLE 0x20
  91. /*
  92.  * Rate limit for assert notification messages, in usec
  93.  */
  94. #define ASSERT_MSG_TIME 3000000
  95. #ifndef __P
  96. #define __P(x) x
  97. #endif
  98. /*
  99.  * Types for handling bitmaps with one bit per virtual interface.
  100.  */
  101. #define MAXVIFS 32
  102. typedef u_long vifbitmap_t;
  103. typedef u_short vifi_t; /* type of a vif index */
  104. /* from BSD's sys/sockio.h */
  105. #define SIOCGETVIFCNT _IOWR('r', 15, struct sioc_vif_req)/* get vif pkt cnt */
  106. #define SIOCGETSGCNT _IOWR('r', 16, struct sioc_sg_req) /* get s,g pkt cnt */
  107. /* BSD's sys/ioctl.h should be included in sys/sockio.h */
  108. #include "sys/ioctl.h"
  109. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  110. #pragma align 1                 /* tell gcc960 not to optimize alignments */
  111. #endif /* CPU_FAMILY==I960 */
  112. /*
  113.  * Argument structure for MRT_ADD_VIF.
  114.  * (MRT_DEL_VIF takes a single vifi_t argument.)
  115.  */
  116. struct vifctl {
  117. vifi_t vifc_vifi;      /* the index of the vif to be added */
  118. u_char vifc_flags;      /* VIFF_ flags defined below */
  119. u_char vifc_threshold;  /* min ttl required to forward on vif */
  120. u_int vifc_rate_limit; /* max rate */
  121. struct in_addr vifc_lcl_addr; /* local interface address */
  122. struct in_addr vifc_rmt_addr; /* remote address (tunnels only) */
  123. };
  124. #define VIFF_TUNNEL 0x1 /* vif represents a tunnel end-point */
  125. #define VIFF_SRCRT 0x2 /* tunnel uses IP source routing */
  126. /*
  127.  * Argument structure for MRT_ADD_MFC and MRT_DEL_MFC
  128.  * (mfcc_tos to be added at a future point)
  129.  */
  130. struct mfcctl {
  131.     struct in_addr  mfcc_origin; /* ip origin of mcasts       */
  132.     struct in_addr  mfcc_mcastgrp;  /* multicast group associated*/
  133.     vifi_t     mfcc_parent;    /* incoming vif              */
  134.     u_char     mfcc_ttls[MAXVIFS];  /* forwarding ttls on vifs   */
  135. BOOL mfcc_notify;
  136. };
  137. /*
  138.  * The kernel's multicast routing statistics.
  139.  */
  140. struct mrtstat {
  141.     u_long mrts_mfc_lookups; /* # forw. cache hash table hits   */
  142.     u_long mrts_mfc_misses; /* # forw. cache hash table misses */
  143.     u_long mrts_upcalls; /* # calls to mrouted              */
  144.     u_long mrts_no_route; /* no route for packet's origin    */
  145.     u_long mrts_bad_tunnel; /* malformed tunnel options        */
  146.     u_long mrts_cant_tunnel; /* no room for tunnel options      */
  147.     u_long mrts_wrong_if; /* arrived on wrong interface    */
  148.     u_long mrts_upq_ovflw; /* upcall Q overflow    */
  149.     u_long mrts_cache_cleanups; /* # entries with no upcalls     */
  150.     u_long   mrts_drop_sel;      /* pkts dropped selectively        */
  151.     u_long   mrts_q_overflow;     /* pkts dropped - Q overflow       */
  152.     u_long   mrts_pkt2large;      /* pkts dropped - size > BKT SIZE  */
  153.     u_long mrts_upq_sockfull; /* upcalls dropped - socket full */
  154. };
  155. /*
  156.  * Argument structure used by mrouted to get src-grp pkt counts
  157.  */
  158. struct sioc_sg_req {
  159.     struct in_addr src;
  160.     struct in_addr grp;
  161.     u_long pktcnt;
  162.     u_long bytecnt;
  163.     u_long wrong_if;
  164. };
  165. /*
  166.  * Argument structure used by mrouted to get vif pkt counts
  167.  */
  168. struct sioc_vif_req {
  169.     vifi_t vifi; /* vif number */
  170.     u_long icount; /* Input packet count on vif */
  171.     u_long ocount; /* Output packet count on vif */
  172.     u_long ibytes; /* Input byte count on vif */
  173.     u_long obytes; /* Output byte count on vif */
  174. };
  175.     
  176. /*
  177.  * The kernel's virtual-interface structure.
  178.  */
  179. struct vif {
  180.     u_char    v_flags;      /* VIFF_ flags defined above         */
  181.     u_char    v_threshold; /* min ttl required to forward on vif*/
  182.     u_int       v_rate_limit;  /* max rate      */
  183.     struct tbf         *v_tbf;      /* token bucket structure at intf.   */
  184.     struct in_addr  v_lcl_addr;    /* local interface address           */
  185.     struct in_addr  v_rmt_addr;    /* remote address (tunnels only)     */
  186.     struct ifnet       *v_ifp;     /* pointer to interface              */
  187.     u_long v_pkt_in;         /* # pkts in on interface            */
  188.     u_long v_pkt_out;         /* # pkts out on interface           */
  189.     u_long v_bytes_in;         /* # bytes in on interface      */
  190.     u_long v_bytes_out;     /* # bytes out on interface      */
  191.     struct route v_route;     /* cached route if this is a tunnel */
  192. };
  193. /*
  194.  * The kernel's multicast forwarding cache entry structure 
  195.  * (A field for the type of service (mfc_tos) is to be added 
  196.  * at a future point)
  197.  */
  198. struct mfc {
  199.     struct in_addr  mfc_origin;   /* IP origin of mcasts   */
  200.     struct in_addr  mfc_mcastgrp;   /* multicast group associated*/
  201.     vifi_t     mfc_parent;      /* incoming vif              */
  202.     u_char     mfc_ttls[MAXVIFS];  /* forwarding ttls on vifs   */
  203.     u_long     mfc_pkt_cnt;     /* pkt count for src-grp     */
  204.     u_long     mfc_byte_cnt;     /* byte count for src-grp    */
  205.     u_long     mfc_wrong_if;     /* wrong if for src-grp      */
  206.     int     mfc_expire;     /* time to clean entry up    */
  207.     UINT  mfc_last_assert;             /* last time I sent an assert*/
  208.     struct rtdetq  *mfc_stall; /* q of packets awaiting mfc */
  209.     struct mfc     *mfc_next; /* next mfc entry            */
  210. /* below members were added in Net/3 port */
  211. struct mfc *mfc_next_g;             /* next group in same chain */
  212. struct mfc *mfc_root_rt;         /* 0,g entry in hash table*/
  213. BOOL mfc_notify;             /* notify overlying routing daemon */
  214. };
  215. /*
  216.  * Struct used to communicate from kernel to multicast router
  217.  * note the convenient similarity to an IP packet
  218.  */
  219. struct igmpmsg {
  220.     u_long     unused1;
  221.     u_long     unused2;
  222.     u_char     im_msgtype; /* what type of message     */
  223. #define IGMPMSG_NOCACHE 1
  224. #define IGMPMSG_WRONGVIF 2
  225.     u_char     im_mbz;     /* must be zero     */
  226.     u_char     im_vif;     /* vif rec'd on     */
  227.     u_char     unused3;
  228.     struct in_addr  im_src, im_dst;
  229. };
  230. /*
  231.  * Argument structure used for pkt info. while upcall is made
  232.  */
  233. struct rtdetq 
  234. {
  235.     struct mbuf  *m;     /* A copy of the packet     */
  236.     struct ifnet *ifp; /* Interface pkt came in on     */
  237.     vifi_t xmt_vif;     /* Saved copy of imo_multicast_vif  */
  238.     struct rtdetq *next; /* Next in list of packets          */
  239. };
  240. #define MFCTBLSIZ 256
  241. #if (MFCTBLSIZ & (MFCTBLSIZ - 1)) == 0   /* from sys:route.h */
  242. #define MFCHASHMOD(h) ((h) & (MFCTBLSIZ - 1))
  243. #else
  244. #define MFCHASHMOD(h) ((h) % MFCTBLSIZ)
  245. #endif
  246. #define MAX_UPQ 4         /* max. no of pkts in upcall Q */
  247. /*
  248.  * Token Bucket filter code 
  249.  */
  250. #define MAX_BKT_SIZE    10000   /* 10K bytes size  */
  251. #define MAXQSIZE        10      /* max # of pkts in queue  */
  252. /*
  253.  * the token bucket filter at each vif
  254.  */
  255. struct tbf
  256. {
  257.     UINT tbf_last_pkt_t; /* arr. time of last pkt  */
  258.     u_long tbf_n_tok;               /* no of tokens in bucket  */
  259.     u_long tbf_q_len;             /* length of queue at this vif */
  260.     u_long tbf_max_q_len;         /* max. queue length */
  261.     struct mbuf *tbf_q;         /* Packet queue */
  262.     struct mbuf *tbf_t;     /* tail-insertion pointer */
  263. };
  264. int ip_mrouter_cmd (int cmd, struct socket* so, struct mbuf* m) ;
  265. int ip_mforward (
  266.                  struct mbuf *,
  267.                  struct ifnet *, 
  268.                  struct ip *, 
  269.                  struct ip_moptions *
  270.                 );
  271. #if ((CPU_FAMILY==I960) && (defined __GNUC__))
  272. #pragma align 0                 /* turn off alignment requirement */
  273. #endif /* CPU_FAMILY==I960 */
  274. #ifdef __cplusplus
  275. }
  276. #endif
  277. #endif /* __INCip_mrouteh */