summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/flowspec.c10
-rw-r--r--lib/net.h4
-rw-r--r--proto/bgp/packets.c28
3 files changed, 18 insertions, 24 deletions
diff --git a/lib/flowspec.c b/lib/flowspec.c
index ef19aa96..42770c50 100644
--- a/lib/flowspec.c
+++ b/lib/flowspec.c
@@ -436,7 +436,6 @@ flow_validate(const byte *nlri, uint len, int ipv6)
enum flow_type type = 0;
const byte *pos = nlri;
const byte *end = nlri + len;
- int met_dst_pfx = 0;
while (pos < end)
{
@@ -448,8 +447,6 @@ flow_validate(const byte *nlri, uint len, int ipv6)
switch (type)
{
case FLOW_TYPE_DST_PREFIX:
- met_dst_pfx = 1;
- /* Fall through */
case FLOW_TYPE_SRC_PREFIX:
{
uint pxlen = *pos++;
@@ -556,9 +553,6 @@ flow_validate(const byte *nlri, uint len, int ipv6)
if (pos != end)
return FLOW_ST_NOT_COMPLETE;
- if (!ipv6 && !met_dst_pfx)
- return FLOW_ST_DEST_PREFIX_REQUIRED;
-
return FLOW_ST_VALID;
}
@@ -875,7 +869,7 @@ flow_builder4_finalize(struct flow_builder *fb, linpool *lpool)
{
byte *part = fb->data.data + fb->parts[FLOW_TYPE_DST_PREFIX].offset;
prefix = flow_read_ip4_part(part);
- pxlen = part[1];
+ pxlen = flow_read_pxlen(part);
}
*f = NET_ADDR_FLOW4(prefix, pxlen, data_len);
@@ -905,7 +899,7 @@ flow_builder6_finalize(struct flow_builder *fb, linpool *lpool)
{
byte *part = fb->data.data + fb->parts[FLOW_TYPE_DST_PREFIX].offset;
prefix = flow_read_ip6_part(part);
- pxlen = part[1];
+ pxlen = flow_read_pxlen(part);
}
*n = NET_ADDR_FLOW6(prefix, pxlen, data_len);
diff --git a/lib/net.h b/lib/net.h
index 0cd5f735..8eb4c7b9 100644
--- a/lib/net.h
+++ b/lib/net.h
@@ -174,10 +174,10 @@ extern const u16 net_max_text_length[];
((net_addr_roa6) { NET_ROA6, pxlen, sizeof(net_addr_roa6), prefix, max_pxlen, asn })
#define NET_ADDR_FLOW4(prefix,pxlen,dlen) \
- ((net_addr_flow4) { NET_FLOW4, pxlen, sizeof(net_addr_ip4) + dlen, prefix })
+ ((net_addr_flow4) { NET_FLOW4, pxlen, sizeof(net_addr_flow4) + dlen, prefix })
#define NET_ADDR_FLOW6(prefix,pxlen,dlen) \
- ((net_addr_flow6) { NET_FLOW6, pxlen, sizeof(net_addr_ip6) + dlen, prefix })
+ ((net_addr_flow6) { NET_FLOW6, pxlen, sizeof(net_addr_flow6) + dlen, prefix })
#define NET_ADDR_IP6_SADR(dst_prefix,dst_pxlen,src_prefix,src_pxlen) \
((net_addr_ip6_sadr) { NET_IP6_SADR, dst_pxlen, sizeof(net_addr_ip6_sadr), dst_prefix, src_pxlen, src_prefix })
diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c
index ed878e41..ee031c05 100644
--- a/proto/bgp/packets.c
+++ b/proto/bgp/packets.c
@@ -1824,15 +1824,15 @@ bgp_decode_nlri_flow4(struct bgp_parse_state *s, byte *pos, uint len, rta *a)
bgp_parse_error(s, 1);
}
- if (data[0] != FLOW_TYPE_DST_PREFIX)
- {
- log(L_REMOTE "%s: No dst prefix at first pos", s->proto->p.name);
- bgp_parse_error(s, 1);
- }
+ ip4_addr px = IP4_NONE;
+ uint pxlen = 0;
/* Decode dst prefix */
- ip4_addr px = flow_read_ip4_part(data);
- uint pxlen = data[1];
+ if (data[0] == FLOW_TYPE_DST_PREFIX)
+ {
+ px = flow_read_ip4_part(data);
+ pxlen = flow_read_pxlen(data);
+ }
/* Prepare the flow */
net_addr *n = alloca(sizeof(struct net_addr_flow4) + flen);
@@ -1912,15 +1912,15 @@ bgp_decode_nlri_flow6(struct bgp_parse_state *s, byte *pos, uint len, rta *a)
bgp_parse_error(s, 1);
}
- if (data[0] != FLOW_TYPE_DST_PREFIX)
- {
- log(L_REMOTE "%s: No dst prefix at first pos", s->proto->p.name);
- bgp_parse_error(s, 1);
- }
+ ip6_addr px = IP6_NONE;
+ uint pxlen = 0;
/* Decode dst prefix */
- ip6_addr px = flow_read_ip6_part(data);
- uint pxlen = data[1];
+ if (data[0] == FLOW_TYPE_DST_PREFIX)
+ {
+ px = flow_read_ip6_part(data);
+ pxlen = flow_read_pxlen(data);
+ }
/* Prepare the flow */
net_addr *n = alloca(sizeof(struct net_addr_flow6) + flen);