flow: check ip family when comparing

Ticket: 8558

Do not accept an IPv6 as an IPv4 (even if the hash is likely
different in the first place)

Do the check also for ESP, and ebpf

(cherry picked from commit bc41dcc854)
pull/15826/head
Philippe Antoine 5 months ago
parent 5cde93dea3
commit 181b3b2fdd

@ -412,7 +412,9 @@ static inline bool CmpFlowPacket(const Flow *f, const Packet *p)
const uint32_t *p_dst = p->dst.address.address_un_data32;
return CmpAddrsAndPorts(f_src, f_dst, f->sp, f->dp, p_src, p_dst, p->sp, p->dp) &&
f->proto == p->proto && f->recursion_level == p->recursion_level &&
CmpVlanIds(f->vlan_id, p->vlan_id) && (f->livedev == p->livedev || g_livedev_mask == 0);
CmpVlanIds(f->vlan_id, p->vlan_id) &&
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
(f->livedev == p->livedev || g_livedev_mask == 0);
}
static inline bool CmpFlowKey(const Flow *f, const FlowKey *k)
@ -423,7 +425,9 @@ static inline bool CmpFlowKey(const Flow *f, const FlowKey *k)
const uint32_t *k_dst = k->dst.address.address_un_data32;
return CmpAddrsAndPorts(f_src, f_dst, f->sp, f->dp, k_src, k_dst, k->sp, k->dp) &&
f->proto == k->proto && f->recursion_level == k->recursion_level &&
CmpVlanIds(f->vlan_id, k->vlan_id) && CmpLiveDevIds(f->livedev, k->livedev_id);
CmpVlanIds(f->vlan_id, k->vlan_id) &&
((k->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
CmpLiveDevIds(f->livedev, k->livedev_id);
}
static inline bool CmpAddrsAndICMPTypes(const uint32_t src1[4],
@ -471,7 +475,9 @@ static inline int FlowCompareICMPv4(Flow *f, const Packet *p)
if ((f->src.addr_data32[0] == IPV4_GET_RAW_IPSRC_U32(ICMPV4_GET_EMB_IPV4(p))) &&
(f->dst.addr_data32[0] == IPV4_GET_RAW_IPDST_U32(ICMPV4_GET_EMB_IPV4(p))) &&
f->sp == p->icmpv4vars.emb_sport && f->dp == p->icmpv4vars.emb_dport &&
f->proto == ICMPV4_GET_EMB_PROTO(p) && f->recursion_level == p->recursion_level &&
f->proto == ICMPV4_GET_EMB_PROTO(p) &&
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
f->recursion_level == p->recursion_level &&
CmpVlanIds(f->vlan_id, p->vlan_id) &&
(f->livedev == p->livedev || g_livedev_mask == 0)) {
return 1;
@ -482,6 +488,7 @@ static inline int FlowCompareICMPv4(Flow *f, const Packet *p)
(f->src.addr_data32[0] == IPV4_GET_RAW_IPDST_U32(ICMPV4_GET_EMB_IPV4(p))) &&
f->dp == p->icmpv4vars.emb_sport && f->sp == p->icmpv4vars.emb_dport &&
f->proto == ICMPV4_GET_EMB_PROTO(p) &&
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) &&
f->recursion_level == p->recursion_level && CmpVlanIds(f->vlan_id, p->vlan_id) &&
(f->livedev == p->livedev || g_livedev_mask == 0)) {
return 1;
@ -514,7 +521,8 @@ static inline int FlowCompareESP(Flow *f, const Packet *p)
return CmpAddrs(f_src, p_src) && CmpAddrs(f_dst, p_dst) && f->proto == p->proto &&
f->recursion_level == p->recursion_level && CmpVlanIds(f->vlan_id, p->vlan_id) &&
f->esp.spi == ESP_GET_SPI(p) && (f->livedev == p->livedev || g_livedev_mask == 0);
((p->src.family == AF_INET) == FLOW_IS_IPV4(f)) && f->esp.spi == ESP_GET_SPI(p) &&
(f->livedev == p->livedev || g_livedev_mask == 0);
}
void FlowSetupPacket(Packet *p)

Loading…
Cancel
Save