#include <vnet/fib/fib_internal.h>
#include <vnet/fib/fib_urpf_list.h>
#include <vnet/fib/mpls_fib.h>
+#include <vnet/udp/udp_encap.h>
/**
* Enurmeration of path types
* interface receive.
*/
FIB_PATH_TYPE_INTF_RX,
+ /**
+ * interface receive.
+ */
+ FIB_PATH_TYPE_UDP_ENCAP,
/**
* receive. it's for-us.
*/
[FIB_PATH_TYPE_EXCLUSIVE] = "exclusive", \
[FIB_PATH_TYPE_DEAG] = "deag", \
[FIB_PATH_TYPE_INTF_RX] = "intf-rx", \
+ [FIB_PATH_TYPE_UDP_ENCAP] = "udp-encap", \
[FIB_PATH_TYPE_RECEIVE] = "receive", \
}
*/
u32 fp_interface;
} intf_rx;
+ struct {
+ /**
+ * The UDP Encap object this path resolves through
+ */
+ u32 fp_udp_encap_id;
+ } udp_encap;
};
STRUCT_MARK(path_hash_end);
path->fp_dpo.dpoi_index);
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ s = format (s, " UDP-encap ID:%d", path->udp_encap.fp_udp_encap_id);
+ break;
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_INTF_RX:
case FIB_PATH_TYPE_SPECIAL:
adj_unlock(path->fp_dpo.dpoi_index);
}
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ udp_encap_unlock_w_index(path->fp_dpo.dpoi_index);
+ break;
case FIB_PATH_TYPE_EXCLUSIVE:
dpo_reset(&path->exclusive.fp_ex_dpo);
break;
path->fp_oper_flags |= FIB_PATH_OPER_FLAG_DROP;
}
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ {
+ dpo_id_t via_dpo = DPO_INVALID;
+
+ /*
+ * hope for the best - clear if restrictions apply.
+ */
+ path->fp_oper_flags |= FIB_PATH_OPER_FLAG_RESOLVED;
+
+ udp_encap_contribute_forwarding(path->udp_encap.fp_udp_encap_id,
+ path->fp_nh_proto,
+ &via_dpo);
+ /*
+ * If this path is contributing a drop, then it's not resolved
+ */
+ if (dpo_is_drop(&via_dpo) || load_balance_is_drop(&via_dpo))
+ {
+ path->fp_oper_flags &= ~FIB_PATH_OPER_FLAG_RESOLVED;
+ }
+
+ /*
+ * update the path's contributed DPO
+ */
+ dpo_copy(&path->fp_dpo, &via_dpo);
+ dpo_reset(&via_dpo);
+ break;
+ }
case FIB_PATH_TYPE_INTF_RX:
ASSERT(0);
case FIB_PATH_TYPE_DEAG:
path->receive.fp_interface = rpath->frp_sw_if_index;
path->receive.fp_addr = rpath->frp_addr;
}
+ else if (rpath->frp_flags & FIB_ROUTE_PATH_UDP_ENCAP)
+ {
+ path->fp_type = FIB_PATH_TYPE_UDP_ENCAP;
+ path->udp_encap.fp_udp_encap_id = rpath->frp_udp_encap_id;
+ }
else if (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_INTF_RX)
{
path->fp_type = FIB_PATH_TYPE_INTF_RX;
case FIB_PATH_TYPE_INTF_RX:
res = (path1->intf_rx.fp_interface - path2->intf_rx.fp_interface);
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ res = (path1->udp_encap.fp_udp_encap_id - path2->udp_encap.fp_udp_encap_id);
+ break;
case FIB_PATH_TYPE_SPECIAL:
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_EXCLUSIVE:
case FIB_PATH_TYPE_INTF_RX:
res = (path->intf_rx.fp_interface - rpath->frp_sw_if_index);
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ res = (path->udp_encap.fp_udp_encap_id - rpath->frp_udp_encap_id);
+ break;
case FIB_PATH_TYPE_DEAG:
res = (path->deag.fp_tbl_id - rpath->frp_fib_index);
if (0 == res)
case FIB_PATH_TYPE_DEAG:
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_INTF_RX:
+ case FIB_PATH_TYPE_UDP_ENCAP:
case FIB_PATH_TYPE_EXCLUSIVE:
/*
* these path types cannot be part of a loop, since they are the leaves
&path->receive.fp_addr,
&path->fp_dpo);
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ udp_encap_lock(path->udp_encap.fp_udp_encap_id);
+ udp_encap_contribute_forwarding(path->udp_encap.fp_udp_encap_id,
+ path->fp_nh_proto,
+ &path->fp_dpo);
+ break;
case FIB_PATH_TYPE_INTF_RX: {
/*
* Resolve via a receive DPO.
}
break;
case FIB_PATH_TYPE_INTF_RX:
+ case FIB_PATH_TYPE_UDP_ENCAP:
case FIB_PATH_TYPE_SPECIAL:
case FIB_PATH_TYPE_DEAG:
case FIB_PATH_TYPE_EXCLUSIVE:
case FIB_PATH_TYPE_DEAG:
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_INTF_RX:
+ case FIB_PATH_TYPE_UDP_ENCAP:
/*
* these path types don't link to an adj
*/
&tmp));
dpo_reset(&tmp);
break;
- }
+ }
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_ATTACHED:
case FIB_PATH_TYPE_ATTACHED_NEXT_HOP:
case FIB_PATH_TYPE_RECURSIVE:
case FIB_PATH_TYPE_INTF_RX:
+ case FIB_PATH_TYPE_UDP_ENCAP:
case FIB_PATH_TYPE_EXCLUSIVE:
case FIB_PATH_TYPE_SPECIAL:
break;
path->attached.fp_interface,
dpo);
break;
+ case FIB_PATH_TYPE_UDP_ENCAP:
+ udp_encap_contribute_forwarding(path->udp_encap.fp_udp_encap_id,
+ path->fp_nh_proto,
+ dpo);
+ break;
case FIB_PATH_TYPE_RECEIVE:
case FIB_PATH_TYPE_SPECIAL:
dpo_copy(dpo, &path->fp_dpo);