This is bgp.h in view mode; [Download] [Up]
/* * $Header: /disk/d/src/devel/gated/dist/src/RCS/bgp.h,v 2.1 92/02/24 14:12:24 jch Exp $ */ /*%Copyright%*/ /************************************************************************ * * * GateD, Release 2 * * * * Copyright (c) 1990,1991,1992 by Cornell University * * All rights reserved. * * * * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY * * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT * * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY * * AND FITNESS FOR A PARTICULAR PURPOSE. * * * * Royalty-free licenses to redistribute GateD Release * * 2 in whole or in part may be obtained by writing to: * * * * GateDaemon Project * * Information Technologies/Network Resources * * 143 Caldwell Hall * * Cornell University * * Ithaca, NY 14853-2602 * * * * GateD is based on Kirton's EGP, UC Berkeley's routing * * daemon (routed), and DCN's HELLO routing Protocol. * * Development of Release 2 has been supported by the * * National Science Foundation. * * * * Please forward bug fixes, enhancements and questions to the * * gated mailing list: gated-people@gated.cornell.edu. * * * * Authors: * * * * Jeffrey C Honig <jch@gated.cornell.edu> * * Scott W Brim <swb@gated.cornell.edu> * * * ************************************************************************* * * * Portions of this software may fall under the following * * copyrights: * * * * Copyright (c) 1988 Regents of the University of California. * * All rights reserved. * * * * Redistribution and use in source and binary forms are * * permitted provided that the above copyright notice and * * this paragraph are duplicated in all such forms and that * * any documentation, advertising materials, and other * * materials related to such distribution and use * * acknowledge that the software was developed by the * * University of California, Berkeley. The name of the * * University may not be used to endorse or promote * * products derived from this software without specific * * prior written permission. THIS SOFTWARE IS PROVIDED * * ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, * * INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * * ************************************************************************/ #ifdef PROTO_BGP #define IPPROTO_BGP 179 #define BGPMAXPACKETSIZE 1024 #define BGPUPDATEMAXNETS 167 /* Maximum number of networks in an Update */ #define BGP_VERSION 1 /* BGP version number */ #define BGP_WAIT_RETRY 60 /* How often to retry a connect (must be greater than kernel timeout) */ #define BGP_ABORT_OPEN 60 /* Abort timer on open */ #define BGP_CLOSE_TIMER 45 /* Value to linger on close - */ /* must be smaller than */ /* BGP_IDLE_SHORT */ #define BGP_KEEP_ALIVE 180 /* How often we send keepalives */ #define BGP_FLASH_INTERVAL 15 /* Minimum number of seconds between flash updates */ /* Various values of times to wait in Idle state before going back to Active */ #define BGP_IDLE_INIT 15 /* Give gated 15 seconds to stabilize before starting */ #define BGP_IDLE_SHORT 60 /* Wait time for minor errors */ #define BGP_IDLE_MED 600 /* 10 minutes for some errors */ #define BGP_IDLE_FATAL 15*60 /* 15 minute wait for fatal errors */ typedef struct { u_char asDirection; u_char asNumber[2]; } asPair; typedef struct { u_char asCount; asPair asPair[1]; } asPath; #define asDirUp 1 /* Route has gone up in graph */ #define asDirDown 2 /* Route has gone down in graph */ #define asDirHorizontal 3 /* Route has gone horizontally in graph */ #define asDirEgp 4 /* Route was learned via EGP */ #define asDirIncomplete 5 /* ASpath is incomplete */ #define asDirMax asDirIncomplete /* Used to check for valid bits */ typedef struct { u_char netNetwork[4]; u_char netMetric[2]; } netPair; #define bgpMetricInfinity 0xffff /* Metric of infinity */ typedef struct { u_char netCount[2]; netPair netPair[1]; } netEntry; typedef struct { /* Update header */ u_char gateway[4]; asPath asPath; netEntry netEntry; } updatePdu; #define updatePduMinSize 16 typedef struct { /* Open Header */ as_t openAs; u_char openLinkType; u_char openAuthCode; u_char openAuthData[2]; } openPdu; #define openLinkInternal 0 /* Peer is in same AS */ #define openLinkUp 1 /* Peer is higher in AS hierachy */ #define openLinkDown 2 /* Peer is lower in AS hierachy */ #define openLinkHorizontal 3 /* Peer is as same level */ #define openLinkMax 3 /* Maximum value */ typedef struct { u_short notifyCode; u_char notifyData[2]; u_char notifyPacket[2]; /* Returned packet */ } notifyPdu; #define BGPERRCD_LINKTYPE 1 /* Link type error */ #define BGPERRCD_AUTHCODE 2 /* Unknown Authentication code */ #define BGPERRCD_AUTHFAIL 3 /* Authentication failure */ #define BGPERRCD_UPDATE 4 /* Update error */ #define BGPERRCD_SYNC 5 /* Connection out of sync */ #define BGPERRCD_MSGLEN 6 /* Invalid message length */ #define BGPERRCD_MSGTYPE 7 /* Invalid message type */ #define BGPERRCD_VERSION 8 /* Invalid version number */ #define BGPERRCD_OPENAS 9 /* Invalid AS field in Open */ #define BGPERRCD_CEASE 10 /* Connection closing gracefully */ #define BGPERRCD_MAX 10 /* Maximum error code */ #define BGPERRLEN_LINKTYPE 1 /* Open byte of proper link type */ #define BGPERRLEN_AUTHCODE 0 /* No data */ #define BGPERRLEN_AUTHFAIL 0 /* No data */ #define BGPERRLEN_UPDATE 2 /* Two bytes of subcode followed by Update PDU */ #define BGPERRLEN_SYNC 0 /* No data */ #define BGPERRLEN_MSGLEN 2 /* Two bytes of message length */ #define BGPERRLEN_MSGTYPE 1 /* One byte of message type */ #define BGPERRLEN_VERSION 1 /* One byte of version */ #define BGPERRLEN_OPENAS 0 /* No data */ #define BGPUPDERR_ASCOUNT 1 /* Invalid AS count */ #define BGPUPDERR_DIRECTION 2 /* Invalid Direction field */ #define BGPUPDERR_AS 3 /* Invalid AS field */ #define BGPUPDERR_ORDER 4 /* EGP_LINK or INCOMPLETE_LINK type at other than end of AS path */ #define BGPUPDERR_LOOP 5 /* Routing loop detected */ #define BGPUPDERR_GATEWAY 6 /* Invalid Gateway field */ #define BGPUPDERR_NETCOUNT 7 /* Invalid Net Count field */ #define BGPUPDERR_NETWORK 8 /* Invalid Network field */ #define BGPUPDERR_MAX 8 typedef struct { /* Common BGP header */ u_short marker; u_short length; u_char version; u_char type; u_short holdTime; } pduHeader; #define bgpMarker 0xffff /* Marker field */ #define bgpVersion 1 /* Version we support */ #define bgpPduOpen 1 /* Open packet */ #define bgpPduUpdate 2 /* Update packet */ #define bgpPduNotify 3 /* Notification packet */ #define bgpPduKeepAlive 4 /* KeepAlive packet */ #define bgpPduOpenConfirm 5 /* Open Confirmation */ #define bgpPduMax 5 /* Maximum valid type */ typedef struct { /* Complete BGP packet (minus data fields) */ pduHeader header; union { updatePdu update; openPdu open; notifyPdu notify; } pdu; } bgpPdu; typedef struct _as_path { short as_count; /* Length of AS path */ short as_origin; /* Where did we learn this from */ as_t as_number[1]; /* AS path elements */ } as_path; #define ASO_IGP 1 /* Originated with an IGP */ #define ASO_EGP 2 /* Originated with EGP */ #define ASO_INCOMPLETE 3 /* Origin is unknown */ /* * BGP peer structure */ typedef struct _bgpPeer { struct _bgpPeer *bgp_next; /* Pointer to next bgpPeer table */ u_int bgp_state; /* Protocol State */ u_int bgp_flags; /* Protocol Flags */ u_int bgp_options; /* User specified options */ task *bgp_task; /* Pointer to task */ char bgp_name[16]; /* Name of this peer */ struct sockaddr_in bgp_gateway; /* Gateway to substitute for all of these routes */ if_entry *bgp_interface; /* Pointer to interface for this peer */ gw_entry bgp_gw; /* GW block for this peer */ #define bgp_addr bgp_gw.gw_addr.in #define bgp_accept bgp_gw.gw_accept #define bgp_propagate bgp_gw.gw_propagate #define bgp_time bgp_gw.gw_time /* Received packet and counters */ bgpPdu *bgp_packet; /* Receive buffer for incomming packets */ caddr_t bgp_readpointer; /* Pointer for next recv */ int bgp_length; /* Target length for read or Length from packet read */ int bgp_length_accumulated; /* Length read so far */ time_t bgp_holdtime_in; /* peer specified HoldTime */ time_t bgp_holdtime_out; /* hold time we specify */ metric_t bgp_metricout; /* Global outbound metric for these routes */ as_t bgp_asin; /* AS this peer must specify */ as_t bgp_asout; /* AS to send to this peer */ u_int bgp_linktype; /* Type of link to this peer */ pref_t bgp_preference; /* Preference for this peer */ } bgpPeer; /* Timers */ #define BGPTIMER_KEEPALIVE 0 /* Fire when we should send a keepalive */ #define BGPTIMER_CONNECT 1 /* Fire when time to try a connect again */ #define BGPTIMER_HOLDTIME 2 /* Fire when hold time expires */ /* Protocol States */ #define BGPSTATE_IDLE 1 /* Idle State - ignore connection attempts */ #define BGPSTATE_ACTIVE 2 /* Active State - waiting for a connection */ #define BGPSTATE_CONNECT 3 /* Connect State - trying to connect */ #define BGPSTATE_OPENSENT 4 /* Open packet has been sent - connected */ #define BGPSTATE_OPENCONFIRM 5 /* Confirm packet has been received */ #define BGPSTATE_ESTABLISHED 6 /* Connection has been established */ /* Events */ #define BGPEVENT_START 1 /* Start */ #define BGPEVENT_OPEN 2 /* Transport connection open */ #define BGPEVENT_CLOSED 3 /* Transport connection closed */ #define BGPEVENT_OPENFAIL 4 /* Transport connection open failed */ #define BGPEVENT_RECVOPEN 5 /* Receive Open message */ #define BGPEVENT_RECVCONFIRM 6 /* Receive OpenConfirm message */ #define BGPEVENT_RECVKEEPALIVE 7 /* Receive KeepAlive message */ #define BGPEVENT_RECVUPDATE 8 /* Receive Update message */ #define BGPEVENT_RECVNOTIFY 9 /* Receive Notification message */ #define BGPEVENT_HOLDTIME 10 /* Holdtime expired */ #define BGPEVENT_KEEPALIVE 11 /* KeepAlive timer */ #define BGPEVENT_CEASE 12 /* Cease */ #define BGPEVENT_STOP 13 /* Stop */ /* Flags */ #define BGPF_HEADER 0x01 /* Currently reading header */ #define BGPF_DELETE 0x02 /* Delete this peer */ #define BGPF_WAIT 0x04 /* This peer is waiting for another peer to finish */ #define BGPF_GENDEFAULT 0x08 /* Default generation requested */ /* Options */ #define BGPO_METRICOUT 0x01 /* Use and outbound metric */ #define BGPO_ASIN 0x02 /* Verify inbound AS number */ #define BGPO_ASOUT 0x04 /* Use this outbound AS number */ #define BGPO_NOGENDEFAULT 0x08 /* Don't consider this peer for default generation */ #define BGPO_GATEWAY 0x10 /* Address of local gateway to Source Network */ #define BGPO_PREFERENCE 0x20 /* Preference for this AS */ #define BGPO_INTERFACE 0x40 /* Our interface was specified */ #define BGPO_LINKTYPE 0x80 /* Link type was specified */ #define BGPO_HOLDTIME 0x0100 /* Holdtime was specified */ extern int doing_bgp; /* Are we running BGP protocols? */ extern pref_t bgp_preference; /* Preference for BGP routes */ extern u_short bgp_port; /* BGP well known port */ extern bgpPeer *bgp_peers; /* Linked list of BGP peers */ extern int bgp_n_peers; /* Number of BGP peers */ extern bgpPdu *bgp_send_buffer; /* Output buffer */ extern int notifyLengths[]; /* Lengths of notifyData */ extern metric_t bgp_default_metric; /* Default BGP metric to use */ extern adv_entry *bgp_accept_list; /* List of BGP advise entries */ extern adv_entry *bgp_propagate_list; /* List of BGP propagate entries */ extern bits bgpFlags[]; /* Values of the flags */ extern bits bgpStates[]; /* Values of the states */ extern bits bgpEvents[]; /* Event values */ extern bits bgpOptions[]; extern bits bgpAsDirs[]; /* Values of the directions */ extern bits bgpOpenType[]; /* Values of the open types */ extern bits bgpPduType[]; /* Values of the packet types */ extern bits bgpErrors[]; /* Values of error codes */ extern bits bgpUpdateErrors[]; /* Values of update error subcodes */ #define BGP_LIST(bnp) for (bnp = bgp_peers; bnp; bnp = bnp->bgp_next) #define BGP_LISTEND #ifdef USE_PROTOTYPES extern void bgp_init(void); /* Protocol Initialization */ extern void bgp_reinit(void); /* Protocol re-initialization */ extern void bgp_dump(FILE * fd); /* Dump BGP state */ extern int bgp_peer_changed(bgpPeer * old, bgpPeer * new); extern void bgp_trace(struct sockaddr_in * src, struct sockaddr_in * dst, const char *direction, bgpPdu * PDU, int length); /* Trace a BGP packet */ extern void bgp_recv_Update(bgpPeer * bnp, bgpPdu * PDU, int length); /* Process an incoming BGP packet */ extern void bgp_send_update(bgpPeer * bnp, int flash_flag); /* Send an update to this peer */ extern void bgp_send_NotifyUpdate(bgpPeer * bnp, int code, bgpPdu * packet, int size); /* Send an error packet about an Update Error */ extern void bgp_session_finit(bgpPeer * bnp, int bgp_socket); /* Delete main task */ extern void bgp_connect_init(bgpPeer * bnp); /* Create a connect task */ extern void bgp_connect_finit(bgpPeer * bnp); extern void bgp_send(bgpPeer * bnp, bgpPdu * PDU, int length); /* Send a packet */ extern void bgp_read(task * tp); /* Data is ready to be read */ extern int bgp_recv(task * tp); /* Read data from socket */ extern void bgp_event_Start(bgpPeer * bnp); extern void bgp_event_Closed(bgpPeer * bnp); extern void bgp_event_Open(bgpPeer * bnp); /* Open succeded */ extern void bgp_event_OpenFail(bgpPeer * bnp); /* Open failure */ extern void bgp_event_Holdtime(timer * tip, time_t interval); /* Abort timer fired */ extern void bgp_event_KeepAlive(timer * tip, time_t interval); /* KeepAlive Timer */ extern void bgp_event_Stop(bgpPeer * bnp); /* Gated termination */ extern void bgp_as_dump(FILE * fd); /* Dump the AS paths */ #else /* USE_PROTOTYPES */ extern void bgp_init(); /* Protocol Initialization */ extern void bgp_reinit(); /* Protocol re-initialization */ extern void bgp_dump(); /* Dump BGP state */ extern int bgp_peer_changed(); extern void bgp_trace(); /* Trace a BGP packet */ extern void bgp_recv_Update(); /* Process an incoming BGP packet */ extern void bgp_send_update(); /* Send an update to this peer */ extern void bgp_send_NotifyUpdate(); /* Send an error packet about an Update Error */ extern void bgp_session_finit(); /* Delete main task */ extern void bgp_connect_init(); /* Create a connect task */ extern void bgp_connect_finit(); extern void bgp_send(); /* Send a packet */ extern void bgp_read(); /* Data is ready to be read */ extern int bgp_recv(); /* Read data from socket */ extern void bgp_event_Start(); extern void bgp_event_Closed(); extern void bgp_event_Open(); /* Open succeded */ extern void bgp_event_OpenFail(); /* Open failure */ extern void bgp_event_Holdtime(); /* Abort timer fired */ extern void bgp_event_KeepAlive(); /* KeepAlive Timer */ extern void bgp_event_Stop(); /* Gated termination */ extern void bgp_as_dump(); /* Dump the AS paths */ #endif /* USE_PROTOTYPES */ #endif /* PROTO_BGP */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.