Annotation of embedaddon/quagga/ripd/ripd.h, revision 1.1.1.1

1.1       misho       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>