diff options
-rw-r--r-- | bgpd/bgp.h | 503 | ||||
-rw-r--r-- | bgpd/bgp_debug.c | 168 | ||||
-rw-r--r-- | bgpd/bgp_debug.h | 4 | ||||
-rw-r--r-- | bgpd/bgp_msg_read.c | 11 | ||||
-rw-r--r-- | bgpd/bgp_msg_write.c | 40 | ||||
-rw-r--r-- | bgpd/bgp_session.c | 10 | ||||
-rw-r--r-- | lib/memory.c | 2 | ||||
-rw-r--r-- | lib/memory.h | 2 |
8 files changed, 380 insertions, 360 deletions
@@ -44,6 +44,8 @@ * RFC5291 Outbound Route Filtering * RFC5195 BGP-Based Auto-Discovery for Layer-1 VPNs * RFC5123 Considerations in Validating the Path in BGP + * RFC5082 The Generalized TTL Security Mechanism (GTSM) + * -- obsoletes RFC3682 * RFC5065 AS Confederations -- obsoletes RFC3065 * RFC5004 Avoid BGP Best Path Transitions from One External to Another * RFC4893 4-octet AS number @@ -84,6 +86,7 @@ * Control Plane * RFC3822 Configuring BGP to Block Denial-of-Service Attack * RFC3765 NOPEER Community + * RFC3682 ...see RFC5082 * RFC3392 ...see RFC5492 -- obsoletes RFC2842 * RFC3345 BGP Persistent Route Oscillation Condition * RFC3107 Carrying Label Information in BGP @@ -149,13 +152,13 @@ typedef bgp_id_t bgp_id_nt ; /* in network order */ /* Size of BGP packets or thing in such */ typedef uint16_t bgp_size_t; -VALUE(BGP_NEXT_HOP_MAX_L = 32) ; /* maximum expected Next Hop address length */ +VALUE(BGP_NEXT_HOP_MAX_L = 32) ; /* maximum expected Next Hop address length */ /*============================================================================== * BGP Message Structure */ -VALUE(BGP_MSG_MAX_L = 4096) ; /* RFC4271 hard limit on message length */ +VALUE(BGP_MSG_MAX_L = 4096) ; /* RFC4271 hard limit on message length */ /* Message Header Format ----------------------------------------------------*/ @@ -164,14 +167,14 @@ typedef U16 BGP_MH_LEN_T ; /* length of message inc. header: octets */ typedef U8 BGP_MH_TYPE_T ; /* BGP message type */ typedef UBX BGP_MH_BODY_T ; /* rest is body of message */ -VALUE(BGP_MH_MARKER_L = sizeof(BGP_MH_MARKER_T)) ; -VALUE(BGP_MH_HEAD_L = /* message header length */ - BGP_MH_MARKER_L - + sizeof(BGP_MH_LEN_T) - + sizeof(BGP_MH_TYPE_T) ) ; +VALUE(BGP_MH_MARKER_L = sizeof(BGP_MH_MARKER_T)) ; +VALUE(BGP_MH_HEAD_L = /* message header length */ + BGP_MH_MARKER_L + + sizeof(BGP_MH_LEN_T) + + sizeof(BGP_MH_TYPE_T) ) ; CONFIRM(BGP_MH_HEAD_L == 19) ; /* well known value ! */ -VALUE(BGP_MSG_BODY_MAX_L = BGP_MSG_MAX_L - BGP_MH_HEAD_L) ; +VALUE(BGP_MSG_BODY_MAX_L = BGP_MSG_MAX_L - BGP_MH_HEAD_L) ; enum /* order of entries in Message Header */ { @@ -185,17 +188,17 @@ enum /* order of entries in Message Header */ enum BGP_MT { - BGP_MT_MIN = 1, /* min known message type */ + BGP_MT_MIN = 1, /* min known message type */ - BGP_MT_OPEN = 1, - BGP_MT_UPDATE = 2, - BGP_MT_NOTIFICATION = 3, - BGP_MT_KEEPALIVE = 4, - BGP_MT_ROUTE_REFRESH = 5, /* RFC2918 */ + BGP_MT_OPEN = 1, + BGP_MT_UPDATE = 2, + BGP_MT_NOTIFICATION = 3, + BGP_MT_KEEPALIVE = 4, + BGP_MT_ROUTE_REFRESH = 5, /* RFC2918 */ - BGP_MT_CAPABILITY = 6, /* draft-ietf-idr-dynamic-cap-10 */ + BGP_MT_CAPABILITY = 6, /* draft-ietf-idr-dynamic-cap-10 */ - BGP_MT_MAX = 6, /* max known message type */ + BGP_MT_MAX = 6, /* max known message type */ BGP_MT_ROUTE_REFRESH_pre = 128 /* pre RFC2918 (Sep-2000) */ } ; @@ -221,13 +224,13 @@ enum /* order of the fields */ BGP_OPM_OPTS } ; -VALUE(BGP_OPM_MIN_L = /* minimum OPEN message length */ - BGP_MH_HEAD_L - + sizeof(BGP_OPM_VERSION_T) - + sizeof(BGP_OPM_MY_AS_T) - + sizeof(BGP_OPM_H_TIME_T) - + sizeof(BGP_OPM_IDENT_T) - + sizeof(BGP_OPM_O_LEN_T) ) ; +VALUE(BGP_OPM_MIN_L = /* minimum OPEN message length */ + BGP_MH_HEAD_L + + sizeof(BGP_OPM_VERSION_T) + + sizeof(BGP_OPM_MY_AS_T) + + sizeof(BGP_OPM_H_TIME_T) + + sizeof(BGP_OPM_IDENT_T) + + sizeof(BGP_OPM_O_LEN_T) ) ; CONFIRM(BGP_OPM_MIN_L == 29) ; /* well known value ! */ /* Open Message Optional Parameters, each appears as..........................*/ @@ -236,8 +239,11 @@ typedef U8 BGP_OPM_P_TYPE_T ; /* optional parameter type */ typedef U8 BGP_OPM_P_LEN_T ; /* length of parameter: octets */ typedef UBX BGP_OPM_P_VALUE_T ; /* variable -- depending on type */ -VALUE(BGP_OPM_P_MIN_L = sizeof(BGP_OPM_P_TYPE_T) + sizeof(BGP_OPM_P_LEN_T)) ; - /* min len of an OPM */ +VALUE(BGP_OPM_P_MIN_L = /* min len of an OPM Optional Param */ + sizeof(BGP_OPM_P_TYPE_T) + + sizeof(BGP_OPM_P_LEN_T)) ; +VALUE(BGP_OPM_P_MAX_L = 255); /* max len of an OPM Optional Param */ + enum /* order */ { BGP_OPM_P_TYPE, @@ -249,12 +255,12 @@ enum /* order */ enum BGP_OPT { - BGP_OPT_MIN = 1, + BGP_OPT_MIN = 1, - BGP_OPT_AUTH = 1, /* Authentication (deprecated: RFC5492) */ - BGP_OPT_CAPS = 2, /* Capabilities */ + BGP_OPT_AUTH = 1, /* Authentication (deprecated: RFC5492) */ + BGP_OPT_CAPS = 2, /* Capabilities */ - BGP_OPT_MAX = 2, + BGP_OPT_MAX = 2, } ; /* Capability Announcements ---------------------------------------------------- @@ -267,7 +273,7 @@ typedef UBX BGP_CAP_VALUE_T ; /* variable -- depending on code */ VALUE(BGP_CAP_MIN_L = sizeof(BGP_CAP_CODE_T) + sizeof(BGP_CAP_LEN_T)) ; /* min len of a capability announcement */ -VALUE(BGP_CAP_MAX_L = 255) ; /* max len of a capability announcement */ +VALUE(BGP_CAP_MAX_L = 255) ; /* max len of a capability announcement */ CONFIRM(sizeof(BGP_CAP_LEN_T) == 1) ; enum /* order */ @@ -279,27 +285,28 @@ enum /* order */ /* Capability Types...........................................................*/ -enum BGP_CAN { - BGP_CAN_MIN = 1, +enum BGP_CAN +{ + BGP_CAN_MIN = 1, - BGP_CAN_MP_EXT = 1, /* Multiprotocol Extensions RFC4760 */ - BGP_CAN_R_REFRESH = 2, /* Route Refresh RFC2918 */ - BGP_CAN_ORF = 3, /* Outbound Route Filtering RFC5291 */ - BGP_CAN_M_ROUTES = 4, /* Multiple routes to a dest. RFC3107 */ - BGP_CAN_E_NEXT_HOP = 5, /* Extended Next Hop Encoding RFC5549 */ - BGP_CAN_G_RESTART = 64, /* Graceful Restart RFC4724 */ - BGP_CAN_AS4 = 65, /* Supports 4-octet AS number RFC4893 */ + BGP_CAN_MP_EXT = 1, /* Multiprotocol Extensions RFC4760 */ + BGP_CAN_R_REFRESH = 2, /* Route Refresh RFC2918 */ + BGP_CAN_ORF = 3, /* Outbound Route Filtering RFC5291 */ + BGP_CAN_M_ROUTES = 4, /* Multiple routes to a dest. RFC3107 */ + BGP_CAN_E_NEXT_HOP = 5, /* Extended Next Hop Encoding RFC5549 */ + BGP_CAN_G_RESTART = 64, /* Graceful Restart RFC4724 */ + BGP_CAN_AS4 = 65, /* Supports 4-octet AS number RFC4893 */ - BGP_CAN_DYNAMIC_CAP_old = 66, /* Dynamic Capability (draft 02) [Chen] + BGP_CAN_DYNAMIC_CAP_old = 66, /* Dynamic Capability (draft 02) [Chen] Deprecated 6-Apr-2003 */ - BGP_CAN_DYNAMIC_CAP= 67, /* Dynamic Capability [Chen] */ - BGP_CAN_MULTI_SESS = 68, /* Multisession Capability [Appanna] */ - BGP_CAN_ADD_PATH = 69, /* ADD-PATH [draft-idr] */ + BGP_CAN_DYNAMIC_CAP = 67, /* Dynamic Capability [Chen] */ + BGP_CAN_MULTI_SESS = 68, /* Multisession Capability [Appanna] */ + BGP_CAN_ADD_PATH = 69, /* ADD-PATH [draft-idr] */ - BGP_CAN_MAX = 69, /* but mind the gap(s) ! */ + BGP_CAN_MAX = 69, /* but mind the gap(s) ! */ - BGP_CAN_R_REFRESH_pre = 128, /* pre-RFC value */ - BGP_CAN_ORF_pre = 130, /* pre-RFC value */ + BGP_CAN_R_REFRESH_pre = 128, /* pre-RFC value */ + BGP_CAN_ORF_pre = 130, /* pre-RFC value */ } ; /* Update Message (type = BGP_MT_UPDATE) --------------------------------------- @@ -318,10 +325,10 @@ typedef UBX BGP_UPM_ATTR_T ; /* variable ! */ typedef UBX BGP_UPM_NLRI_T ; /* variable -- to end of message ! */ /* NB: Attributes len. == 0 <=> no NLRI */ -VALUE(BGP_UPM_MIN_L = /* minimum UPDATE message length */ - BGP_MH_HEAD_L - + sizeof(BGP_UPM_W_LEN_T) - + sizeof(BGP_UPM_A_LEN_T) ) ; +VALUE(BGP_UPM_MIN_L = /* minimum UPDATE message length */ + BGP_MH_HEAD_L + + sizeof(BGP_UPM_W_LEN_T) + + sizeof(BGP_UPM_A_LEN_T) ) ; CONFIRM(BGP_UPM_MIN_L == 23) ; /* well known value ! */ enum /* order */ @@ -346,17 +353,17 @@ typedef U8 BGP_ATTR_LEN_T ; /* minimum */ typedef U16 BGP_ATTR_ELEN_T ; /* if BGP_ATF_EXTENDED is set */ typedef UBX BGP_ATTR_VAL_T ; /* variable value */ -VALUE(BGP_ATTR_MIN_L = /* min len of attribute */ - sizeof(BGP_ATTR_FLAGS_T) - + sizeof(BGP_ATTR_TYPE_T) - + sizeof(BGP_ATTR_LEN_T) ) ; +VALUE(BGP_ATTR_MIN_L = /* min len of attribute */ + sizeof(BGP_ATTR_FLAGS_T) + + sizeof(BGP_ATTR_TYPE_T) + + sizeof(BGP_ATTR_LEN_T) ) ; enum /* order */ { BGP_ATTR_FLAGS, BGP_ATTR_TYPE, BGP_ATTR_LEN, - BGP_ATTR_ELEN = BGP_ATTR_LEN, + BGP_ATTR_ELEN = BGP_ATTR_LEN, BGP_ATTR_VAL } ; @@ -364,53 +371,53 @@ enum /* order */ enum { - BGP_ATF_OPTIONAL = 0x80, /* otherwise is Well Known */ - BGP_ATF_TRANSITIVE = 0x40, /* MUST be set if Well Known */ - BGP_ATF_PARTIAL = 0x20, /* MUST not be set if Well Known */ - BGP_ATF_EXTENDED = 0x10, /* 2 octet Attribute Length */ + BGP_ATF_OPTIONAL = 0x80, /* otherwise is Well Known */ + BGP_ATF_TRANSITIVE = 0x40, /* MUST be set if Well Known */ + BGP_ATF_PARTIAL = 0x20, /* MUST not be set if Well Known */ + BGP_ATF_EXTENDED = 0x10, /* 2 octet Attribute Length */ } ; /* Attribute Type Byte values -- see below for specifics of each..............*/ enum BGP_ATT { - BGP_ATT_UNDEFINED = 0, /* IANA do not define meaning for this */ - BGP_ATT_MIN = 1, - - BGP_ATT_ORIGIN = 1, - BGP_ATT_AS_PATH = 2, /* AS2 or AS4, depending on context */ - BGP_ATT_NEXT_HOP = 3, /* implicitly IPv4 */ - BGP_ATT_MEDS = 4, /* MULTI_EXIT_DISC */ - BGP_ATT_L_PREF = 5, /* LOCAL_PREF */ - BGP_ATT_A_AGGREGATE = 6, /* ATOMIC_AGGREGATE */ - BGP_ATT_AGGREGATOR = 7, - - BGP_ATT_COMMUNITY = 8, /* RFC1997 */ - BGP_ATT_ORIG_ID = 9, /* ORIGINATOR_ID : Route Refl. RFC4456 */ - BGP_ATT_CLUSTER_LIST = 10, /* CLUSTER_LIST : Route Refl. RFC4456 */ - - BGP_ATT_DPA = 11, /* [Chen] */ - BGP_ATT_ADVERTISER = 12, /* RFC1863 -- historic per RFC4223 */ - BGP_ATT_RCID_PATH = 13, /* RFC1863 -- historic per RFC4223 */ - - BGP_ATT_MP_REACH = 14, /* MP_REACH_NRLI MP Ext. RFC4760 */ - BGP_ATT_MP_UNREACH = 15, /* MP_UNREACH_NRLI MP Ext. RFC4760 */ - - BGP_ATT_EXT_COMMS = 16, /* EXTENDED_COMMUNITIES RFC4360 */ - BGP_ATT_AS4_PATH = 17, /* AS4 stuff RFC4893 */ - BGP_ATT_AS4_AGGR = 18, /* AS4 stuff (AS4_AGGREGATOR) RFC4893 */ - - BGP_ATT_SSA = 19, /* SAFI Specific Attribute [Nalawade] */ - BGP_ATT_CONNECTOR = 20, /* Connector Attribute [Nalawade] */ - BGP_ATT_AS_PATHLIMIT = 21, /* Expires 27-Oct-2007 [idr] */ - BGP_ATT_PMSI_TUNNEL = 22, /* [l3vpn-2547bis] */ - BGP_ATT_TUNNEL_ENCAP = 23, /* Tunnel Encapsulation Attrib RFC5512 */ - BGP_ATT_TRAFFIC_ENG = 24, /* Traffic Engineering RFC5543 */ - BGP_ATT_IPV6_EXT_COMMS = 25, /* IPv6 Ext. Community [l3vpn-v6] */ - - BGP_ATT_MAX = 25, /* last attribute known to us */ - - BGP_ATT_RESERVED = 255, /* reserved by IANA */ + BGP_ATT_UNDEFINED = 0, /* IANA do not define meaning for this */ + BGP_ATT_MIN = 1, + + BGP_ATT_ORIGIN = 1, + BGP_ATT_AS_PATH = 2, /* AS2 or AS4, depending on context */ + BGP_ATT_NEXT_HOP = 3, /* implicitly IPv4 */ + BGP_ATT_MEDS = 4, /* MULTI_EXIT_DISC */ + BGP_ATT_L_PREF = 5, /* LOCAL_PREF */ + BGP_ATT_A_AGGREGATE = 6, /* ATOMIC_AGGREGATE */ + BGP_ATT_AGGREGATOR = 7, + + BGP_ATT_COMMUNITY = 8, /* RFC1997 */ + BGP_ATT_ORIG_ID = 9, /* ORIGINATOR_ID : Route Refl. RFC4456 */ + BGP_ATT_CLUSTER_LIST = 10, /* CLUSTER_LIST : Route Refl. RFC4456 */ + + BGP_ATT_DPA = 11, /* [Chen] */ + BGP_ATT_ADVERTISER = 12, /* RFC1863 -- historic per RFC4223 */ + BGP_ATT_RCID_PATH = 13, /* RFC1863 -- historic per RFC4223 */ + + BGP_ATT_MP_REACH = 14, /* MP_REACH_NRLI MP Ext. RFC4760 */ + BGP_ATT_MP_UNREACH = 15, /* MP_UNREACH_NRLI MP Ext. RFC4760 */ + + BGP_ATT_EXT_COMMS = 16, /* EXTENDED_COMMUNITIES RFC4360 */ + BGP_ATT_AS4_PATH = 17, /* AS4 stuff RFC4893 */ + BGP_ATT_AS4_AGGR = 18, /* AS4 stuff (AS4_AGGREGATOR) RFC4893 */ + + BGP_ATT_SSA = 19, /* SAFI Specific Attribute [Nalawade] */ + BGP_ATT_CONNECTOR = 20, /* Connector Attribute [Nalawade] */ + BGP_ATT_AS_PATHLIMIT = 21, /* Expires 27-Oct-2007 [idr] */ + BGP_ATT_PMSI_TUNNEL = 22, /* [l3vpn-2547bis] */ + BGP_ATT_TUNNEL_ENCAP = 23, /* Tunnel Encapsulation Attrib RFC5512 */ + BGP_ATT_TRAFFIC_ENG = 24, /* Traffic Engineering RFC5543 */ + BGP_ATT_IPV6_EXT_COMMS = 25, /* IPv6 Ext. Community [l3vpn-v6] */ + + BGP_ATT_MAX = 25, /* last attribute known to us */ + + BGP_ATT_RESERVED = 255, /* reserved by IANA */ } ; /* Notification Message (type = BGP_MT_NOTIFICATION) -------------------------*/ @@ -419,10 +426,10 @@ typedef U8 BGP_NOM_CODE_T ; /* see below for Error Code values */ typedef U8 BGP_NOM_SUBCODE_T ; /* see below for Error Subcode value */ typedef UBX BGP_NOM_DATA_T ; /* variable -- to end of message ! */ -VALUE(BGP_NOM_MIN_L = /* minimum NOTIFICATION length */ - BGP_MH_HEAD_L - + sizeof(BGP_NOM_CODE_T) - + sizeof(BGP_NOM_SUBCODE_T) ) ; +VALUE(BGP_NOM_MIN_L = /* minimum NOTIFICATION length */ + BGP_MH_HEAD_L + + sizeof(BGP_NOM_CODE_T) + + sizeof(BGP_NOM_SUBCODE_T) ) ; CONFIRM(BGP_NOM_MIN_L == 21) ; /* well known value ! */ enum /* order */ @@ -454,97 +461,97 @@ enum BGP_NOMC enum BGP_NOMS { - BGP_NOMS_UNSPECIFIC = 0 /* If nothing else applies */ + BGP_NOMS_UNSPECIFIC = 0 /* If nothing else applies */ }; enum BGP_NOMS_HEADER /* BGP_NOMC_HEADER subcodes */ { - BGP_NOMS_H_NOT_SYNC = 1, /* Connection Not Synchronised */ + BGP_NOMS_H_NOT_SYNC = 1, /* Connection Not Synchronised */ /* (Marker field not all = 1,'s !) */ - BGP_NOMS_H_BAD_LEN = 2, /* Bad Message Length */ + BGP_NOMS_H_BAD_LEN = 2, /* Bad Message Length */ /* DATA: the length that failed */ - BGP_NOMS_H_BAD_TYPE = 3, /* Bad Message Type */ + BGP_NOMS_H_BAD_TYPE = 3, /* Bad Message Type */ /* DATA: the message type objected to */ - BGP_NOMS_H_MAX = 3, /* max known subcode */ + BGP_NOMS_H_MAX = 3, /* max known subcode */ } ; enum BGP_NOMS_OPEN /* BGP_NOMC_OPEN subcodes */ { - BGP_NOMS_O_VERSION = 1, /* Unsupported Version Number */ + BGP_NOMS_O_VERSION = 1, /* Unsupported Version Number */ /* DATA: largest supported version */ - BGP_NOMS_O_BAD_AS = 2, /* Bad Peer AS */ - BGP_NOMS_O_BAD_ID = 3, /* Bad BGP Identifier */ - BGP_NOMS_O_OPTION = 4, /* Unsupported Optional Parameter */ - BGP_NOMS_O_AUTH = 5, /* Authentication Failure (depr.) */ - BGP_NOMS_O_H_TIME = 6, /* Unacceptable Hold Time */ + BGP_NOMS_O_BAD_AS = 2, /* Bad Peer AS */ + BGP_NOMS_O_BAD_ID = 3, /* Bad BGP Identifier */ + BGP_NOMS_O_OPTION = 4, /* Unsupported Optional Parameter */ + BGP_NOMS_O_AUTH = 5, /* Authentication Failure (depr.) */ + BGP_NOMS_O_H_TIME = 6, /* Unacceptable Hold Time */ - BGP_NOMS_O_CAPABILITY = 7, /* Unsupported Capability RFC5492 */ + BGP_NOMS_O_CAPABILITY = 7, /* Unsupported Capability RFC5492 */ /* DATA: the unsupported capabilities */ - BGP_NOMS_O_MAX = 7, /* max known subcode */ + BGP_NOMS_O_MAX = 7, /* max known subcode */ } ; enum BGP_NOMS_UPDATE /* BGP_NOMC_UPDATE subcodes */ { - BGP_NOMS_U_A_LIST = 1, /* Malformed Attribute List */ + BGP_NOMS_U_A_LIST = 1, /* Malformed Attribute List */ /* (Attribute repeated) */ - BGP_NOMS_U_UNKNOWN = 2, /* Unrecognised Well-known Attrib */ + BGP_NOMS_U_UNKNOWN = 2, /* Unrecognised Well-known Attrib */ /* DATA: erroneous attribute */ - BGP_NOMS_U_MISSING = 3, /* Missing Well-known Attrib. */ + BGP_NOMS_U_MISSING = 3, /* Missing Well-known Attrib. */ /* DATA: type of missing attribute(s?) */ - BGP_NOMS_U_A_FLAGS = 4, /* Attribute Flags Error */ + BGP_NOMS_U_A_FLAGS = 4, /* Attribute Flags Error */ /* DATA: erroneous attribute */ - BGP_NOMS_U_A_LENGTH = 5, /* Attribute Length Error */ + BGP_NOMS_U_A_LENGTH = 5, /* Attribute Length Error */ /* DATA: erroneous attribute */ - BGP_NOMS_U_ORIGIN = 6, /* Invalid Origin Attribute */ + BGP_NOMS_U_ORIGIN = 6, /* Invalid Origin Attribute */ /* DATA: erroneous attribute */ - BGP_NOMS_U_AS_LOOP = 7, /* AS Routeing Loop (deprecated) */ - BGP_NOMS_U_NEXT_HOP = 8, /* Invalid NEXT_HOP Attrib. */ + BGP_NOMS_U_AS_LOOP = 7, /* AS Routeing Loop (deprecated) */ + BGP_NOMS_U_NEXT_HOP = 8, /* Invalid NEXT_HOP Attrib. */ /* DATA: erroneous attribute */ - BGP_NOMS_U_OPTIONAL = 9, /* Optional Attribute Error */ + BGP_NOMS_U_OPTIONAL = 9, /* Optional Attribute Error */ /* DATA: erroneous attribute */ - BGP_NOMS_U_NETWORK = 10, /* Invalid Network Field */ + BGP_NOMS_U_NETWORK = 10, /* Invalid Network Field */ /* (badly formed NLRI) */ - BGP_NOMS_U_AS_PATH = 11, /* Malformed AS Path */ + BGP_NOMS_U_AS_PATH = 11, /* Malformed AS Path */ - BGP_NOMS_U_MAX = 11, /* max known subcode */ + BGP_NOMS_U_MAX = 11, /* max known subcode */ } ; enum BGP_NOMS_HOLD_EXP /* BGP_NOMC_HOLD_EXP subcodes */ { - BGP_NOMS_HE_MAX = 0 /* max known subcode */ + BGP_NOMS_HE_MAX = 0 /* max known subcode */ } ; enum BGP_NOMC_FSM /* BGP_NOMC_FSM subcodes */ { - BGP_NOMS_F_MAX = 0 /* max known subcode */ + BGP_NOMS_F_MAX = 0 /* max known subcode */ } ; enum BGP_NOMS_CEASE /* BGP_NOMC_CEASE subcodes RFC4486 */ { - BGP_NOMS_C_MAX_PREF = 1, /* Max Number of Prefixes Reached MUST */ + BGP_NOMS_C_MAX_PREF = 1, /* Max Number of Prefixes Reached MUST */ /* DATA: MAY be: AFI/SAFI/Upper-Bound */ - BGP_NOMS_C_SHUTDOWN = 2, /* Administrative Shutdown SHOULD */ - BGP_NOMS_C_DECONFIG = 3, /* Peer De-configured SHOULD */ - BGP_NOMS_C_RESET = 4, /* Administrative Reset SHOULD */ - BGP_NOMS_C_REJECTED = 5, /* Connection Rejected SHOULD */ - BGP_NOMS_C_CONFIG = 6, /* Other Configuration Change SHOULD */ - BGP_NOMS_C_COLLISION = 7, /* Connection Collision Res. SHOULD */ - BGP_NOMS_C_RESOURCES = 8, /* Out of Resources MAY */ - - BGP_NOMS_C_MAX = 8 /* max known subcode */ + BGP_NOMS_C_SHUTDOWN = 2, /* Administrative Shutdown SHOULD */ + BGP_NOMS_C_DECONFIG = 3, /* Peer De-configured SHOULD */ + BGP_NOMS_C_RESET = 4, /* Administrative Reset SHOULD */ + BGP_NOMS_C_REJECTED = 5, /* Connection Rejected SHOULD */ + BGP_NOMS_C_CONFIG = 6, /* Other Configuration Change SHOULD */ + BGP_NOMS_C_COLLISION = 7, /* Connection Collision Res. SHOULD */ + BGP_NOMS_C_RESOURCES = 8, /* Out of Resources MAY */ + + BGP_NOMS_C_MAX = 8 /* max known subcode */ } ; enum BGP_DYN_CAP /* BGP_NOMC_DYN_CAP subcodes draft-ietf-idr-dynamic-cap-10.txt */ { - BGP_NOMS_D_UNKN_SEQ = 1, /* Unknown Sequence Number MUST */ - BGP_NOMS_D_INV_LEN = 2, /* Invalid Capability Length MUST */ - BGP_NOMS_D_MALFORM = 3, /* Malformed Capability Length MUST */ - BGP_NOMS_D_UNSUP = 4, /* Unsupported Capability MUST */ + BGP_NOMS_D_UNKN_SEQ = 1, /* Unknown Sequence Number MUST */ + BGP_NOMS_D_INV_LEN = 2, /* Invalid Capability Length MUST */ + BGP_NOMS_D_MALFORM = 3, /* Malformed Capability Length MUST */ + BGP_NOMS_D_UNSUP = 4, /* Unsupported Capability MUST */ - BGP_NOMS_D_MAX = 4 /* max known subcode */ + BGP_NOMS_D_MAX = 4 /* max known subcode */ } ; /* Keepalive Message (type = BGP_MT_KEEPALIVE) -------------------------------*/ @@ -560,11 +567,12 @@ typedef U16 BGP_RRM_AFI_T ; /* Address Family Identifier */ typedef U8 BGP_RRM_RES_T ; /* reserved = 0 */ typedef U8 BGP_RRM_SAFI_T ; /* Subsequent Address Family Identifier */ -VALUE(BGP_RRM_MIN_L = BGP_MH_HEAD_L /* Route Refresh length */ - + sizeof(BGP_RRM_AFI_T) - + sizeof(BGP_RRM_RES_T) - + sizeof(BGP_RRM_SAFI_T) ) ; -CONFIRM(BGP_RRM_MIN_L == 23) ; /* well known value ! */ +VALUE(BGP_RRM_MIN_L = /* Route Refresh length */ + BGP_MH_HEAD_L + + sizeof(BGP_RRM_AFI_T) + + sizeof(BGP_RRM_RES_T) + + sizeof(BGP_RRM_SAFI_T) ) ; +CONFIRM(BGP_RRM_MIN_L == 23) ; /* well known value ! */ typedef U8 BGP_RRM_ORF_WHEN_T ; /* when to refresh -- see RFC5291 */ typedef UBX BGP_RRM_ORFS_T ; /* variable... see below */ @@ -574,14 +582,14 @@ enum /* order */ BGP_RRM_AFI, BGP_RRM_RES, BGP_RRM_SAFI, - BGP_RRM_ORF_WHEN, /* start of ORF message */ - BGP_RRM_ORFS, /* start of ORF collections -- *one* or more */ + BGP_RRM_ORF_WHEN, /* start of ORF message */ + BGP_RRM_ORFS, /* start of ORF collections -- *one* or more */ } ; enum /* values for the BGP_RRM_ORF_WHEN byte */ { - BGP_ORF_WTR_IMMEDIATE = 1, /* when-to-refresh == immediately */ - BGP_ORF_WTR_DEFER = 2 /* when-to-refresh == defer */ + BGP_ORF_WTR_IMMEDIATE = 1, /* when-to-refresh == immediately */ + BGP_ORF_WTR_DEFER = 2 /* when-to-refresh == defer */ } ; /* ORFS come in collections -- one or more....................................*/ @@ -590,7 +598,7 @@ typedef U8 BGP_ORF_TYPE_T ; /* ORF Type */ typedef U16 BGP_ORF_LEN_T ; /* length of ORF entries: octets */ typedef UBX BGP_ORF_ENTRIES_T ; /* variable: ORF entry collection(s) */ -VALUE(BGP_ORF_MIN_L = sizeof(BGP_ORF_TYPE_T) + sizeof(BGP_ORF_LEN_T)) ; +VALUE(BGP_ORF_MIN_L = sizeof(BGP_ORF_TYPE_T) + sizeof(BGP_ORF_LEN_T)) ; /* min len of ORF */ enum /* order */ @@ -605,18 +613,18 @@ enum /* order */ typedef U8 BGP_ORF_E_ACTION_T ; /* see below for action/match bits */ typedef UBX BGP_ORF_E_REST_T ; /* rest depends on ORF Type */ -VALUE(BGP_ORF_E_COM_L = sizeof(BGP_ORF_E_ACTION_T)) ; +VALUE(BGP_ORF_E_COM_L = sizeof(BGP_ORF_E_ACTION_T)) ; /* Known BGP_ORF_TYPE values..................................................*/ enum BGP_ORF { - BGP_ORF_T_MIN = 64, + BGP_ORF_T_MIN = 64, - BGP_ORF_T_PREFIX = 64, /* Address Prefix ORF RFC5292 */ + BGP_ORF_T_PREFIX = 64, /* Address Prefix ORF RFC5292 */ - BGP_ORF_T_MAX = 64, + BGP_ORF_T_MAX = 64, - BGP_ORF_T_PREFIX_pre = 128 /* pre RFC value */ + BGP_ORF_T_PREFIX_pre = 128 /* pre RFC value */ } ; /* Known BGP_ORF_E_ACTION bits................................................*/ @@ -640,11 +648,11 @@ typedef U8 BGP_ORF_E_P_MAX_T ; /* Maxlen */ typedef U8 BGP_ORF_E_P_LEN_T ; /* Prefix Length */ typedef UBX BGP_ORF_E_P_PFIX_T ; /* Prefix -- variable ! */ -VALUE(BGP_ORF_E_P_MIN_L = BGP_ORF_E_COM_L - + sizeof(BGP_ORF_E_P_SEQ_T) - + sizeof(BGP_ORF_E_P_MIN_T) - + sizeof(BGP_ORF_E_P_MAX_T) - + sizeof(BGP_ORF_E_P_LEN_T) ) ; +VALUE(BGP_ORF_E_P_MIN_L = BGP_ORF_E_COM_L + + sizeof(BGP_ORF_E_P_SEQ_T) + + sizeof(BGP_ORF_E_P_MIN_T) + + sizeof(BGP_ORF_E_P_MAX_T) + + sizeof(BGP_ORF_E_P_LEN_T) ) ; /* Dynamic Capability Message (type = BGP_MT_CAPABILITY) ----------------------- * @@ -666,11 +674,11 @@ typedef U16 BGP_CAP_MPE_AFI_T ; /* Address Family Identifier */ typedef U8 BGP_CAP_MPE_RES_T ; /* Reserved: 0 */ typedef U8 BGP_CAP_MPE_SAFI_T ; /* Subsequent Address Family */ -VALUE(BGP_CAP_MPE_L = 4) ; /* Fixed length == 4 ! */ +VALUE(BGP_CAP_MPE_L = 4) ; /* Fixed length == 4 ! */ /* Route Refresh -- BGP_CAN_R_REFRESH -- RFC2918 -----------------------------*/ -VALUE(BGP_CAP_RRF_L = 0) ; /* no value part */ +VALUE(BGP_CAP_RRF_L = 0) ; /* no value part */ /* Outbound Route Filtering -- BGP_CAN_ORF -- RFC5291 -------------------------- * @@ -682,10 +690,10 @@ typedef U8 BGP_CAP_ORFE_SAFI_T ; /* Subsequent Address Family */ typedef U8 BGP_CAP_ORFE_COUNT_T ; /* number of ORF Types supported */ typedef UBX BGP_CAP_ORFE_TYPES_T ; /* variable -- 2 byte entries as below */ -VALUE(BGP_CAP_ORFE_MIN_L = sizeof(BGP_CAP_ORFE_AFI_T) - + sizeof(BGP_CAP_ORFE_RES_T) - + sizeof(BGP_CAP_ORFE_SAFI_T) - + sizeof(BGP_CAP_ORFE_COUNT_T) ) ; +VALUE(BGP_CAP_ORFE_MIN_L = sizeof(BGP_CAP_ORFE_AFI_T) + + sizeof(BGP_CAP_ORFE_RES_T) + + sizeof(BGP_CAP_ORFE_SAFI_T) + + sizeof(BGP_CAP_ORFE_COUNT_T) ) ; enum /* order */ { @@ -699,12 +707,13 @@ enum /* order */ /* Entries saying what ORF Types can be supported and how....................... * * There are BGP_CAP_ORF_COUNT of these. + * A zero count is pointless, but not explicitly forbidden in RFC5291 ! */ typedef U8 BGP_CAP_ORFT_TYPE_T ; /* the ORF Type supported */ typedef U8 BGP_CAP_ORFT_MODE_T ; /* what can do with ORF Type */ -VALUE(BGP_CAP_ORFT_L = sizeof(BGP_CAP_ORFT_TYPE_T) - + sizeof(BGP_CAP_ORFT_MODE_T)) ; +VALUE(BGP_CAP_ORFT_L = sizeof(BGP_CAP_ORFT_TYPE_T) + + sizeof(BGP_CAP_ORFT_MODE_T)) ; /* length of ORF capability Type entry */ enum /* order */ { @@ -715,16 +724,16 @@ enum /* order */ /* Values for the BGP_CAP_ORFT_TYPE field */ enum { - BGP_CAP_ORFT_T_PFIX = 64, /* Address Prefix ORF */ - BGP_CAP_ORFT_T_PFIX_pre = 128, /* Address Prefix ORF, pre-RFC */ + BGP_CAP_ORFT_T_PFIX = 64, /* Address Prefix ORF */ + BGP_CAP_ORFT_T_PFIX_pre = 128, /* Address Prefix ORF, pre-RFC */ } ; /* Values for the BGP_CAP_ORFT_MODE field */ enum { - BGP_CAP_ORFT_M_RECV = 1, /* willing to receive */ - BGP_CAP_ORFT_M_SEND = 2, /* would like to send */ - BGP_CAP_ORFT_M_BOTH = 3 /* may be combined */ + BGP_CAP_ORFT_M_RECV = 1, /* willing to receive */ + BGP_CAP_ORFT_M_SEND = 2, /* would like to send */ + BGP_CAP_ORFT_M_BOTH = 3 /* may be combined */ } ; /* Multiple Routes to a Destination (Labels) -- BGP_CAN_M_ROUTES -- RFC3107 ---- @@ -732,12 +741,13 @@ enum * Requires Multiprotocol Extensions, really. */ -VALUE(BGP_CAP_MRD_L = 0) ; /* no value part */ +VALUE(BGP_CAP_MRD_L = 0) ; /* no value part */ /* Graceful Restart -- BGP_CAN_G_RESTART -- RFC4724 --------------------------*/ typedef U16 BGP_CAP_GR_TIME_T ; /* See below for bit field masks */ typedef UBX BGP_CAP_GR_CAN_T ; /* variable -- 4 byte entries follow */ + /* may be none at all */ VALUE(BGP_CAP_GR_MIN_L = sizeof(BGP_CAP_GR_TIME_T)) ; @@ -745,8 +755,8 @@ VALUE(BGP_CAP_GR_MIN_L = sizeof(BGP_CAP_GR_TIME_T)) ; enum { - BGP_CAP_GR_T_R_FLAG = 0x8000, /* Restart State flag */ - BGP_CAP_GR_T_MASK = 0x0FFF /* Restart Time in seconds */ + BGP_CAP_GR_T_R_FLAG = 0x8000, /* Restart State flag */ + BGP_CAP_GR_T_MASK = 0x0FFF /* Restart Time in seconds */ } ; /* Entries for what we can gracefully restart for.............................*/ @@ -755,28 +765,28 @@ typedef U16 BGP_CAP_GRE_AFI_T ; /* Address Family Identifier */ typedef U8 BGP_CAP_GRE_SAFI_T ; /* Subsequent Address Family */ typedef U8 BGP_CAP_GRE_FLAGS_T ; /* Flags qualifying capability */ -VALUE(BGP_CAP_GRE_L = /* length of Graceful Restart entry */ - sizeof(BGP_CAP_GRE_AFI_T) - + sizeof(BGP_CAP_GRE_SAFI_T) - + sizeof(BGP_CAP_GRE_FLAGS_T) ) ; +VALUE(BGP_CAP_GRE_L = /* length of Graceful Restart entry */ + sizeof(BGP_CAP_GRE_AFI_T) + + sizeof(BGP_CAP_GRE_SAFI_T) + + sizeof(BGP_CAP_GRE_FLAGS_T) ) ; /* The BGP_CAP_GRE_FLAGS field is also a bit-field */ enum { - BGP_CAP_GRE_F_FORW = 0x80 /* Forwarding State preserved */ + BGP_CAP_GRE_F_FORW = 0x80 /* Forwarding State preserved */ } ; /* 4-Octet AS Numbers -- BGP_CAN_AS4 -- RFC4893 ------------------------------*/ typedef U32 BGP_CAP_AS4_MY_AS_T ; /* can do AS4, and this is me AS4-wise */ -VALUE(BGP_CAP_AS4_L = sizeof(BGP_CAP_AS4_MY_AS_T)) ; +VALUE(BGP_CAP_AS4_L = sizeof(BGP_CAP_AS4_MY_AS_T)) ; /* Dynamic Capability -- BGP_CAN_DYNAMIC_CAP -- draft-10----------------------*/ /* draft-ietf-idr-dynamic-cap-10 15-Jan-2010 */ -VALUE(BGP_CAP_DYN_L = 0) ; +VALUE(BGP_CAP_DYN_L = 0) ; /*============================================================================== * Attributes -- form of the Path Attributes in an UPDATE Message @@ -786,33 +796,33 @@ VALUE(BGP_CAP_DYN_L = 0) ; */ enum { - BGP_AT_IS_OPTIONAL = 0x80, - BGP_AT_IS_TRANSITIVE = 0x40, + BGP_AT_IS_OPTIONAL = 0x80, + BGP_AT_IS_TRANSITIVE = 0x40, - BGP_AT_IS_MANDATORY = 0x08, /* otherwise discretionary */ - BGP_AT_IS_WELL_KNOWN = 0x04, /* => TRANSITIVE */ + BGP_AT_IS_MANDATORY = 0x08, /* otherwise discretionary */ + BGP_AT_IS_WELL_KNOWN = 0x04, /* => TRANSITIVE */ - BGP_AT_IS_IGP_ONLY = 0x01 /* IBGP sessions & intra-confederation */ + BGP_AT_IS_IGP_ONLY = 0x01 /* IBGP sessions & intra-confederation */ } ; typedef U8 BGP_AT_IS_T ; /* Attribute type fits in a byte */ /* ORIGIN Attribute -- BGP_ATT_ORIGIN ----------------------------------------*/ -VALUE(BGP_ATT_ORIGIN_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY) ; +VALUE(BGP_ATT_ORIGIN_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY) ; typedef U8 BGP_ATT_ORIGIN_T ; /* one byte of data ! */ -VALUE(BGP_ATT_ORIGIN_L = sizeof(BGP_ATT_ORIGIN_T)) ; +VALUE(BGP_ATT_ORIGIN_L = sizeof(BGP_ATT_ORIGIN_T)) ; enum BGP_ATT_ORG { - BGP_ATT_ORG_MIN = 0, + BGP_ATT_ORG_MIN = 0, - BGP_ATT_ORG_IGP = 0, /* NLRI is interior to originating AS */ - BGP_ATT_ORG_EGP = 1, /* NLRI is learned vi EGP */ - BGP_ATT_ORG_INCOMP = 2, /* INCOMPLETE -- NLRI learned somehow */ + BGP_ATT_ORG_IGP = 0, /* NLRI is interior to originating AS */ + BGP_ATT_ORG_EGP = 1, /* NLRI is learned vi EGP */ + BGP_ATT_ORG_INCOMP = 2, /* INCOMPLETE -- NLRI learned somehow */ - BGP_ATT_ORG_MAX = 2, + BGP_ATT_ORG_MAX = 2, } ; /* AS_PATH Attribute -- BGP_ATT_AS_PATH ---------------------------------------- @@ -822,13 +832,13 @@ enum BGP_ATT_ORG { * * The AS numbers will be 2-octets unless both parties are AS4 speakers (RFC4893). */ -VALUE(BGP_ATT_AS_PATH_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY) ; +VALUE(BGP_ATT_AS_PATH_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY) ; typedef U8 BGP_ATT_ASPS_TYPE_T ; /* type of AS Path Segment */ typedef U8 BGP_ATT_ASPS_COUNT_T ; /* count of ASes in AS Path Segment */ -VALUE(BGP_ATT_ASPS_MIN_L = sizeof(BGP_ATT_ASPS_TYPE_T) - + sizeof(BGP_ATT_ASPS_COUNT_T)) ; +VALUE(BGP_ATT_ASPS_MIN_L = sizeof(BGP_ATT_ASPS_TYPE_T) + + sizeof(BGP_ATT_ASPS_COUNT_T)) ; enum /* order */ { @@ -842,10 +852,10 @@ typedef U32 BGP_ATT_ASPS_AS4_T ; /* AS Path Segment Types......................................................*/ enum BGP_AS_SEG { - BGP_AS_SET = 1, - BGP_AS_SEQUENCE = 2, - BGP_AS_CONFED_SEQUENCE = 3, /* RFC5065 */ - BGP_AS_CONFED_SET = 4, /* RFC5065 */ + BGP_AS_SET = 1, + BGP_AS_SEQUENCE = 2, + BGP_AS_CONFED_SEQUENCE = 3, /* RFC5065 */ + BGP_AS_CONFED_SET = 4, /* RFC5065 */ } ; /* Special value AS numbers...................................................*/ @@ -865,17 +875,18 @@ enum BGP_ASN { BGP_ASN_PRIV_S = 64512, /* Start of Private Use ASN (0xFC00) */ BGP_ASN_PRIV_E = 65534, /* End (0xFFFE) */ - BGP_ASN_RES2 = 65535, /* Start of Reservation 2 (0xFFFF) */ - + BGP_AS2_RES2 = 65535, /* Last AS2 value is reserved (0xFFFF) */ BGP_AS2_MAX = 65535, /* Last of the Mohicans (0xFFFF) */ + BGP_ASN_RES2_S = 65535, /* Start of Reservation 2 (0xFFFF) */ + BGP_AS4_DOC_S = AS4(1,0), /* Start of Docm. & Samples AS4 (65536) */ BGP_AS4_DOC_E = AS4(1,15), /* End (65531) */ BGP_ASN_RES2_E = AS4(1,65535), /* End of Reservation 2 (131071) */ - BGP_ASN4_KNOWN_S = AS4(2,0), /* Start of known AS4 space (131072) */ - BGP_ASN4_KNOWN_E = AS4(6,65535), /* End (394239) */ + BGP_AS4_KNOWN_S = AS4(2,0), /* Start of known AS4 space (131072) */ + BGP_AS4_KNOWN_E = AS4(6,65535), /* End (394239) */ BGP_ASN_UNKNOWN_S = AS4(7,0), /* Start of uncharted AS4 space (394240) */ /* (as of 12-Mar-2009) */ @@ -906,8 +917,8 @@ VALUE(BGP_ATT_MEDS_L = sizeof(BGP_ATT_MEDS_T)) ; /* LOCAL_PREF Attribute -- BGP_ATT_L_PREF ------------------------------------*/ -VALUE(BGP_ATT_L_PREF_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY - | BGP_AT_IS_IGP_ONLY) ; +VALUE(BGP_ATT_L_PREF_IS = BGP_AT_IS_WELL_KNOWN | BGP_AT_IS_MANDATORY + | BGP_AT_IS_IGP_ONLY) ; typedef U32 BGP_ATT_L_PREF_T ; /* 4 bytes of "metric" */ @@ -915,10 +926,10 @@ VALUE(BGP_ATT_L_PREF_L = sizeof(BGP_ATT_L_PREF_T)) ; /* ATOMIC_AGGREGATE -- BGP_ATT_A_AGGREGATE -----------------------------------*/ -VALUE(BGP_ATT_A_AGGREGATE_IS = BGP_AT_IS_WELL_KNOWN) ; +VALUE(BGP_ATT_A_AGGREGATE_IS= BGP_AT_IS_WELL_KNOWN) ; /* discretionary -- SHOULD pass on */ -VALUE(BGP_ATT_A_AGGREGATE_L = 0) ; /* no data */ +VALUE(BGP_ATT_A_AGGREGATE_L = 0) ; /* no data */ /* AGGREGATOR -- BGP_ATT_AGGREGATOR -------------------------------------------- * @@ -930,9 +941,9 @@ typedef U16 BGP_ATT_AGR_AS_AS2_T ; /* Aggregator AS2 } when not both AS4 */ typedef U32 BGP_ATT_AGR_AS_AS4_T ; /* Aggregator AS4 } when both AS4 */ typedef U32 BGP_ATT_AGR_ID_T ; /* Aggregator ID */ -VALUE(BGP_ATT_AGR_AS2_L = sizeof(BGP_ATT_AGR_AS_AS2_T) +VALUE(BGP_ATT_AGR_AS2_L = sizeof(BGP_ATT_AGR_AS_AS2_T) + sizeof(BGP_ATT_AGR_ID_T)) ; -VALUE(BGP_ATT_AGR_AS4_L = sizeof(BGP_ATT_AGR_AS_AS4_T) +VALUE(BGP_ATT_AGR_AS4_L = sizeof(BGP_ATT_AGR_AS_AS4_T) + sizeof(BGP_ATT_AGR_ID_T)) ; /* COMMUNITIES -- BGP_ATT_COMMUNITY -- RFC1997 --------------------------------- @@ -941,7 +952,7 @@ VALUE(BGP_ATT_AGR_AS4_L = sizeof(BGP_ATT_AGR_AS_AS4_T) * this is implicitly AS2 -- see Extended Communities */ -VALUE(BGP_ATT_COMMUNITY_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; +VALUE(BGP_ATT_COMMUNITY_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; typedef U32 BGP_ATT_COM_VALUE_T ; /* A list of these */ @@ -952,28 +963,28 @@ enum } ; enum BGP_COMM { - BGP_ATT_COM_RES1_S = 0x00000000, + BGP_ATT_COM_RES1_S = 0x00000000, - BGP_ATT_COM_INTERNET = 0x00000000, + BGP_ATT_COM_INTERNET = 0x00000000, - BGP_ATT_COM_RES1_E = 0x0000FFFF, + BGP_ATT_COM_RES1_E = 0x0000FFFF, - BGP_ATT_COM_RES2_S = 0xFFFF0000, + BGP_ATT_COM_RES2_S = 0xFFFF0000, - BGP_ATT_COM_NO_EXPORT = 0xFFFFFF01, - BGP_ATT_COM_NO_ADVERTISE = 0xFFFFFF02, + BGP_ATT_COM_NO_EXPORT = 0xFFFFFF01, + BGP_ATT_COM_NO_ADVERTISE = 0xFFFFFF02, BGP_ATT_COM_NO_EXPORT_SUBCONFED = 0xFFFFFF03, - BGP_ATT_COM_RES2_E = 0xFFFFFFFF, + BGP_ATT_COM_RES2_E = 0xFFFFFFFF, } ; /* ORIGINATOR_ID -- BGP_ATT_ORIG_ID -- RFC4456: BGP Route Reflection ---------*/ -VALUE(BGP_ATT_ORIG_ID_IS = BGP_AT_IS_OPTIONAL) ; +VALUE(BGP_ATT_ORIG_ID_IS = BGP_AT_IS_OPTIONAL) ; typedef U32 BGP_ATT_ORIG_ID_T ; /* BGP Id of router in the local AS */ -VALUE(BGP_ATT_ORIG_ID_L = sizeof(BGP_ATT_ORIG_ID_T)) ; +VALUE(BGP_ATT_ORIG_ID_L = sizeof(BGP_ATT_ORIG_ID_T)) ; /* CLUSTER_LIST -- BGP_ATT_CLUSTER_LIST -- RFC4456: BGP Route Reflection -----*/ @@ -1001,7 +1012,7 @@ typedef U32 BGP_ATT_CLUSTER_ID_T ; /* attribute is list of these CLUSTER_IDs */ * of Next Hop is paramount. */ -VALUE(BGP_ATT_MP_REACH_IS = BGP_AT_IS_OPTIONAL) ; +VALUE(BGP_ATT_MP_REACH_IS = BGP_AT_IS_OPTIONAL) ; typedef U16 BGP_ATT_MPR_AFI_T ; /* Address Family */ typedef U8 BGP_ATT_MPR_SAFI_T ; /* Subsequent Address Family */ @@ -1012,11 +1023,11 @@ typedef UBX BGP_ATT_MPR_NLRI_T ; /* NLRIs now reachable -- variable */ /* Encoded as BGP Prefix (BGP_PREF_...) */ /* Semantics depend on AFI/SAFI pair */ -VALUE(BGP_ATT_MPR_MIN_L /* min len of attribute */ - = sizeof(BGP_ATT_MPR_AFI_T) - + sizeof(BGP_ATT_MPR_SAFI_T) - + sizeof(BGP_ATT_MPR_NH_LEN_T) - + sizeof(BGP_ATT_MPR_RES_T) ) ; +VALUE(BGP_ATT_MPR_MIN_L = /* min len of attribute */ + sizeof(BGP_ATT_MPR_AFI_T) + + sizeof(BGP_ATT_MPR_SAFI_T) + + sizeof(BGP_ATT_MPR_NH_LEN_T) + + sizeof(BGP_ATT_MPR_RES_T) ) ; enum /* order */ { @@ -1042,7 +1053,7 @@ enum /* order */ * AFI/SAFI -- at most (which may be different to the MP_REACH_NLRI). */ -VALUE(BGP_ATT_MP_UNREACH_IS = BGP_AT_IS_OPTIONAL) ; +VALUE(BGP_ATT_MP_UNREACH_IS = BGP_AT_IS_OPTIONAL) ; typedef U16 BGP_ATT_MPU_AFI_T ; /* Address Family */ typedef U8 BGP_ATT_MPU_SAFI_T ; /* Subsequent Address Family */ @@ -1050,8 +1061,8 @@ typedef UBX BGP_ATT_MPU_NLRI_T ; /* NLRIs now unreachable -- variable */ /* Encoded as BGP Prefix (BGP_PREF_...) */ /* Semantics depend on AFI/SAFI pair */ -VALUE(BGP_ATT_MPU_MIN_L = sizeof(BGP_ATT_MPU_AFI_T) - + sizeof(BGP_ATT_MPU_SAFI_T) ) ; +VALUE(BGP_ATT_MPU_MIN_L = sizeof(BGP_ATT_MPU_AFI_T) + + sizeof(BGP_ATT_MPU_SAFI_T) ) ; enum /* order */ { @@ -1070,28 +1081,28 @@ typedef U16 BGP_ATT_EXC_ETYPE_T ; /* or two byte Extended Type */ typedef UB BGP_ATT_EXC_T[8] ; /* each Extended Community is 8 octets */ -VALUE(BGP_ATT_EXC_L = sizeof(BGP_ATT_EXC_T)) ; +VALUE(BGP_ATT_EXC_L = sizeof(BGP_ATT_EXC_T)) ; CONFIRM(BGP_ATT_EXC_L == 8) ; enum { /* Shape of the Type octet RFC4360 */ - BGP_EXCT_IANA = 0x80, /* IANA Authority */ - BGP_EXCT_NON_TRANS = 0x40, /* 0 => Transitive */ - BGP_EXCT_MASK = 0x3F, /* the Type */ + BGP_EXCT_IANA = 0x80, /* IANA Authority */ + BGP_EXCT_NON_TRANS = 0x40, /* 0 => Transitive */ + BGP_EXCT_MASK = 0x3F, /* the Type */ /* The following are the MS part of an extended type RFC4360 */ - BGP_EXCT_AS2 = 0, /* AS Specific Ext. Community */ - BGP_EXCT_IPV4 = 1, /* IPv4 Specific Ext. Community */ - BGP_EXCT_OPAQUE = 3, /* Opaque Ext. Community */ + BGP_EXCT_AS2 = 0, /* AS Specific Ext. Community */ + BGP_EXCT_IPV4 = 1, /* IPv4 Specific Ext. Community */ + BGP_EXCT_OPAQUE = 3, /* Opaque Ext. Community */ /* The following are the LS part of an extended type RFC4360 */ - BGP_EXCS_R_TARGET = 2, /* Route Target */ - BGP_EXCS_R_ORIGIN = 3, /* Route Origin */ + BGP_EXCS_R_TARGET = 2, /* Route Target */ + BGP_EXCS_R_ORIGIN = 3, /* Route Origin */ /* The following are regular (no subtype) types [Knoll] */ - BGP_EXCT_QOS_MARK = 4, /* QoS marking */ - BGP_EXCT_COS_CAP = 5, /* CoS Capability */ + BGP_EXCT_QOS_MARK = 4, /* QoS marking */ + BGP_EXCT_COS_CAP = 5, /* CoS Capability */ } ; /* AS4_PATH -------- BGP_ATT_AS4_PATH -- RFC4893 ------------------------------- @@ -1103,7 +1114,7 @@ enum * Takes the same form as an AS_PATH for an AS4 speaker -- ie 4 byte ASN */ -VALUE(BGP_ATT_AS4_PATH_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; +VALUE(BGP_ATT_AS4_PATH_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; /* AS4_AGGREGATOR -- BGP_ATT_AS4_AGGR -- RFC4893 ------------------------------- * @@ -1113,6 +1124,6 @@ VALUE(BGP_ATT_AS4_PATH_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; * * Takes the same form as an AS_AGGREGATOR for an AS4 speaker -- ie 4 byte ASN */ -VALUE(BGP_ATT_AS4_AGGR_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; +VALUE(BGP_ATT_AS4_AGGR_IS = BGP_AT_IS_OPTIONAL | BGP_AT_IS_TRANSITIVE) ; #endif /* _GMCH_BGP_H */ diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c index 31074e5a..607bf824 100644 --- a/bgpd/bgp_debug.c +++ b/bgpd/bgp_debug.c @@ -19,6 +19,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <zebra.h> +#include <stdbool.h> #include <lib/version.h> #include "prefix.h" @@ -28,6 +29,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #include "str.h" #include "log.h" #include "sockunion.h" +#include "memory.h" #include "bgpd/bgp_common.h" #include "bgpd/bgp_engine.h" @@ -101,70 +103,71 @@ const char *bgp_type_str[] = /* message for BGP-4 Notify */ static const struct message bgp_notify_msg[] = { - { BGP_NOTIFY_HEADER_ERR, "Message Header Error"}, - { BGP_NOTIFY_OPEN_ERR, "OPEN Message Error"}, - { BGP_NOTIFY_UPDATE_ERR, "UPDATE Message Error"}, - { BGP_NOTIFY_HOLD_ERR, "Hold Timer Expired"}, - { BGP_NOTIFY_FSM_ERR, "Finite State Machine Error"}, - { BGP_NOTIFY_CEASE, "Cease"}, - { BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error"}, + { BGP_NOTIFY_HEADER_ERR, "Message Header Error" }, + { BGP_NOTIFY_OPEN_ERR, "OPEN Message Error" }, + { BGP_NOTIFY_UPDATE_ERR, "UPDATE Message Error" }, + { BGP_NOTIFY_HOLD_ERR, "Hold Timer Expired" }, + { BGP_NOTIFY_FSM_ERR, "Finite State Machine Error" }, + { BGP_NOTIFY_CEASE, "Cease" }, + { BGP_NOTIFY_CAPABILITY_ERR, "CAPABILITY Message Error" }, }; static const int bgp_notify_msg_max = BGP_NOTIFY_MAX; static const struct message bgp_notify_head_msg[] = { - { BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized"}, - { BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length"}, - { BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type"} + { BGP_NOTIFY_HEADER_NOT_SYNC, "/Connection Not Synchronized" }, + { BGP_NOTIFY_HEADER_BAD_MESLEN, "/Bad Message Length" }, + { BGP_NOTIFY_HEADER_BAD_MESTYPE, "/Bad Message Type" } }; static const int bgp_notify_head_msg_max = BGP_NOTIFY_HEADER_MAX; static const struct message bgp_notify_open_msg[] = { - { BGP_NOTIFY_OPEN_UNSUP_VERSION, "/Unsupported Version Number" }, - { BGP_NOTIFY_OPEN_BAD_PEER_AS, "/Bad Peer AS"}, - { BGP_NOTIFY_OPEN_BAD_BGP_IDENT, "/Bad BGP Identifier"}, - { BGP_NOTIFY_OPEN_UNSUP_PARAM, "/Unsupported Optional Parameter"}, - { BGP_NOTIFY_OPEN_AUTH_FAILURE, "/Authentication Failure"}, - { BGP_NOTIFY_OPEN_UNACEP_HOLDTIME, "/Unacceptable Hold Time"}, - { BGP_NOTIFY_OPEN_UNSUP_CAPBL, "/Unsupported Capability"}, + { BGP_NOTIFY_OPEN_UNSUP_VERSION, "/Unsupported Version Number" }, + { BGP_NOTIFY_OPEN_BAD_PEER_AS, "/Bad Peer AS" }, + { BGP_NOTIFY_OPEN_BAD_BGP_IDENT, "/Bad BGP Identifier" }, + { BGP_NOTIFY_OPEN_UNSUP_PARAM, "/Unsupported Optional Parameter" }, + { BGP_NOTIFY_OPEN_AUTH_FAILURE, "/Authentication Failure" }, + { BGP_NOTIFY_OPEN_UNACEP_HOLDTIME, "/Unacceptable Hold Time" }, + { BGP_NOTIFY_OPEN_UNSUP_CAPBL, "/Unsupported Capability" }, }; static const int bgp_notify_open_msg_max = BGP_NOTIFY_OPEN_MAX; static const struct message bgp_notify_update_msg[] = { - { BGP_NOTIFY_UPDATE_MAL_ATTR, "/Malformed Attribute List"}, - { BGP_NOTIFY_UPDATE_UNREC_ATTR, "/Unrecognized Well-known Attribute"}, - { BGP_NOTIFY_UPDATE_MISS_ATTR, "/Missing Well-known Attribute"}, - { BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR, "/Attribute Flags Error"}, - { BGP_NOTIFY_UPDATE_ATTR_LENG_ERR, "/Attribute Length Error"}, - { BGP_NOTIFY_UPDATE_INVAL_ORIGIN, "/Invalid ORIGIN Attribute"}, - { BGP_NOTIFY_UPDATE_AS_ROUTE_LOOP, "/AS Routing Loop"}, - { BGP_NOTIFY_UPDATE_INVAL_NEXT_HOP, "/Invalid NEXT_HOP Attribute"}, - { BGP_NOTIFY_UPDATE_OPT_ATTR_ERR, "/Optional Attribute Error"}, - { BGP_NOTIFY_UPDATE_INVAL_NETWORK, "/Invalid Network Field"}, - { BGP_NOTIFY_UPDATE_MAL_AS_PATH, "/Malformed AS_PATH"}, + { BGP_NOTIFY_UPDATE_MAL_ATTR, "/Malformed Attribute List" }, + { BGP_NOTIFY_UPDATE_UNREC_ATTR, "/Unrecognized Well-known Attribute" }, + { BGP_NOTIFY_UPDATE_MISS_ATTR, "/Missing Well-known Attribute" }, + { BGP_NOTIFY_UPDATE_ATTR_FLAG_ERR, "/Attribute Flags Error" }, + { BGP_NOTIFY_UPDATE_ATTR_LENG_ERR, "/Attribute Length Error" }, + { BGP_NOTIFY_UPDATE_INVAL_ORIGIN, "/Invalid ORIGIN Attribute" }, + { BGP_NOTIFY_UPDATE_AS_ROUTE_LOOP, "/AS Routing Loop" }, + { BGP_NOTIFY_UPDATE_INVAL_NEXT_HOP, "/Invalid NEXT_HOP Attribute" }, + { BGP_NOTIFY_UPDATE_OPT_ATTR_ERR, "/Optional Attribute Error" }, + { BGP_NOTIFY_UPDATE_INVAL_NETWORK, "/Invalid Network Field" }, + { BGP_NOTIFY_UPDATE_MAL_AS_PATH, "/Malformed AS_PATH" }, }; static const int bgp_notify_update_msg_max = BGP_NOTIFY_UPDATE_MAX; static const struct message bgp_notify_cease_msg[] = { - { BGP_NOTIFY_CEASE_MAX_PREFIX, "/Maximum Number of Prefixes Reached"}, - { BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, "/Administratively Shutdown"}, - { BGP_NOTIFY_CEASE_PEER_UNCONFIG, "/Peer Unconfigured"}, - { BGP_NOTIFY_CEASE_ADMIN_RESET, "/Administratively Reset"}, - { BGP_NOTIFY_CEASE_CONNECT_REJECT, "/Connection Rejected"}, - { BGP_NOTIFY_CEASE_CONFIG_CHANGE, "/Other Configuration Change"}, - { BGP_NOTIFY_CEASE_COLLISION_RESOLUTION, "/Connection collision resolution"}, - { BGP_NOTIFY_CEASE_OUT_OF_RESOURCE, "/Out of Resource"}, + { BGP_NOTIFY_CEASE_MAX_PREFIX, "/Maximum Number of Prefixes Reached" }, + { BGP_NOTIFY_CEASE_ADMIN_SHUTDOWN, "/Administratively Shutdown" }, + { BGP_NOTIFY_CEASE_PEER_UNCONFIG, "/Peer Unconfigured" }, + { BGP_NOTIFY_CEASE_ADMIN_RESET, "/Administratively Reset" }, + { BGP_NOTIFY_CEASE_CONNECT_REJECT, "/Connection Rejected" }, + { BGP_NOTIFY_CEASE_CONFIG_CHANGE, "/Other Configuration Change" }, + { BGP_NOTIFY_CEASE_COLLISION_RESOLUTION, "/Connection collision resolution" }, + { BGP_NOTIFY_CEASE_OUT_OF_RESOURCE, "/Out of Resource" }, }; static const int bgp_notify_cease_msg_max = BGP_NOTIFY_CEASE_MAX; static const struct message bgp_notify_capability_msg[] = { - { BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value" }, - { BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length"}, - { BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value"}, + { BGP_NOTIFY_CAPABILITY_INVALID_ACTION, "/Invalid Action Value" }, + { BGP_NOTIFY_CAPABILITY_INVALID_LENGTH, "/Invalid Capability Length" }, + { BGP_NOTIFY_CAPABILITY_MALFORMED_CODE, "/Malformed Capability Value" }, + { 4, "/Unsupported Capability" } }; static const int bgp_notify_capability_msg_max = BGP_NOTIFY_CAPABILITY_MAX; @@ -251,23 +254,38 @@ bgp_dump_attr (struct peer *peer, struct attr *attr, char *buf, size_t size) /* dump notify packet */ void -bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify, - const char *direct) -{ - const char *subcode_str; +bgp_notify_print(struct peer *peer, bgp_notify notification, bool sending) +{ + const char* subcode_str ; + const char* code_str ; + const char* hex_form ; + bool log_neighbor_changes ; + int length ; + char* alloc ; + + /* See if we need to do any of this */ + if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) + log_neighbor_changes = true ; + else if (BGP_DEBUG (normal, NORMAL)) + log_neighbor_changes = false ; + else + return ; /* quit if nothing to do */ + + /* Sort out string forms of code and subcode */ + code_str = LOOKUP (bgp_notify_msg, notification->code) ; subcode_str = ""; - switch (bgp_notify->code) + switch (notification->code) { case BGP_NOTIFY_HEADER_ERR: - subcode_str = LOOKUP (bgp_notify_head_msg, bgp_notify->subcode); + subcode_str = LOOKUP (bgp_notify_head_msg, notification->subcode); break; case BGP_NOTIFY_OPEN_ERR: - subcode_str = LOOKUP (bgp_notify_open_msg, bgp_notify->subcode); + subcode_str = LOOKUP (bgp_notify_open_msg, notification->subcode); break; case BGP_NOTIFY_UPDATE_ERR: - subcode_str = LOOKUP (bgp_notify_update_msg, bgp_notify->subcode); + subcode_str = LOOKUP (bgp_notify_update_msg, notification->subcode); break; case BGP_NOTIFY_HOLD_ERR: subcode_str = ""; @@ -276,28 +294,54 @@ bgp_notify_print(struct peer *peer, struct bgp_notify *bgp_notify, subcode_str = ""; break; case BGP_NOTIFY_CEASE: - subcode_str = LOOKUP (bgp_notify_cease_msg, bgp_notify->subcode); + subcode_str = LOOKUP (bgp_notify_cease_msg, notification->subcode); break; case BGP_NOTIFY_CAPABILITY_ERR: - subcode_str = LOOKUP (bgp_notify_capability_msg, bgp_notify->subcode); + subcode_str = LOOKUP (bgp_notify_capability_msg, notification->subcode); break; } - if (bgp_flag_check (peer->bgp, BGP_FLAG_LOG_NEIGHBOR_CHANGES)) + /* Construct hex_form of data, if required. */ + length = bgp_notify_get_length(notification) ; + if (length != 0) + { + const char* form ; + uint8_t* p = bgp_notify_get_data(notification) ; + uint8_t* e = p + length ; + char* q ; + + hex_form = alloc = q = XMALLOC(MTYPE_TMP, (length * 3) + 1) ; + + form = "%02x" ; + while (p < e) + { + int n = snprintf (q, 4, form, *p++) ; + q += n ; + form = " %02x" ; + } ; + } + else + { + hex_form = "" ; + alloc = NULL ; + } ; + + /* Output the required logging */ + if (log_neighbor_changes) zlog_info ("%%NOTIFICATION: %s neighbor %s %d/%d (%s%s) %d bytes %s", - strcmp (direct, "received") == 0 ? "received from" : "sent to", - peer->host, bgp_notify->code, bgp_notify->subcode, - LOOKUP (bgp_notify_msg, bgp_notify->code), - subcode_str, bgp_notify->length, - bgp_notify->size ? (const char*)bgp_notify->data : ""); - else if (BGP_DEBUG (normal, NORMAL)) + sending ? "sent to" : "received from", peer->host, + notification->code, notification->subcode, + code_str, subcode_str, length, hex_form) ; + else plog_debug (peer->log, "%s %s NOTIFICATION %d/%d (%s%s) %d bytes %s", - peer ? peer->host : "", - direct, bgp_notify->code, bgp_notify->subcode, - LOOKUP (bgp_notify_msg, bgp_notify->code), - subcode_str, bgp_notify->length, - bgp_notify->size ? (const char*)bgp_notify->data : ""); -} + peer->host, sending ? "sending" : "received", + notification->code, notification->subcode, + code_str, subcode_str, length, hex_form) ; + + /* Release the */ + if (alloc != NULL) + XFREE(MTYPE_TMP, alloc) ; +} ; /* Debug option setting interface. */ unsigned long bgp_debug_option = 0; diff --git a/bgpd/bgp_debug.h b/bgpd/bgp_debug.h index 9a7d7d80..1d05cefb 100644 --- a/bgpd/bgp_debug.h +++ b/bgpd/bgp_debug.h @@ -22,6 +22,7 @@ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA #define _QUAGGA_BGP_DEBUG_H #include "bgp_attr.h" +#include "stdbool.h" /* sort of packet direction */ #define DUMP_ON 1 @@ -120,7 +121,8 @@ extern unsigned long term_bgp_debug_zebra; extern const char *bgp_type_str[]; extern int bgp_dump_attr (struct peer *, struct attr *, char *, size_t); -extern void bgp_notify_print (struct peer *, struct bgp_notify *, const char *); +extern void bgp_notify_print (struct peer* peer, bgp_notify notification, + bool sending); extern const struct message bgp_status_msg[]; extern const int bgp_status_msg_max; diff --git a/bgpd/bgp_msg_read.c b/bgpd/bgp_msg_read.c index 7e55bf70..664aed21 100644 --- a/bgpd/bgp_msg_read.c +++ b/bgpd/bgp_msg_read.c @@ -1411,14 +1411,19 @@ bgp_msg_keepalive_receive (bgp_connection connection, bgp_size_t body_size) static void bgp_msg_notify_receive (bgp_connection connection, bgp_size_t body_size) { + bgp_notify notification ; + bgp_nom_code_t code = stream_getc (connection->ibuf); bgp_nom_subcode_t subcode = stream_getc (connection->ibuf); ++connection->session->stats.notify_in ; - bgp_fsm_notification_exception(connection, - bgp_notify_new_with_data(code, subcode, - stream_pnt(connection->ibuf), body_size - 2)) ; + notification = bgp_notify_new_with_data(code, subcode, + stream_pnt(connection->ibuf), body_size - 2) ; + + bgp_notify_print(connection->session->peer, notification, 0) ; /* Logging */ + + bgp_fsm_notification_exception(connection, notification) ; } ; /*============================================================================== diff --git a/bgpd/bgp_msg_write.c b/bgpd/bgp_msg_write.c index 1fdb4e7a..0323fa83 100644 --- a/bgpd/bgp_msg_write.c +++ b/bgpd/bgp_msg_write.c @@ -91,6 +91,9 @@ bgp_msg_write_notification(bgp_connection connection, bgp_notify notification) assert(notification != NULL) ; + /* Logging */ + bgp_notify_print(connection->session->peer, notification, 1) ; + /* Make NOTIFY message header */ bgp_packet_set_marker (s, BGP_MSG_NOTIFY); @@ -106,43 +109,6 @@ bgp_msg_write_notification(bgp_connection connection, bgp_notify notification) /* Set and get BGP packet length. */ length = bgp_packet_set_size(s); - /* Logging */ - if (BGP_DEBUG (normal, NORMAL)) - zlog_debug("%s send message type %d, length (incl. header) %d", - connection->host, BGP_MSG_NOTIFY, length) ; - - /* For debug */ - { - bgp_notify text_form ; - const char* form ; - char c[4] ; - uint8_t* p ; - - length = bgp_notify_get_length(notification) ; - p = bgp_notify_get_data(notification) ; - - /* Make new copy of notification, with data portion large enough - * for the data rendered as hex characters. - */ - text_form = bgp_notify_new_expect(bgp_notify_get_code(notification), - bgp_notify_get_subcode(notification), - (length * 3)) ; - form = "%02x" ; - while (length--) - { - snprintf (c, 4, form, *p++) ; - bgp_notify_append_data(text_form, c, strlen(c)) ; - form = " %02x" ; - } ; - bgp_notify_append_data(text_form, "\0", 1) ; - - /* TODO: restore bgp_notify_print */ -#if 0 - bgp_notify_print(peer, text_form, "sending") ; -#endif - bgp_notify_free(text_form) ; - } ; - /* Set flag so that write_action raises required event when buffer becomes * empty. */ diff --git a/bgpd/bgp_session.c b/bgpd/bgp_session.c index e1cb103d..1334298e 100644 --- a/bgpd/bgp_session.c +++ b/bgpd/bgp_session.c @@ -445,16 +445,6 @@ bgp_session_do_disable(mqueue_block mqb, mqb_flag_t flag) /* Immediately discard any other messages for this session. */ mqueue_revoke(bgp_nexus->queue, session) ; - /* For debug */ - if (args->notification != NULL) - { - bgp_notify_print (session->peer, args->notification, "sending"); - - if (BGP_DEBUG (normal, NORMAL)) - zlog_debug ("%s send message type %d, length (incl. header) %d", - session->host, BGP_MSG_NOTIFY, args->notification->length); - } ; - /* Get the FSM to send any notification and close connections */ bgp_fsm_disable_session(session, args->notification) ; } diff --git a/lib/memory.c b/lib/memory.c index fb0e8d0d..5ee33aa8 100644 --- a/lib/memory.c +++ b/lib/memory.c @@ -587,7 +587,7 @@ DEFUN_CALL (show_memory_summary, LOCK ; for (mtype = 1 ; mtype < MTYPE_MAX ; ++mtype) - alloc += mstat[mtype] ; + alloc += mstat.mt[mtype].alloc ; UNLOCK vty_out(vty, "%ld items allocated%s", alloc, VTY_NEWLINE) ; diff --git a/lib/memory.h b/lib/memory.h index d67e865b..6c95d73a 100644 --- a/lib/memory.h +++ b/lib/memory.h @@ -56,7 +56,9 @@ extern struct mlist mlists[]; mtype_zstrdup (__FILE__, __LINE__, (mtype), (str)) #else +#ifdef QDEBUG #define MEMORY_TRACKER 1 +#endif #ifdef MEMORY_TRACKER #define MEMORY_TRACKER_NAME , const char* name |