} fp_nh;
/**
* The FIB table index in which to find the next-hop.
- * This needs to be fixed. We should lookup the adjacencies in
- * a separate table of adjacencies, rather than from the FIB.
- * Two reasons I can think of:
- * - consider:
- * int ip addr Gig0 10.0.0.1/24
- * ip route 10.0.0.2/32 via Gig1 192.168.1.2
- * ip route 1.1.1.1/32 via Gig0 10.0.0.2
- * this is perfectly valid.
- * Packets addressed to 10.0.0.2 should be sent via Gig1.
- * Packets address to 1.1.1.1 should be sent via Gig0.
- * when we perform the adj resolution from the FIB for the path
- * "via Gig0 10.0.0.2" the lookup will result in the route via Gig1
- * and so we will pick up the adj via Gig1 - which was not what the
- * operator wanted.
- * - we can only return link-type IPv4 and so not the link-type MPLS.
- * more on this in a later commit.
- *
- * The table ID should only belong to a recursive path and indicate
- * which FIB should be used to resolve the next-hop.
*/
fib_node_index_t fp_tbl_id;
} recursive;
}
else
{
- return (FIB_FORW_CHAIN_TYPE_MPLS_EOS);
+ return (FIB_FORW_CHAIN_TYPE_MPLS_NON_EOS);
}
}
return (FIB_FORW_CHAIN_TYPE_UNICAST_IP4);
fei = fib_table_entry_special_add(path->recursive.fp_tbl_id,
&pfx,
FIB_SOURCE_RR,
- FIB_ENTRY_FLAG_NONE,
- ADJ_INDEX_INVALID);
+ FIB_ENTRY_FLAG_NONE);
path = fib_path_get(path_index);
path->fp_via_fib = fei;
case FIB_PATH_TYPE_RECEIVE:
return (path->receive.fp_interface);
case FIB_PATH_TYPE_RECURSIVE:
- return (fib_entry_get_resolving_interface(path->fp_via_fib));
+ if (fib_path_is_resolved(path_index))
+ {
+ return (fib_entry_get_resolving_interface(path->fp_via_fib));
+ }
+ break;
case FIB_PATH_TYPE_INTF_RX:
case FIB_PATH_TYPE_SPECIAL:
case FIB_PATH_TYPE_DEAG:
break;
case FIB_PATH_TYPE_RECURSIVE:
- if (FIB_NODE_INDEX_INVALID != path->fp_via_fib)
+ if (FIB_NODE_INDEX_INVALID != path->fp_via_fib &&
+ !fib_path_is_looped(path_index))
{
/*
* there's unresolved due to constraints, and there's unresolved
- * due to ain't go no via. can't do nowt w'out via.
+ * due to ain't got no via. can't do nowt w'out via.
*/
fib_entry_contribute_urpf(path->fp_via_fib, urpf);
}
}
int
-fib_path_is_recursive (fib_node_index_t path_index)
+fib_path_is_recursive_constrained (fib_node_index_t path_index)
{
fib_path_t *path;
path = fib_path_get(path_index);
- return (FIB_PATH_TYPE_RECURSIVE == path->fp_type);
+ return ((FIB_PATH_TYPE_RECURSIVE == path->fp_type) &&
+ ((path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RESOLVE_ATTACHED) ||
+ (path->fp_cfg_flags & FIB_PATH_CFG_FLAG_RESOLVE_HOST)));
}
int
return (path->fp_oper_flags & FIB_PATH_OPER_FLAG_RECURSIVE_LOOP);
}
-int
+fib_path_list_walk_rc_t
fib_path_encode (fib_node_index_t path_list_index,
fib_node_index_t path_index,
void *ctx)
path = fib_path_get(path_index);
if (!path)
- return (0);
+ return (FIB_PATH_LIST_WALK_CONTINUE);
vec_add2(*api_rpaths, api_rpath, 1);
api_rpath->rpath.frp_weight = path->fp_weight;
api_rpath->rpath.frp_proto = path->fp_nh_proto;
default:
break;
}
- return (1);
+ return (FIB_PATH_LIST_WALK_CONTINUE);
}
fib_protocol_t