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>