From 76c460a85aa0aea7dc90948f3b52979d09f94812 Mon Sep 17 00:00:00 2001 From: Chris Hall Date: Thu, 13 May 2010 23:50:16 +0100 Subject: Reinstate NOTIFICATION logging and turn off Memory Tracker In the introduction of the BGP Engine the logging of NOTIFICATION messages fell by the wayside. This change reinstates that logging. This change also turns off the Memory Tracker, unless QDEBUG is defined. --- bgpd/bgp.h | 503 ++++++++++++++++++++++++++------------------------- bgpd/bgp_debug.c | 168 ++++++++++------- bgpd/bgp_debug.h | 4 +- bgpd/bgp_msg_read.c | 11 +- bgpd/bgp_msg_write.c | 40 +--- bgpd/bgp_session.c | 10 - lib/memory.c | 2 +- lib/memory.h | 2 + 8 files changed, 380 insertions(+), 360 deletions(-) diff --git a/bgpd/bgp.h b/bgpd/bgp.h index 9edf51f4..55cf0d2d 100644 --- a/bgpd/bgp.h +++ b/bgpd/bgp.h @@ -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 +#include #include #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 -- cgit v1.2.3