diff options
author | Satoshi Fujimoto <satoshi.fujimoto7@gmail.com> | 2017-08-04 15:15:01 +0900 |
---|---|---|
committer | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2017-09-29 15:05:43 +0900 |
commit | f662b657abc3341d32eeba302d776ecada28e852 (patch) | |
tree | bdcb9f74c47e7051201b00a62c765fd42ff311b1 /packet/bgp/validate.go | |
parent | 9b278ba79ba2d12598405d1109b0b90b42e68357 (diff) |
bgp/validate: Check Wellknown Attributes exist with MultiProtocol
RFC4760 says "An UPDATE message that carries the MP_REACH_NLRI
MUST also carry the ORIGIN and the AS_PATH attributes".
This patch adds a validation to comply with it.
Signed-off-by: Satoshi Fujimoto <satoshi.fujimoto7@gmail.com>
Diffstat (limited to 'packet/bgp/validate.go')
-rw-r--r-- | packet/bgp/validate.go | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/packet/bgp/validate.go b/packet/bgp/validate.go index 77a125b9..be44e605 100644 --- a/packet/bgp/validate.go +++ b/packet/bgp/validate.go @@ -37,7 +37,7 @@ func ValidateUpdateMsg(m *BGPUpdate, rfs map[RouteFamily]BGPAddPathMode, doConfe } } - if len(m.NLRI) > 0 { + if _, ok := seen[BGP_ATTR_TYPE_MP_REACH_NLRI]; ok || len(m.NLRI) > 0 { // check the existence of well-known mandatory attributes exist := func(attrs []BGPAttrType) (bool, BGPAttrType) { for _, attr := range attrs { @@ -48,7 +48,10 @@ func ValidateUpdateMsg(m *BGPUpdate, rfs map[RouteFamily]BGPAddPathMode, doConfe } return true, 0 } - mandatory := []BGPAttrType{BGP_ATTR_TYPE_ORIGIN, BGP_ATTR_TYPE_AS_PATH, BGP_ATTR_TYPE_NEXT_HOP} + mandatory := []BGPAttrType{BGP_ATTR_TYPE_ORIGIN, BGP_ATTR_TYPE_AS_PATH} + if len(m.NLRI) > 0 { + mandatory = append(mandatory, BGP_ATTR_TYPE_NEXT_HOP) + } if ok, t := exist(mandatory); !ok { eMsg := "well-known mandatory attributes are not present. type : " + strconv.Itoa(int(t)) data := []byte{byte(t)} |