summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bgpd/bgp.h503
-rw-r--r--bgpd/bgp_debug.c168
-rw-r--r--bgpd/bgp_debug.h4
-rw-r--r--bgpd/bgp_msg_read.c11
-rw-r--r--bgpd/bgp_msg_write.c40
-rw-r--r--bgpd/bgp_session.c10
-rw-r--r--lib/memory.c2
-rw-r--r--lib/memory.h2
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 <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