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

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. */
1.1.1.2 ! misho      52: #define RIP_MAX_RTE   ((RIP_PACKET_MAXSIZ - RIP_HEADER_SIZE) / RIP_RTE_SIZE)
1.1       misho      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: 
1.1.1.2 ! misho     146:   /* RIP ECMP flag */
        !           147:   unsigned int ecmp;
        !           148: 
1.1       misho     149:   /* For redistribute route map. */
                    150:   struct
                    151:   {
                    152:     char *name;
                    153:     struct route_map *map;
                    154:     int metric_config;
                    155:     u_int32_t metric;
                    156:   } route_map[ZEBRA_ROUTE_MAX];
                    157: };
                    158: 
                    159: /* RIP routing table entry which belong to rip_packet. */
                    160: struct rte
                    161: {
                    162:   u_int16_t family;            /* Address family of this route. */
                    163:   u_int16_t tag;               /* Route Tag which included in RIP2 packet. */
                    164:   struct in_addr prefix;       /* Prefix of rip route. */
                    165:   struct in_addr mask;         /* Netmask of rip route. */
                    166:   struct in_addr nexthop;      /* Next hop of rip route. */
                    167:   u_int32_t metric;            /* Metric value of rip route. */
                    168: };
                    169: 
                    170: /* RIP packet structure. */
                    171: struct rip_packet
                    172: {
                    173:   unsigned char command;       /* Command type of RIP packet. */
                    174:   unsigned char version;       /* RIP version which coming from peer. */
                    175:   unsigned char pad1;          /* Padding of RIP packet header. */
                    176:   unsigned char pad2;          /* Same as above. */
                    177:   struct rte rte[1];           /* Address structure. */
                    178: };
                    179: 
                    180: /* Buffer to read RIP packet. */
                    181: union rip_buf
                    182: {
                    183:   struct rip_packet rip_packet;
                    184:   char buf[RIP_PACKET_MAXSIZ];
                    185: };
                    186: 
                    187: /* RIP route information. */
                    188: struct rip_info
                    189: {
                    190:   /* This route's type. */
                    191:   int type;
                    192: 
                    193:   /* Sub type. */
                    194:   int sub_type;
                    195: 
                    196:   /* RIP nexthop. */
                    197:   struct in_addr nexthop;
                    198:   struct in_addr from;
                    199: 
                    200:   /* Which interface does this route come from. */
1.1.1.2 ! misho     201:   ifindex_t ifindex;
1.1       misho     202: 
                    203:   /* Metric of this route. */
                    204:   u_int32_t metric;
                    205: 
                    206:   /* External metric of this route. 
                    207:      if learnt from an externalm proto */
                    208:   u_int32_t external_metric;
                    209: 
                    210:   /* Tag information of this route. */
                    211:   u_int16_t tag;
                    212: 
                    213:   /* Flags of RIP route. */
                    214: #define RIP_RTF_FIB      1
                    215: #define RIP_RTF_CHANGED  2
                    216:   u_char flags;
                    217: 
                    218:   /* Garbage collect timer. */
                    219:   struct thread *t_timeout;
                    220:   struct thread *t_garbage_collect;
                    221: 
                    222:   /* Route-map futures - this variables can be changed. */
                    223:   struct in_addr nexthop_out;
                    224:   u_char metric_set;
                    225:   u_int32_t metric_out;
                    226:   u_short tag_out;
1.1.1.2 ! misho     227:   ifindex_t ifindex_out;
1.1       misho     228: 
                    229:   struct route_node *rp;
                    230: 
                    231:   u_char distance;
                    232: 
                    233: #ifdef NEW_RIP_TABLE
                    234:   struct rip_info *next;
                    235:   struct rip_info *prev;
                    236: #endif /* NEW_RIP_TABLE */
                    237: };
                    238: 
                    239: typedef enum {
                    240:   RIP_NO_SPLIT_HORIZON = 0,
                    241:   RIP_SPLIT_HORIZON,
                    242:   RIP_SPLIT_HORIZON_POISONED_REVERSE
                    243: } split_horizon_policy_t;
                    244: 
                    245: /* RIP specific interface configuration. */
                    246: struct rip_interface
                    247: {
                    248:   /* RIP is enabled on this interface. */
                    249:   int enable_network;
                    250:   int enable_interface;
                    251: 
                    252:   /* RIP is running on this interface. */
                    253:   int running;
                    254: 
                    255:   /* RIP version control. */
                    256:   int ri_send;
                    257:   int ri_receive;
                    258: 
                    259:   /* RIPv2 authentication type. */
                    260:   int auth_type;
                    261: 
                    262:   /* RIPv2 authentication string. */
                    263:   char *auth_str;
                    264: 
                    265:   /* RIPv2 authentication key chain. */
                    266:   char *key_chain;
                    267: 
                    268:   /* value to use for md5->auth_len */
                    269:   u_int8_t md5_auth_len;
                    270: 
                    271:   /* Split horizon flag. */
                    272:   split_horizon_policy_t split_horizon;
                    273:   split_horizon_policy_t split_horizon_default;
                    274: 
                    275:   /* For filter type slot. */
                    276: #define RIP_FILTER_IN  0
                    277: #define RIP_FILTER_OUT 1
                    278: #define RIP_FILTER_MAX 2
                    279: 
                    280:   /* Access-list. */
                    281:   struct access_list *list[RIP_FILTER_MAX];
                    282: 
                    283:   /* Prefix-list. */
                    284:   struct prefix_list *prefix[RIP_FILTER_MAX];
                    285: 
                    286:   /* Route-map. */
                    287:   struct route_map *routemap[RIP_FILTER_MAX];
                    288: 
                    289:   /* Wake up thread. */
                    290:   struct thread *t_wakeup;
                    291: 
                    292:   /* Interface statistics. */
                    293:   int recv_badpackets;
                    294:   int recv_badroutes;
                    295:   int sent_updates;
                    296: 
                    297:   /* Passive interface. */
                    298:   int passive;
                    299: };
                    300: 
                    301: /* RIP peer information. */
                    302: struct rip_peer
                    303: {
                    304:   /* Peer address. */
                    305:   struct in_addr addr;
                    306: 
                    307:   /* Peer RIP tag value. */
                    308:   int domain;
                    309: 
                    310:   /* Last update time. */
                    311:   time_t uptime;
                    312: 
                    313:   /* Peer RIP version. */
                    314:   u_char version;
                    315: 
                    316:   /* Statistics. */
                    317:   int recv_badpackets;
                    318:   int recv_badroutes;
                    319: 
                    320:   /* Timeout thread. */
                    321:   struct thread *t_timeout;
                    322: };
                    323: 
                    324: struct rip_md5_info
                    325: {
                    326:   u_int16_t family;
                    327:   u_int16_t type;
                    328:   u_int16_t packet_len;
                    329:   u_char keyid;
                    330:   u_char auth_len;
                    331:   u_int32_t sequence;
                    332:   u_int32_t reserv1;
                    333:   u_int32_t reserv2;
                    334: };
                    335: 
                    336: struct rip_md5_data
                    337: {
                    338:   u_int16_t family;
                    339:   u_int16_t type;
                    340:   u_char digest[16];
                    341: };
                    342: 
                    343: /* RIP accepet/announce methods. */
                    344: #define RI_RIP_UNSPEC                      0
                    345: #define RI_RIP_VERSION_1                   1
                    346: #define RI_RIP_VERSION_2                   2
                    347: #define RI_RIP_VERSION_1_AND_2             3
                    348: /* N.B. stuff will break if
                    349:        (RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
                    350: 
                    351: /* Default value for "default-metric" command. */
                    352: #define RIP_DEFAULT_METRIC_DEFAULT         1
                    353: 
                    354: /* RIP event. */
                    355: enum rip_event 
                    356: {
                    357:   RIP_READ,
                    358:   RIP_UPDATE_EVENT,
                    359:   RIP_TRIGGERED_UPDATE,
                    360: };
                    361: 
                    362: /* Macro for timer turn on. */
                    363: #define RIP_TIMER_ON(T,F,V) \
                    364:   do { \
                    365:     if (!(T)) \
                    366:       (T) = thread_add_timer (master, (F), rinfo, (V)); \
                    367:   } while (0)
                    368: 
                    369: /* Macro for timer turn off. */
                    370: #define RIP_TIMER_OFF(X) \
                    371:   do { \
                    372:     if (X) \
                    373:       { \
                    374:         thread_cancel (X); \
                    375:         (X) = NULL; \
                    376:       } \
                    377:   } while (0)
                    378: 
                    379: /* Prototypes. */
                    380: extern void rip_init (void);
                    381: extern void rip_reset (void);
                    382: extern void rip_clean (void);
                    383: extern void rip_clean_network (void);
                    384: extern void rip_interface_clean (void);
                    385: extern void rip_interface_reset (void);
                    386: extern void rip_passive_nondefault_clean (void);
                    387: extern void rip_if_init (void);
                    388: extern void rip_if_down_all (void);
                    389: extern void rip_route_map_init (void);
                    390: extern void rip_route_map_reset (void);
                    391: extern void rip_snmp_init (void);
