diff options
| author | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2020-10-04 18:02:24 -0300 | 
|---|---|---|
| committer | Rafael Zalamena <rzalamena@opensourcerouting.org> | 2020-11-08 12:06:32 -0300 | 
| commit | 4b983eef2cb5c7306a8303f002d0e053ebeabdca (patch) | |
| tree | 83a4873c51fc08c08040696165cba802a94cfd00 /bfdd/ptm_adapter.c | |
| parent | 9929134ab807603a6598dafad54f27fa10ea59c3 (diff) | |
bfdd,lib: simplify integration protocol
Let the integration protocol always send the full configuration
instead of saving a few bytes. It will also allow protocols to specify
source address for IPv4 single hop connections and interface for multi
hop configuration.
Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
Diffstat (limited to 'bfdd/ptm_adapter.c')
| -rw-r--r-- | bfdd/ptm_adapter.c | 112 | 
1 files changed, 64 insertions, 48 deletions
diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c index 3a80d9203b..eef88af754 100644 --- a/bfdd/ptm_adapter.c +++ b/bfdd/ptm_adapter.c @@ -307,6 +307,8 @@ static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,  	/*  	 * Register/Deregister/Update Message format: +	 * +	 * Old format (being used by PTM BFD).  	 * - header: Command, VRF  	 * - l: pid  	 * - w: family @@ -322,16 +324,37 @@ static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,  	 *   - multihop:  	 *     - w: family  	 *       - AF_INET: -	 *         - l: destination ipv4 +	 *         - l: source IPv4 address  	 *       - AF_INET6: -	 *         - 16 bytes: destination IPv6 +	 *         - 16 bytes: source IPv6 address  	 *     - c: ttl  	 *   - no multihop  	 *     - AF_INET6:  	 *       - w: family -	 *       - 16 bytes: ipv6 address +	 *       - 16 bytes: source IPv6 address  	 *     - c: ifname length  	 *     - X bytes: interface name +	 * +	 * New format: +	 * - header: Command, VRF +	 * - l: pid +	 * - w: family +	 *   - AF_INET: +	 *     - l: destination IPv4 address +	 *   - AF_INET6: +	 *     - 16 bytes: destination IPv6 address +	 * - l: min_rx +	 * - l: min_tx +	 * - c: detect multiplier +	 * - c: is_multihop? +	 * - w: family +	 *   - AF_INET: +	 *     - l: source IPv4 address +	 *   - AF_INET6: +	 *     - 16 bytes: source IPv6 address +	 * - c: ttl +	 * - c: ifname length +	 * - X bytes: interface name  	 * - c: bfd_cbit  	 * - c: profile name length.  	 * - X bytes: profile name. @@ -355,58 +378,50 @@ static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,  	bpc->bpc_ipv4 = (bpc->bpc_peer.sa_sin.sin_family == AF_INET);  	/* Get peer configuration. */ -	if (command != ZEBRA_BFD_DEST_DEREGISTER) { -		STREAM_GETL(msg, bpc->bpc_recvinterval); -		bpc->bpc_has_recvinterval = -			(bpc->bpc_recvinterval != BPC_DEF_RECEIVEINTERVAL); - -		STREAM_GETL(msg, bpc->bpc_txinterval); -		bpc->bpc_has_txinterval = -			(bpc->bpc_txinterval != BPC_DEF_TRANSMITINTERVAL); - -		STREAM_GETC(msg, bpc->bpc_detectmultiplier); -		bpc->bpc_has_detectmultiplier = -			(bpc->bpc_detectmultiplier != BPC_DEF_DETECTMULTIPLIER); -	} +	STREAM_GETL(msg, bpc->bpc_recvinterval); +	bpc->bpc_has_recvinterval = +		(bpc->bpc_recvinterval != BPC_DEF_RECEIVEINTERVAL); + +	STREAM_GETL(msg, bpc->bpc_txinterval); +	bpc->bpc_has_txinterval = +		(bpc->bpc_txinterval != BPC_DEF_TRANSMITINTERVAL); + +	STREAM_GETC(msg, bpc->bpc_detectmultiplier); +	bpc->bpc_has_detectmultiplier = +		(bpc->bpc_detectmultiplier != BPC_DEF_DETECTMULTIPLIER);  	/* Read (single|multi)hop and its options. */  	STREAM_GETC(msg, bpc->bpc_mhop); -	if (bpc->bpc_mhop) { -		/* Read multihop source address and TTL. */ -		_ptm_msg_read_address(msg, &bpc->bpc_local); -		STREAM_GETC(msg, bpc->bpc_minimum_ttl); -		if (bpc->bpc_minimum_ttl >= BFD_TTL_VAL -		    || bpc->bpc_minimum_ttl == 0) { -			zlog_warn("%s: received invalid TTL configuration %d", -				  __func__, bpc->bpc_has_minimum_ttl); -			bpc->bpc_minimum_ttl = BFD_DEF_MHOP_TTL; -			bpc->bpc_has_minimum_ttl = false; -		} else { -			bpc->bpc_minimum_ttl = -				(BFD_TTL_VAL + 1) - bpc->bpc_minimum_ttl; -			bpc->bpc_has_minimum_ttl = true; -		} + +	/* Read multihop source address and TTL. */ +	_ptm_msg_read_address(msg, &bpc->bpc_local); + +	/* Read the minimum TTL (0 means unset or invalid). */ +	STREAM_GETC(msg, bpc->bpc_minimum_ttl); +	if (bpc->bpc_minimum_ttl == 0) { +		bpc->bpc_minimum_ttl = BFD_DEF_MHOP_TTL; +		bpc->bpc_has_minimum_ttl = false;  	} else { -		/* If target is IPv6, then we must obtain local address. */ -		if (bpc->bpc_ipv4 == false) -			_ptm_msg_read_address(msg, &bpc->bpc_local); +		bpc->bpc_minimum_ttl = (BFD_TTL_VAL + 1) - bpc->bpc_minimum_ttl; +		bpc->bpc_has_minimum_ttl = true; +	} -		/* -		 * Read interface name and make sure it fits our data -		 * structure, otherwise fail. -		 */ -		STREAM_GETC(msg, ifnamelen); -		if (ifnamelen >= sizeof(bpc->bpc_localif)) { -			zlog_err("ptm-read: interface name is too big"); -			return -1; -		} +	/* +	 * Read interface name and make sure it fits our data +	 * structure, otherwise fail. +	 */ +	STREAM_GETC(msg, ifnamelen); +	if (ifnamelen >= sizeof(bpc->bpc_localif)) { +		zlog_err("ptm-read: interface name is too big"); +		return -1; +	} -		bpc->bpc_has_localif = ifnamelen > 0; -		if (bpc->bpc_has_localif) { -			STREAM_GET(bpc->bpc_localif, msg, ifnamelen); -			bpc->bpc_localif[ifnamelen] = 0; -		} +	bpc->bpc_has_localif = ifnamelen > 0; +	if (bpc->bpc_has_localif) { +		STREAM_GET(bpc->bpc_localif, msg, ifnamelen); +		bpc->bpc_localif[ifnamelen] = 0;  	} +  	if (vrf_id != VRF_DEFAULT) {  		struct vrf *vrf; @@ -424,6 +439,7 @@ static int _ptm_msg_read(struct stream *msg, int command, vrf_id_t vrf_id,  		strlcpy(bpc->bpc_vrfname, VRF_DEFAULT_NAME, sizeof(bpc->bpc_vrfname));  	} +	/* Read control plane independant configuration. */  	STREAM_GETC(msg, bpc->bpc_cbit);  	/* Handle profile names. */  | 
