Annotation of embedaddon/quagga/ripd/ripd.h, revision 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>