File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ripd / ripd.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    1: /* RIP related values and structures.
    2:  * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
    3:  *
    4:  * This file is part of GNU Zebra.
    5:  *
    6:  * GNU Zebra is free software; you can redistribute it and/or modify it
    7:  * under the terms of the GNU General Public License as published by the
    8:  * Free Software Foundation; either version 2, or (at your option) any
    9:  * later version.
   10:  *
   11:  * GNU Zebra is distributed in the hope that it will be useful, but
   12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
   13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:  * General Public License for more details.
   15:  *
   16:  * You should have received a copy of the GNU General Public License
   17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
   18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   19:  * 02111-1307, USA.  
   20:  */
   21: 
   22: #ifndef _ZEBRA_RIP_H
   23: #define _ZEBRA_RIP_H
   24: 
   25: /* RIP version number. */
   26: #define RIPv1                            1
   27: #define RIPv2                            2
   28: /* N.B. stuff will break if
   29: 	(RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
   30: 
   31: 
   32: /* RIP command list. */
   33: #define RIP_REQUEST                      1
   34: #define RIP_RESPONSE                     2
   35: #define RIP_TRACEON                      3	/* Obsolete */
   36: #define RIP_TRACEOFF                     4	/* Obsolete */
   37: #define RIP_POLL                         5
   38: #define RIP_POLL_ENTRY                   6
   39: #define RIP_COMMAND_MAX                  7
   40: 
   41: /* RIP metric infinity value.*/
   42: #define RIP_METRIC_INFINITY             16
   43: 
   44: /* Normal RIP packet min and max size. */
   45: #define RIP_PACKET_MINSIZ                4
   46: #define RIP_PACKET_MAXSIZ              512
   47: 
   48: #define RIP_HEADER_SIZE                  4
   49: #define RIP_RTE_SIZE                    20
   50: 
   51: /* Max count of routing table entry in one rip packet. */
   52: #define RIP_MAX_RTE                     25
   53: 
   54: /* RIP version 2 multicast address. */
   55: #ifndef INADDR_RIP_GROUP
   56: #define INADDR_RIP_GROUP        0xe0000009    /* 224.0.0.9 */
   57: #endif
   58: 
   59: /* RIP timers */
   60: #define RIP_UPDATE_TIMER_DEFAULT        30
   61: #define RIP_TIMEOUT_TIMER_DEFAULT      180
   62: #define RIP_GARBAGE_TIMER_DEFAULT      120
   63: 
   64: /* RIP peer timeout value. */
   65: #define RIP_PEER_TIMER_DEFAULT         180
   66: 
   67: /* RIP port number. */
   68: #define RIP_PORT_DEFAULT               520
   69: #define RIP_VTY_PORT                  2602
   70: 
   71: /* Default configuration file name. */
   72: #define RIPD_DEFAULT_CONFIG    "ripd.conf"
   73: 
   74: /* RIP route types. */
   75: #define RIP_ROUTE_RTE                    0
   76: #define RIP_ROUTE_STATIC                 1
   77: #define RIP_ROUTE_DEFAULT                2
   78: #define RIP_ROUTE_REDISTRIBUTE           3
   79: #define RIP_ROUTE_INTERFACE              4
   80: 
   81: /* RIPv2 special RTE family types */
   82: #define RIP_FAMILY_AUTH                  0xffff
   83: 
   84: /* RIPv2 authentication types, for RIP_FAMILY_AUTH RTE's */
   85: #define RIP_NO_AUTH                0
   86: #define RIP_AUTH_DATA              1
   87: #define RIP_AUTH_SIMPLE_PASSWORD   2
   88: #define RIP_AUTH_MD5               3
   89: 
   90: /* RIPv2 Simple authentication */
   91: #define RIP_AUTH_SIMPLE_SIZE		16
   92: 
   93: /* RIPv2 MD5 authentication. */
   94: #define RIP_AUTH_MD5_SIZE               16
   95: #define RIP_AUTH_MD5_COMPAT_SIZE        RIP_RTE_SIZE
   96: 
   97: /* RIP structure. */
   98: struct rip 
   99: {
  100:   /* RIP socket. */
  101:   int sock;
  102: 
  103:   /* Default version of rip instance. */
  104:   int version_send;	/* version 1 or 2 (but not both) */
  105:   int version_recv;	/* version 1 or 2 or both */
  106: 
  107:   /* Output buffer of RIP. */
  108:   struct stream *obuf;
  109: 
  110:   /* RIP routing information base. */
  111:   struct route_table *table;
  112: 
  113:   /* RIP only static routing information. */
  114:   struct route_table *route;
  115:   
  116:   /* RIP neighbor. */
  117:   struct route_table *neighbor;
  118:   
  119:   /* RIP threads. */
  120:   struct thread *t_read;
  121: 
  122:   /* Update and garbage timer. */
  123:   struct thread *t_update;
  124: 
  125:   /* Triggered update hack. */
  126:   int trigger;
  127:   struct thread *t_triggered_update;
  128:   struct thread *t_triggered_interval;
  129: 
  130:   /* RIP timer values. */
  131:   unsigned long update_time;
  132:   unsigned long timeout_time;
  133:   unsigned long garbage_time;
  134: 
  135:   /* RIP default metric. */
  136:   int default_metric;
  137: 
  138:   /* RIP default-information originate. */
  139:   u_char default_information;
  140:   char *default_information_route_map;
  141: 
  142:   /* RIP default distance. */
  143:   u_char distance;
  144:   struct route_table *distance_table;
  145: 
  146:   /* For redistribute route map. */
  147:   struct
  148:   {
  149:     char *name;
  150:     struct route_map *map;
  151:     int metric_config;
  152:     u_int32_t metric;
  153:   } route_map[ZEBRA_ROUTE_MAX];
  154: };
  155: 
  156: /* RIP routing table entry which belong to rip_packet. */
  157: struct rte
  158: {
  159:   u_int16_t family;		/* Address family of this route. */
  160:   u_int16_t tag;		/* Route Tag which included in RIP2 packet. */
  161:   struct in_addr prefix;	/* Prefix of rip route. */
  162:   struct in_addr mask;		/* Netmask of rip route. */
  163:   struct in_addr nexthop;	/* Next hop of rip route. */
  164:   u_int32_t metric;		/* Metric value of rip route. */
  165: };
  166: 
  167: /* RIP packet structure. */
  168: struct rip_packet
  169: {
  170:   unsigned char command;	/* Command type of RIP packet. */
  171:   unsigned char version;	/* RIP version which coming from peer. */
  172:   unsigned char pad1;		/* Padding of RIP packet header. */
  173:   unsigned char pad2;		/* Same as above. */
  174:   struct rte rte[1];		/* Address structure. */
  175: };
  176: 
  177: /* Buffer to read RIP packet. */
  178: union rip_buf
  179: {
  180:   struct rip_packet rip_packet;
  181:   char buf[RIP_PACKET_MAXSIZ];
  182: };
  183: 
  184: /* RIP route information. */
  185: struct rip_info
  186: {
  187:   /* This route's type. */
  188:   int type;
  189: 
  190:   /* Sub type. */
  191:   int sub_type;
  192: 
  193:   /* RIP nexthop. */
  194:   struct in_addr nexthop;
  195:   struct in_addr from;
  196: 
  197:   /* Which interface does this route come from. */
  198:   unsigned int ifindex;
  199: 
  200:   /* Metric of this route. */
  201:   u_int32_t metric;
  202: 
  203:   /* External metric of this route. 
  204:      if learnt from an externalm proto */
  205:   u_int32_t external_metric;
  206: 
  207:   /* Tag information of this route. */
  208:   u_int16_t tag;
  209: 
  210:   /* Flags of RIP route. */
  211: #define RIP_RTF_FIB      1
  212: #define RIP_RTF_CHANGED  2
  213:   u_char flags;
  214: 
  215:   /* Garbage collect timer. */
  216:   struct thread *t_timeout;
  217:   struct thread *t_garbage_collect;
  218: 
  219:   /* Route-map futures - this variables can be changed. */
  220:   struct in_addr nexthop_out;
  221:   u_char metric_set;
  222:   u_int32_t metric_out;
  223:   u_short tag_out;
  224:   unsigned int ifindex_out;
  225: 
  226:   struct route_node *rp;
  227: 
  228:   u_char distance;
  229: 
  230: #ifdef NEW_RIP_TABLE
  231:   struct rip_info *next;
  232:   struct rip_info *prev;
  233: #endif /* NEW_RIP_TABLE */
  234: };
  235: 
  236: typedef enum {
  237:   RIP_NO_SPLIT_HORIZON = 0,
  238:   RIP_SPLIT_HORIZON,
  239:   RIP_SPLIT_HORIZON_POISONED_REVERSE
  240: } split_horizon_policy_t;
  241: 
  242: /* RIP specific interface configuration. */
  243: struct rip_interface
  244: {
  245:   /* RIP is enabled on this interface. */
  246:   int enable_network;
  247:   int enable_interface;
  248: 
  249:   /* RIP is running on this interface. */
  250:   int running;
  251: 
  252:   /* RIP version control. */
  253:   int ri_send;
  254:   int ri_receive;
  255: 
  256:   /* RIPv2 authentication type. */
  257:   int auth_type;
  258: 
  259:   /* RIPv2 authentication string. */
  260:   char *auth_str;
  261: 
  262:   /* RIPv2 authentication key chain. */
  263:   char *key_chain;
  264: 
  265:   /* value to use for md5->auth_len */
  266:   u_int8_t md5_auth_len;
  267: 
  268:   /* Split horizon flag. */
  269:   split_horizon_policy_t split_horizon;
  270:   split_horizon_policy_t split_horizon_default;
  271: 
  272:   /* For filter type slot. */
  273: #define RIP_FILTER_IN  0
  274: #define RIP_FILTER_OUT 1
  275: #define RIP_FILTER_MAX 2
  276: 
  277:   /* Access-list. */
  278:   struct access_list *list[RIP_FILTER_MAX];
  279: 
  280:   /* Prefix-list. */
  281:   struct prefix_list *prefix[RIP_FILTER_MAX];
  282: 
  283:   /* Route-map. */
  284:   struct route_map *routemap[RIP_FILTER_MAX];
  285: 
  286:   /* Wake up thread. */
  287:   struct thread *t_wakeup;
  288: 
  289:   /* Interface statistics. */
  290:   int recv_badpackets;
  291:   int recv_badroutes;
  292:   int sent_updates;
  293: 
  294:   /* Passive interface. */
  295:   int passive;
  296: };
  297: 
  298: /* RIP peer information. */
  299: struct rip_peer
  300: {
  301:   /* Peer address. */
  302:   struct in_addr addr;
  303: 
  304:   /* Peer RIP tag value. */
  305:   int domain;
  306: 
  307:   /* Last update time. */
  308:   time_t uptime;
  309: 
  310:   /* Peer RIP version. */
  311:   u_char version;
  312: 
  313:   /* Statistics. */
  314:   int recv_badpackets;
  315:   int recv_badroutes;
  316: 
  317:   /* Timeout thread. */
  318:   struct thread *t_timeout;
  319: };
  320: 
  321: struct rip_md5_info
  322: {
  323:   u_int16_t family;
  324:   u_int16_t type;
  325:   u_int16_t packet_len;
  326:   u_char keyid;
  327:   u_char auth_len;
  328:   u_int32_t sequence;
  329:   u_int32_t reserv1;
  330:   u_int32_t reserv2;
  331: };
  332: 
  333: struct rip_md5_data
  334: {
  335:   u_int16_t family;
  336:   u_int16_t type;
  337:   u_char digest[16];
  338: };
  339: 
  340: /* RIP accepet/announce methods. */
  341: #define RI_RIP_UNSPEC                      0
  342: #define RI_RIP_VERSION_1                   1
  343: #define RI_RIP_VERSION_2                   2
  344: #define RI_RIP_VERSION_1_AND_2             3
  345: /* N.B. stuff will break if
  346: 	(RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
  347: 
  348: /* Default value for "default-metric" command. */
  349: #define RIP_DEFAULT_METRIC_DEFAULT         1
  350: 
  351: /* RIP event. */
  352: enum rip_event 
  353: {
  354:   RIP_READ,
  355:   RIP_UPDATE_EVENT,
  356:   RIP_TRIGGERED_UPDATE,
  357: };
  358: 
  359: /* Macro for timer turn on. */
  360: #define RIP_TIMER_ON(T,F,V) \
  361:   do { \
  362:     if (!(T)) \
  363:       (T) = thread_add_timer (master, (F), rinfo, (V)); \
  364:   } while (0)
  365: 
  366: /* Macro for timer turn off. */
  367: #define RIP_TIMER_OFF(X) \
  368:   do { \
  369:     if (X) \
  370:       { \
  371:         thread_cancel (X); \
  372:         (X) = NULL; \
  373:       } \
  374:   } while (0)
  375: 
  376: /* Prototypes. */
  377: extern void rip_init (void);
  378: extern void rip_reset (void);
  379: extern void rip_clean (void);
  380: extern void rip_clean_network (void);
  381: extern void rip_interface_clean (void);
  382: extern void rip_interface_reset (void);
  383: extern void rip_passive_nondefault_clean (void);
  384: extern void rip_if_init (void);
  385: extern void rip_if_down_all (void);
  386: extern void rip_route_map_init (void);
  387: extern void rip_route_map_reset (void);
  388: extern void rip_snmp_init (void);
  389: extern void rip_zclient_init (void);
  390: extern void rip_zclient_start (void);
  391: extern void rip_zclient_reset (void);
  392: extern void rip_offset_init (void);
  393: extern int if_check_address (struct in_addr addr);
  394: 
  395: extern int rip_request_send (struct sockaddr_in *, struct interface *, u_char,
  396:                       struct connected *);
  397: extern int rip_neighbor_lookup (struct sockaddr_in *);
  398: 
  399: extern int rip_redistribute_check (int);
  400: extern void rip_redistribute_add (int, int, struct prefix_ipv4 *, unsigned int, 
  401: 			   struct in_addr *, unsigned int, unsigned char);
  402: extern void rip_redistribute_delete (int, int, struct prefix_ipv4 *, unsigned int);
  403: extern void rip_redistribute_withdraw (int);
  404: extern void rip_zebra_ipv4_add (struct prefix_ipv4 *, struct in_addr *, u_int32_t, u_char);
  405: extern void rip_zebra_ipv4_delete (struct prefix_ipv4 *, struct in_addr *, u_int32_t);
  406: extern void rip_interface_multicast_set (int, struct connected *);
  407: extern void rip_distribute_update_interface (struct interface *);
  408: extern void rip_if_rmap_update_interface (struct interface *);
  409: 
  410: extern int config_write_rip_network (struct vty *, int);
  411: extern int config_write_rip_offset_list (struct vty *);
  412: extern int config_write_rip_redistribute (struct vty *, int);
  413: 
  414: extern void rip_peer_init (void);
  415: extern void rip_peer_update (struct sockaddr_in *, u_char);
  416: extern void rip_peer_bad_route (struct sockaddr_in *);
  417: extern void rip_peer_bad_packet (struct sockaddr_in *);
  418: extern void rip_peer_display (struct vty *);
  419: extern struct rip_peer *rip_peer_lookup (struct in_addr *);
  420: extern struct rip_peer *rip_peer_lookup_next (struct in_addr *);
  421: 
  422: extern int rip_offset_list_apply_in (struct prefix_ipv4 *, struct interface *, u_int32_t *);
  423: extern int rip_offset_list_apply_out (struct prefix_ipv4 *, struct interface *, u_int32_t *);
  424: extern void rip_offset_clean (void);
  425: 
  426: extern void rip_info_free (struct rip_info *);
  427: extern u_char rip_distance_apply (struct rip_info *);
  428: extern void rip_redistribute_clean (void);
  429: extern void rip_ifaddr_add (struct interface *, struct connected *);
  430: extern void rip_ifaddr_delete (struct interface *, struct connected *);
  431: 
  432: /* There is only one rip strucutre. */
  433: extern struct rip *rip;
  434: 
  435: /* Master thread strucutre. */
  436: extern struct thread_master *master;
  437: 
  438: /* RIP statistics for SNMP. */
  439: extern long rip_global_route_changes;
  440: extern long rip_global_queries;
  441: #endif /* _ZEBRA_RIP_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>