From: pcarana Date: Fri, 22 Feb 2019 15:20:18 +0000 (-0600) Subject: Add VRP flags to use at IPvx prefix PDU, and update PDU header length X-Git-Tag: v0.0.2~52^2~57 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f6891db7872173e9afaa319a774942d78f7861ae;p=thirdparty%2FFORT-validator.git Add VRP flags to use at IPvx prefix PDU, and update PDU header length --- diff --git a/src/rtr/pdu_sender.c b/src/rtr/pdu_sender.c index ecb8dcf3..eadee39e 100644 --- a/src/rtr/pdu_sender.c +++ b/src/rtr/pdu_sender.c @@ -11,8 +11,8 @@ #include "pdu.h" #include "pdu_serializer.h" -/* Header without length field is always 32 bits long */ -#define HEADER_LENGTH 4 +/* Header length field is always 64 bits long */ +#define HEADER_LENGTH 8 /* IPvN PDUs length without header */ #define IPV4_PREFIX_LENGTH 12 #define IPV6_PREFIX_LENGTH 24 @@ -29,19 +29,10 @@ set_header_values(struct pdu_header *header, u_int8_t version, u_int8_t type, header->reserved = reserved; } -static u_int32_t -length_cache_response_pdu(struct cache_response_pdu *pdu) -{ - /* This PDU has no payload, consider 32 bits of the length field */ - return HEADER_LENGTH + sizeof(u_int32_t); -} - static u_int32_t length_ipvx_prefix_pdu(bool isv4) { - /* Consider 32 bits of the length field */ - return HEADER_LENGTH + sizeof(u_int32_t) + - (isv4 ? IPV4_PREFIX_LENGTH : IPV6_PREFIX_LENGTH); + return HEADER_LENGTH + (isv4 ? IPV4_PREFIX_LENGTH : IPV6_PREFIX_LENGTH); } static u_int32_t @@ -49,8 +40,7 @@ length_end_of_data_pdu(struct end_of_data_pdu *pdu) { u_int32_t len; - /* Consider 32 bits of the length field */ - len = HEADER_LENGTH + sizeof(u_int32_t); + len = HEADER_LENGTH; len += sizeof(pdu->serial_number); if (pdu->header.protocol_version == RTR_V1) { len += sizeof(pdu->refresh_interval); @@ -95,9 +85,10 @@ send_cache_response_pdu(int fd, u_int8_t version, u_int16_t session_id) char data[BUFFER_SIZE]; size_t len; + /* This PDU has only the header */ set_header_values(&pdu.header, version, CACHE_RESPONSE_PDU_TYPE, session_id); - pdu.header.length = length_cache_response_pdu(&pdu); + pdu.header.length = HEADER_LENGTH; len = serialize_cache_response_pdu(&pdu, data); /* TODO wait for the ACK? */ @@ -113,8 +104,8 @@ send_ipv4_prefix_pdu(int fd, u_int8_t version, u_int32_t serial, size_t len; set_header_values(&pdu.header, version, IPV4_PREFIX_PDU_TYPE, 0); - /* TODO FLAGS!! Hardcoded 1 to send announcement */ - pdu.flags = 1; + + pdu.flags = vrp->flags; pdu.prefix_length = vrp->prefix_length; pdu.max_length = vrp->max_prefix_length; pdu.zero = 0; @@ -136,8 +127,8 @@ send_ipv6_prefix_pdu(int fd, u_int8_t version, u_int32_t serial, size_t len; set_header_values(&pdu.header, version, IPV6_PREFIX_PDU_TYPE, 0); - /* TODO FLAGS!! Hardcoded 1 to send announcement */ - pdu.flags = 1; + + pdu.flags = vrp->flags; pdu.prefix_length = vrp->prefix_length; pdu.max_length = vrp->max_prefix_length; pdu.zero = 0; diff --git a/src/vrps.c b/src/vrps.c index 111484fc..343e5e2a 100644 --- a/src/vrps.c +++ b/src/vrps.c @@ -2,6 +2,9 @@ #include "array_list.h" +#define FLAG_WITHDRAWAL 0 +#define FLAG_ANNOUNCEMENT 1 + ARRAY_LIST(delta, struct vrp *) ARRAY_LIST(deltasdb, struct delta) @@ -51,6 +54,7 @@ create_vrp (u_int32_t asn, u_int8_t prefix_length, u_int8_t max_prefix_length) { result->asn = asn; result->prefix_length = prefix_length; result->max_prefix_length = max_prefix_length; + result->flags = FLAG_ANNOUNCEMENT; return result; } diff --git a/src/vrps.h b/src/vrps.h index 91ab1d61..a5a6e5f4 100644 --- a/src/vrps.h +++ b/src/vrps.h @@ -12,6 +12,7 @@ struct vrp { u_int8_t prefix_length; u_int8_t max_prefix_length; u_int8_t in_addr_len; + u_int8_t flags; }; struct delta;