*
* - Set TOS/PCP on inner BFD frame, and outer tunnel header when encapped.
*
- * - CFM "check_tnl_key" option equivalent.
- *
- * - CFM "fault override" equivalent.
- *
* - Sending BFD messages should be in its own thread/process.
*
* - Scale testing. How does it operate when there are large number of bfd
int ref_cnt;
int forwarding_override; /* Manual override of 'forwarding' status. */
+ bool check_tnl_key; /* Verify tunnel key of inbound packets? */
};
static bool bfd_in_poll(const struct bfd *);
bfd_set_state(bfd, STATE_DOWN, DIAG_NONE);
}
+ bfd->check_tnl_key = smap_get_bool(cfg, "check_tnl_key", false);
min_tx = smap_get_int(cfg, "min_tx", 100);
min_tx = MAX(min_tx, 100);
if (bfd->cfg_min_tx != min_tx) {
}
bool
-bfd_should_process_flow(const struct flow *flow, struct flow_wildcards *wc)
+bfd_should_process_flow(const struct bfd *bfd, const struct flow *flow,
+ struct flow_wildcards *wc)
{
memset(&wc->masks.nw_proto, 0xff, sizeof wc->masks.nw_proto);
memset(&wc->masks.tp_dst, 0xff, sizeof wc->masks.tp_dst);
+ if (bfd->check_tnl_key) {
+ memset(&wc->masks.tunnel.tun_id, 0xff, sizeof wc->masks.tunnel.tun_id);
+ }
return (flow->dl_type == htons(ETH_TYPE_IP)
&& flow->nw_proto == IPPROTO_UDP
- && flow->tp_dst == htons(3784));
+ && flow->tp_dst == htons(3784)
+ && (!bfd->check_tnl_key || flow->tunnel.tun_id == htonl(0)));
}
void
void bfd_put_packet(struct bfd *bfd, struct ofpbuf *packet,
uint8_t eth_src[6]);
-bool bfd_should_process_flow(const struct flow *, struct flow_wildcards *);
+bool bfd_should_process_flow(const struct bfd *, const struct flow *,
+ struct flow_wildcards *);
void bfd_process_packet(struct bfd *, const struct flow *,
const struct ofpbuf *);
cfm_process_heartbeat(xport->cfm, packet);
}
return SLOW_CFM;
- } else if (xport->bfd && bfd_should_process_flow(flow, wc)) {
+ } else if (xport->bfd && bfd_should_process_flow(xport->bfd, flow, wc)) {
if (packet) {
bfd_process_packet(xport->bfd, flow, packet);
}
<code>false</code>.
</column>
+ <column name="bfd" key="check_tnl_key" type='{"type": "boolean"}'>
+ When set to true, Check Tunnel Key will make BFD only accept control
+ messages with an <code>in_key</code> of zero. Defaults to
+ <code>false</code>.
+ </column>
+
<column name="bfd_status" key="state"
type='{"type": "string",
"enum": ["set", ["admin_down", "down", "init", "up"]]}'>