ripngd.h
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:7k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * RIPng related value and structure.
  3.  * Copyright (C) 1998 Kunihiro Ishiguro
  4.  *
  5.  * This file is part of GNU Zebra.
  6.  *
  7.  * GNU Zebra is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  *
  12.  * GNU Zebra is distributed in the hope that it will be useful, but
  13.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15.  * General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  20.  * 02111-1307, USA.  
  21.  */
  22. #ifndef _ZEBRA_RIPNG_RIPNGD_H
  23. #define _ZEBRA_RIPNG_RIPNGD_H
  24. /* RIPng version and port number. */
  25. #define RIPNG_V1                         1
  26. #define RIPNG_PORT_DEFAULT             521
  27. #define RIPNG_VTY_PORT                2603
  28. #define RIPNG_VTYSH_PATH              "/tmp/.ripngd"
  29. #define RIPNG_MAX_PACKET_SIZE         1500
  30. #define RIPNG_PRIORITY_DEFAULT           0
  31. /* RIPng commands. */
  32. #define RIPNG_REQUEST                    1
  33. #define RIPNG_RESPONSE                   2
  34. /* RIPng metric and multicast group address. */
  35. #define RIPNG_METRIC_INFINITY           16
  36. #define RIPNG_METRIC_NEXTHOP          0xff
  37. #define RIPNG_GROUP              "ff02::9"
  38. /* RIPng timers. */
  39. #define RIPNG_UPDATE_TIMER_DEFAULT      30
  40. #define RIPNG_TIMEOUT_TIMER_DEFAULT    180
  41. #define RIPNG_GARBAGE_TIMER_DEFAULT    120
  42. /* Default config file name. */
  43. #define RIPNG_DEFAULT_CONFIG "ripngd.conf"
  44. /* RIPng route types. */
  45. #define RIPNG_ROUTE_RTE                  0
  46. #define RIPNG_ROUTE_STATIC               1
  47. #define RIPNG_ROUTE_AGGREGATE            2
  48. /* Interface send/receive configuration. */
  49. #define RIPNG_SEND_UNSPEC                0
  50. #define RIPNG_SEND_OFF                   1
  51. #define RIPNG_RECEIVE_UNSPEC             0
  52. #define RIPNG_RECEIVE_OFF                1
  53. /* Split horizon definitions. */
  54. #define RIPNG_SPLIT_HORIZON_UNSPEC       0
  55. #define RIPNG_SPLIT_HORIZON_NONE         1
  56. #define RIPNG_SPLIT_HORIZON              2
  57. #define RIPNG_SPLIT_HORIZON_POISONED     3
  58. /* RIP default route's accept/announce methods. */
  59. #define RIPNG_DEFAULT_ADVERTISE_UNSPEC   0
  60. #define RIPNG_DEFAULT_ADVERTISE_NONE     1
  61. #define RIPNG_DEFAULT_ADVERTISE          2
  62. #define RIPNG_DEFAULT_ACCEPT_UNSPEC      0
  63. #define RIPNG_DEFAULT_ACCEPT_NONE        1
  64. #define RIPNG_DEFAULT_ACCEPT             2
  65. /* Default value for "default-metric" command. */
  66. #define RIPNG_DEFAULT_METRIC_DEFAULT     1
  67. /* For max RTE calculation. */
  68. #ifndef IPV6_HDRLEN
  69. #define IPV6_HDRLEN 40
  70. #endif /* IPV6_HDRLEN */
  71. #ifndef IFMINMTU
  72. #define IFMINMTU    576
  73. #endif /* IFMINMTU */
  74. /* RIPng structure. */
  75. struct ripng 
  76. {
  77.   /* RIPng socket. */
  78.   int sock;
  79.   /* RIPng Parameters.*/
  80.   u_char command;
  81.   u_char version;
  82.   unsigned long update_time;
  83.   unsigned long timeout_time;
  84.   unsigned long garbage_time;
  85.   int max_mtu;
  86.   int default_metric;
  87.   int default_information;
  88.   /* Input/output buffer of RIPng. */
  89.   struct stream *ibuf;
  90.   struct stream *obuf;
  91.   /* RIPng routing information base. */
  92.   struct route_table *table;
  93.   /* RIPng only static route information. */
  94.   struct route_table *route;
  95.   /* RIPng aggregate route information. */
  96.   struct route_table *aggregate;
  97.   /* RIPng threads. */
  98.   struct thread *t_read;
  99.   struct thread *t_write;
  100.   struct thread *t_update;
  101.   struct thread *t_garbage;
  102.   struct thread *t_zebra;
  103.   /* Triggered update hack. */
  104.   int trigger;
  105.   struct thread *t_triggered_update;
  106.   struct thread *t_triggered_interval;
  107.   /* For redistribute route map. */
  108.   struct
  109.   {
  110.     char *name;
  111.     struct route_map *map;
  112.     int metric_config;
  113.     u_int32_t metric;
  114.   } route_map[ZEBRA_ROUTE_MAX];
  115. };
  116. /* Routing table entry. */
  117. struct rte
  118. {
  119.   struct in6_addr addr;
  120.   u_short tag;
  121.   u_char prefixlen;
  122.   u_char metric;
  123. };
  124. /* RIPNG send packet. */
  125. struct ripng_packet
  126. {
  127.   u_char command;
  128.   u_char version;
  129.   u_int16_t zero; 
  130.   struct rte rte[1];
  131. };
  132. /* Each route's information. */
  133. struct ripng_info
  134. {
  135.   /* This route's type.  Static, ripng or aggregate. */
  136.   u_char type;
  137.   /* Sub type for static route. */
  138.   u_char sub_type;
  139.   /* RIPng specific information */
  140.   struct in6_addr nexthop;
  141.   struct in6_addr from;
  142.   /* Which interface does this route come from. */
  143.   unsigned int ifindex;
  144.   /* Metric of this route.  */
  145.   u_char metric;
  146.   /* Tag field of RIPng packet.*/
  147.   u_int16_t tag;
  148.   /* For aggregation. */
  149.   unsigned int suppress;
  150.   /* Flags of RIPng route. */
  151. #define RIPNG_RTF_FIB      1
  152. #define RIPNG_RTF_CHANGED  2
  153.   u_char flags;
  154.   /* Garbage collect timer. */
  155.   struct thread *t_timeout;
  156.   struct thread *t_garbage_collect;
  157.   /* Route-map features - this variables can be changed. */
  158.   u_char metric_set;
  159.   struct route_node *rp;
  160. };
  161. /* RIPng tag structure. */
  162. struct ripng_tag
  163. {
  164.   /* Tag value. */
  165.   u_int16_t tag;
  166.   /* Port. */
  167.   u_int16_t port;
  168.   /* Multicast group. */
  169.   struct in6_addr maddr;
  170.   /* Table number. */
  171.   int table;
  172.   /* Distance. */
  173.   int distance;
  174.   /* Split horizon. */
  175.   u_char split_horizon;
  176.   /* Poison reverse. */
  177.   u_char poison_reverse;
  178. };
  179. /* RIPng specific interface configuration. */
  180. struct ripng_interface
  181. {
  182.   /* RIPng is enabled on this interface. */
  183.   int enable_network;
  184.   int enable_interface;
  185.   /* RIPng is running on this interface. */
  186.   int running;
  187.   /* For filter type slot. */
  188. #define RIPNG_FILTER_IN  0
  189. #define RIPNG_FILTER_OUT 1
  190. #define RIPNG_FILTER_MAX 2
  191.   /* Access-list. */
  192.   struct access_list *list[RIPNG_FILTER_MAX];
  193.   /* Prefix-list. */
  194.   struct prefix_list *prefix[RIPNG_FILTER_MAX];
  195.   /* Route-map. */
  196.   struct route_map *routemap[RIPNG_FILTER_MAX];
  197.   /* RIPng tag configuration. */
  198.   struct ripng_tag *rtag;
  199.   /* Default information originate. */
  200.   u_char default_originate;
  201.   /* Default information only. */
  202.   u_char default_only;
  203.   /* Wake up thread. */
  204.   struct thread *t_wakeup;
  205.   /* Passive interface. */
  206.   int passive;
  207. };
  208. /* All RIPng events. */
  209. enum ripng_event
  210. {
  211.   RIPNG_READ,
  212.   RIPNG_ZEBRA,
  213.   RIPNG_REQUEST_EVENT,
  214.   RIPNG_UPDATE_EVENT,
  215.   RIPNG_TRIGGERED_UPDATE,
  216. };
  217. /* RIPng timer on/off macro. */
  218. #define RIPNG_TIMER_ON(T,F,V) 
  219. do { 
  220.    if (!(T)) 
  221.       (T) = thread_add_timer (master, (F), rinfo, (V)); 
  222. } while (0)
  223. #define RIPNG_TIMER_OFF(T) 
  224. do { 
  225.    if (T) 
  226.      { 
  227.        thread_cancel(T); 
  228.        (T) = NULL; 
  229.      } 
  230. } while (0)
  231. /* Count prefix size from mask length */
  232. #define PSIZE(a) (((a) + 7) / (8))
  233. /* Extern variables. */
  234. extern struct ripng *ripng;
  235. extern struct thread_master *master;
  236. /* Prototypes. */
  237. void ripng_init ();
  238. void ripng_if_init ();
  239. void ripng_terminate ();
  240. void ripng_zclient_start ();
  241. void zebra_init ();
  242. struct ripng_info * ripng_info_new ();
  243. void ripng_info_free (struct ripng_info *rinfo);
  244. void ripng_event (enum ripng_event, int);
  245. int ripng_request (struct interface *ifp);
  246. void ripng_redistribute_add (int, int, struct prefix_ipv6 *, unsigned int);
  247. void ripng_redistribute_delete (int, int, struct prefix_ipv6 *, unsigned int);
  248. void ripng_redistribute_withdraw (int type);
  249. void ripng_distribute_update_interface (struct interface *);
  250. void ripng_if_rmap_update_interface (struct interface *);
  251. void ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop, unsigned int ifindex);
  252. void ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop, unsigned int ifindex);
  253. void ripng_route_map_init ();
  254. #endif /* _ZEBRA_RIPNG_RIPNGD_H */