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

VxWorks

开发平台:

C/C++

  1. /* routeEnhLib.h - definitions for the route interface library */
  2. /* Copyright 1984 - 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01u,24jan02,niq  fixed call to new address message hook (SPR #71670)
  7. 01t,10sep01,niq  Make RIP work on host stack - SPR 70188
  8. 01s,03aug01,spm  added flag to prevent incorrect interface reference count
  9. 01r,31jul01,spm  fixed return type of callback handler to remove warning
  10. 01q,27jul01,spm  removed unused handle from add and delete routines
  11. 01p,27jul01,spm  updated registration process (WRN 1012 design, sec. 2.2.3)
  12. 01o,25jul01,spm  added routine to reorganize any duplicate routes after
  13.                  weight change with routing sockets 
  14. 01n,25jul01,spm  added new messages to report replacement of the primary route
  15. 01m,23jul01,niq  Add the prototype for routeTableWalk and removed the 
  16.                  Fastpath kludge.
  17. 01l,22jun01,spm  moved additional metric values to provide access with
  18.                  routing sockets; added renamed route classification flag
  19.                  to descriptor structure for callback routines
  20. 01m,25jun01,spm  adding new socket messages.
  21. 01l,25jun01,spm  added include file for RT_PROTO_SET/GET macro definitions
  22. 01k,19jun01,spm  added routing socket messages (WRN 1012 design, sec. 2.2.7.1);
  23.                  removed unused registration handle
  24. 01j,19jun01,spm  cleanup: removed excess typecast from macro
  25. 01i,12jun01,niq  Add the routeAgeSet routine prototype
  26. 01h,09jun01,spm  added route weights (WRN 1012 design, section 2.3.6)
  27. 01g,10may01,spm  added new route lookup routine
  28. 01f,03may01,niq  Remove ROUTE_MOD stuff. Use ROUTE_CHANGE instead
  29. 01e,02may01,niq  Correcting mod history
  30. 01d,01may01,niq  Adding definition of ROUTE_MOD needed by Fastpath
  31. 01c,01may01,niq  Merging Fastpath changes from tor2_0.open_stack branch
  32.                  version 01h (routeEnhLib.h@@/main/tor2_0.open_stack/7)
  33. 01b,01may01,spm  added routing socket messages for unified interface
  34. 01a,29mar01,spm  file creation: copied from version 01f of tor2_0.open_stack
  35.                  branch (wpwr VOB) for unified code base
  36. */
  37. /*
  38. DESCRIPTION
  39. This file includes function prototypes for the routing interface, as well as the
  40. route entry structures.
  41. */
  42. #ifndef _INCrouteEnhLibh
  43. #define _INCrouteEnhLibh
  44. #ifdef __cplusplus
  45. extern "C" {
  46. #endif
  47. #include "net/socketvar.h"
  48. #include "net/radix.h"
  49. #include "net/mbuf.h"
  50. #include "sys/socket.h"    /* needed for route.h */
  51. #include "net/route.h"
  52. #include "netinet/in.h"    /* RT_PROTO_SET and RT_PROTO_GET */
  53. #include "m2Lib.h"
  54. #define MAX_ROUTE_PROTO 20
  55. /* routeTag values  understood by routing protocols */
  56. #define RFC1745_DEFAULT_ROUTE_TAG 0x0000 /* manual/default route */
  57. #define RFC1745_CONF_EXTERNAL_ROUTE_TAG 0x8000 /* configured external routes
  58. * IP static to OSPF and BGP 
  59. */
  60. #define RFC1745_EGP_ORIGEGP_ROUTE_TAG 0x9000 /* BGP routes reached via OSPF */
  61. #define RFC1745_STUB_ASBR_BGP_ROUTE_TAG 0xa000 /* BGP routes at ASBR to STUB AS */
  62. #define RFC1745_IGP_TO_OSPF_ROUTE_TAG 0xc000   /* IGP dynamic routes */
  63. #define RFC1745_EGP_ORIGIGP_ROUTE_TAG_PER_AS 0xd000 /* BGP routes with orig IGP,
  64.       * next hop AS
  65.       */
  66. #define RFC1745_BGP_TO_OSPF_ROUTE_TAG 0xe000 /* BGP origin */
  67. /* Operations performed */
  68. #define ROUTE_ADD 1
  69. #define ROUTE_DEL 2
  70. #define ROUTE_CHANGE 3
  71. #define ROUTE_IF_UP 4
  72. #define ROUTE_IF_DOWN 5
  73. #define ROUTE_IF_NEWADDR 6
  74. #define ROUTE_IF_DELADDR 7
  75. #define ROUTE_CACHE_RESET 8
  76. #define ROUTE_MISS 9    /* internal operation only: not published message */
  77. #define ROUTE_CLONE_FAIL 10
  78. #define ROUTE_SEARCH_FAIL 11
  79. #define ROUTE_GATEWAY_CHANGE 12
  80. #define ROUTE_OLD 13
  81. #define ROUTE_NEW 14
  82. /* special case, when route is not deleted during routeEntryDel() */
  83. #define ROUTE_NOT_DELETED 0
  84. /* 
  85.  * Kernel routing table entry
  86.  *
  87.  * The routeEntry structure is an extension to the rtentry structure defined in
  88.  * route.h. The extension is to support some addtional members defined in RFC 1213
  89.  * and multiple route entries by the same/different routing protocols.
  90.  *
  91.  * Since routeEntry is an extension of rtentry and currently rtrequest() is the only 
  92.  * place where rtentry structure is allocated, the modification for allocating 
  93.  * routeEntry instead of rtentry is binary backward backward compatible.
  94.  *
  95.  */
  96. typedef struct routeNode 
  97.     {
  98.     struct routeEntry* pFrwd;    /* forward pointer : for list traversal */
  99.     struct routeEntry* pBack;    /* backward pointer : for list traversal */
  100.     } ROUTE_NODE;
  101. typedef struct routeEntry 
  102.     {
  103.     struct rtentry rtEntry;     /* defined in net/route.h */
  104.     BOOL primaryRouteFlag;      /* IP forwarding route or alternate? */
  105.     ROUTE_NODE  sameNode;       /*  reference to multiple route entries 
  106.          *  for the same destination added by 
  107.          *  the same routing protocol. 
  108.          */
  109.     ROUTE_NODE  diffNode;       /*  reference to multiple route entries
  110.          *  for the same destination added by
  111.          *  different routing protocols.
  112.          */
  113.     } ROUTE_ENTRY;
  114. /* Macros to access the fields of ROUTE_ENTRY */
  115.  
  116. #define ROUTE_ENTRY_KEY(r) ((struct sockaddr *)(((r)->rtEntry) 
  117.        .rt_nodes[0].rn_u.rn_leaf.rn_Key))
  118.  
  119. #define ROUTE_ENTRY_MASK(r) ((struct sockaddr *)(((r)->rtEntry) 
  120.        .rt_nodes[0].rn_u.rn_leaf.rn_Mask))
  121.  
  122.  
  123. #define ROUTE_ENTRY_GATEWAY(r) ((r)->rtEntry.rt_gateway)
  124. #define ROUTE_ENTRY_FLAGS(r) ((r)->rtEntry.rt_flags)
  125. /* Route description structure
  126.  *
  127.  * This structure contains all the route information that needs to be stored and
  128.  * and retrived from the routing table. This structure is provided by the 
  129.  * routing protocol, while adding (routeEntryADd()) or 
  130.  * searching (routeEntryLookup()) a route.
  131.  * When the lookup routine is called, searching for a specific route, the
  132.  * looked-up routing information is copied on to the following structure.
  133.  * The lookup routine is usually called by the routing protocol to figure out the
  134.  * interface to be used for a particular gateway.
  135.  * IP forwarding uses the internal BSD API and has direct access to ROUTE_ENTRY
  136.  * structure.
  137.  * 
  138.  */
  139. typedef struct routeDesc
  140.     {
  141.     struct sockaddr* pDstAddr; /* destination network/host address */
  142.     struct sockaddr* pNetmask; /* network mask */
  143.     struct sockaddr* pGateway; /* gateway address */
  144.     short flags;               /* up/down, host/net? defined in /h/net/route.h */
  145.     short protoId;             /* routing protocol ID: m2Lib.h */
  146.     struct ifnet* pIf;         /* interface to be used with this route, set to 
  147.                                 * NULL for routeEntryAdd().
  148.                                 */
  149.     long value1;               /* metrics as defined by RFC 1213 */
  150.     long value2;
  151.     long value3;
  152.     long value4;
  153.     long value5;
  154.     long routeTag;             /* property associated with the route, values are
  155. * described above 
  156. */ 
  157.     u_char weight;
  158.     /* Read-only settings: valid in received messages */
  159.     BOOL primaryRouteFlag;     /* IP forwarding route or alternate? */
  160.     void *pData;               /* additional message data, based on type */
  161.     } ROUTE_DESC;
  162. /* routing system registration structure: see routeStorageBind() routine */
  163. typedef struct routeBind
  164.     {
  165.     NODE    node;     /* internal connection for linked list */
  166.     void (*pRouteMsgRtn) (int type, ROUTE_DESC *pDesc, void *pArg);
  167.     void *  pArg;
  168.     } ROUTE_BINDING;
  169. /* Routing Interface APIs */
  170. /* Initialization */
  171. IMPORT STATUS routeIntInit();
  172. /* Modification APIs */
  173. IMPORT STATUS routeEntryAdd (ROUTE_DESC * pRouteDesc);
  174. IMPORT STATUS routeEntryDel (ROUTE_DESC* pRouteDesc);
  175. IMPORT STATUS routeAgeSet (struct sockaddr *, struct sockaddr *, int, int);
  176. IMPORT STATUS routeMetricSet (struct sockaddr *, struct sockaddr *, int, int);
  177. /* Route lookup */
  178. IMPORT STATUS routeEntryLookup (struct sockaddr *, ULONG *, int,
  179. ROUTE_DESC *);
  180. IMPORT STATUS routeTableWalk (struct sockaddr *, int, VOIDFUNCPTR, void *);
  181. /* Registration routines */
  182. IMPORT void * routeStorageBind (void (*)(int, ROUTE_DESC *, void *), void *);
  183. IMPORT STATUS routeStorageUnbind (void *); 
  184. /* externs */
  185. IMPORT STATUS rtrequestAddEqui (struct sockaddr *, struct sockaddr *,
  186.                                 struct sockaddr *, short, short, UCHAR,
  187.                                 BOOL, BOOL, ROUTE_ENTRY **);
  188. IMPORT STATUS rtrequestDelEqui (struct sockaddr *, struct sockaddr *,
  189.                                 struct sockaddr *, short, short,
  190.                                 BOOL, BOOL, ROUTE_ENTRY **);
  191. IMPORT void routeWeightUpdate (ROUTE_ENTRY *, short, ROUTE_ENTRY *,
  192.                                struct sockaddr *, UCHAR);
  193. IMPORT void routeEntryFree (ROUTE_ENTRY *, BOOL);
  194. IMPORT STATUS routeProtoShow();
  195. /* Interfaces for internal stack events */
  196. extern void (*rtIfaceMsgHook) (struct ifnet *);
  197. extern void (*rtMissMsgHook) (int, struct rt_addrinfo *, int, int); 
  198. #ifdef ROUTER_STACK
  199. extern void (*rtNewAddrMsgHook) (int, struct ifaddr *, struct rtentry *);
  200. #else
  201. extern void (*rtNewAddrMsgHook) (int, struct ifaddr *, int, struct rtentry *);
  202. #endif /* ROUTER_STACK */
  203. #ifdef _cplusplus
  204. }
  205. #endif
  206. #endif /* _INCrouteEnhLibh */