1.1.1.2 ! misho     392: extern void rip_zclient_init (struct thread_master *);
1.1       misho     393: extern void rip_zclient_start (void);
                    394: extern void rip_zclient_reset (void);
                    395: extern void rip_offset_init (void);
                    396: extern int if_check_address (struct in_addr addr);
                    397: 
                    398: extern int rip_request_send (struct sockaddr_in *, struct interface *, u_char,
                    399:                       struct connected *);
                    400: extern int rip_neighbor_lookup (struct sockaddr_in *);
                    401: 
                    402: extern int rip_redistribute_check (int);
1.1.1.2 ! misho     403: extern void rip_redistribute_add (int, int, struct prefix_ipv4 *, ifindex_t, 
1.1       misho     404:                           struct in_addr *, unsigned int, unsigned char);
1.1.1.2 ! misho     405: extern void rip_redistribute_delete (int, int, struct prefix_ipv4 *, ifindex_t);
1.1       misho     406: extern void rip_redistribute_withdraw (int);
1.1.1.2 ! misho     407: extern void rip_zebra_ipv4_add (struct route_node *);
        !           408: extern void rip_zebra_ipv4_delete (struct route_node *);
1.1       misho     409: extern void rip_interface_multicast_set (int, struct connected *);
                    410: extern void rip_distribute_update_interface (struct interface *);
                    411: extern void rip_if_rmap_update_interface (struct interface *);
                    412: 
                    413: extern int config_write_rip_network (struct vty *, int);
                    414: extern int config_write_rip_offset_list (struct vty *);
                    415: extern int config_write_rip_redistribute (struct vty *, int);
                    416: 
                    417: extern void rip_peer_init (void);
                    418: extern void rip_peer_update (struct sockaddr_in *, u_char);
                    419: extern void rip_peer_bad_route (struct sockaddr_in *);
                    420: extern void rip_peer_bad_packet (struct sockaddr_in *);
                    421: extern void rip_peer_display (struct vty *);
                    422: extern struct rip_peer *rip_peer_lookup (struct in_addr *);
                    423: extern struct rip_peer *rip_peer_lookup_next (struct in_addr *);
                    424: 
                    425: extern int rip_offset_list_apply_in (struct prefix_ipv4 *, struct interface *, u_int32_t *);
                    426: extern int rip_offset_list_apply_out (struct prefix_ipv4 *, struct interface *, u_int32_t *);
                    427: extern void rip_offset_clean (void);
                    428: 
                    429: extern void rip_info_free (struct rip_info *);
                    430: extern u_char rip_distance_apply (struct rip_info *);
                    431: extern void rip_redistribute_clean (void);
                    432: extern void rip_ifaddr_add (struct interface *, struct connected *);
                    433: extern void rip_ifaddr_delete (struct interface *, struct connected *);
1.1.1.2 ! misho     434: 
        !           435: extern struct rip_info *rip_ecmp_add (struct rip_info *);
        !           436: extern struct rip_info *rip_ecmp_replace (struct rip_info *);
        !           437: extern struct rip_info *rip_ecmp_delete (struct rip_info *);
1.1       misho     438: 
                    439: /* There is only one rip strucutre. */
                    440: extern struct rip *rip;
                    441: 
                    442: /* Master thread strucutre. */
                    443: extern struct thread_master *master;
                    444: 
                    445: /* RIP statistics for SNMP. */
                    446: extern long rip_global_route_changes;
                    447: extern long rip_global_queries;
                    448: #endif /* _ZEBRA_RIP_H */

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