forked from Mirror/frr
bgpd: Handle Role capability via dynamic capabilities for SET/UNSET properly
It was missed to handle UNSET Role capability using dynamic capabilities. Also move length check before actually handling Role capability. Signed-off-by: Donatas Abraitis <donatas@opensourcerouting.org>
This commit is contained in:
parent
c4e030ac87
commit
5ad080d37a
|
@ -2899,7 +2899,6 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
|
||||||
case CAPABILITY_CODE_EXT_MESSAGE:
|
case CAPABILITY_CODE_EXT_MESSAGE:
|
||||||
break;
|
break;
|
||||||
case CAPABILITY_CODE_ROLE:
|
case CAPABILITY_CODE_ROLE:
|
||||||
SET_FLAG(peer->cap, PEER_CAP_ROLE_RCV);
|
|
||||||
if (hdr->length != CAPABILITY_CODE_ROLE_LEN) {
|
if (hdr->length != CAPABILITY_CODE_ROLE_LEN) {
|
||||||
flog_warn(EC_BGP_CAPABILITY_INVALID_LENGTH,
|
flog_warn(EC_BGP_CAPABILITY_INVALID_LENGTH,
|
||||||
"Role: Received invalid length %d",
|
"Role: Received invalid length %d",
|
||||||
|
@ -2908,11 +2907,17 @@ static int bgp_capability_msg_parse(struct peer *peer, uint8_t *pnt,
|
||||||
BGP_NOTIFY_SUBCODE_UNSPECIFIC);
|
BGP_NOTIFY_SUBCODE_UNSPECIFIC);
|
||||||
return BGP_Stop;
|
return BGP_Stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t role;
|
uint8_t role;
|
||||||
|
|
||||||
memcpy(&role, pnt + 3, sizeof(role));
|
if (action == CAPABILITY_ACTION_SET) {
|
||||||
|
SET_FLAG(peer->cap, PEER_CAP_ROLE_RCV);
|
||||||
|
memcpy(&role, pnt + 3, sizeof(role));
|
||||||
|
|
||||||
peer->remote_role = role;
|
peer->remote_role = role;
|
||||||
|
} else {
|
||||||
|
UNSET_FLAG(peer->cap, PEER_CAP_ROLE_RCV);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
flog_warn(
|
flog_warn(
|
||||||
|
|
Loading…
Reference in a new issue