This commit is contained in:
Pim van Pelt
2023-01-11 12:12:15 +00:00
5 changed files with 55 additions and 54 deletions

View File

@ -21,19 +21,19 @@ option version = "1.0.0";
import "vnet/interface_types.api"; import "vnet/interface_types.api";
/** \brief Set the default Linux Control Plane namespace /** \brief Set the default Linux Control Plane netns
@param client_index - opaque cookie to identify the sender @param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request @param context - sender context, to match reply w/ request
@param namespace - the new default namespace; namespace[0] == 0 iff none @param netns - the new default netns; netns[0] == 0 iff none
*/ */
autoreply define lcp_default_ns_set autoreply define lcp_default_ns_set
{ {
u32 client_index; u32 client_index;
u32 context; u32 context;
string namespace[32]; /* LCP_NS_LEN */ string netns[32]; /* LCP_NS_LEN */
}; };
/** \brief get the default Linux Control Plane namespace /** \brief get the default Linux Control Plane netns
@param client_index - opaque cookie to identify the sender @param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request @param context - sender context, to match reply w/ request
*/ */
@ -43,15 +43,15 @@ define lcp_default_ns_get
u32 context; u32 context;
}; };
/** \brief get the default Linux Control Plane namespace /** \brief get the default Linux Control Plane netns
@param client_index - opaque cookie to identify the sender @param client_index - opaque cookie to identify the sender
@param context - sender context, to match reply w/ request @param context - sender context, to match reply w/ request
@param namespace - the default namespace; namespace[0] == 0 iff none @param netns - the default netns; netns[0] == 0 iff none
*/ */
define lcp_default_ns_get_reply define lcp_default_ns_get_reply
{ {
u32 context; u32 context;
string namespace[32]; /* LCP_NS_LEN */ string netns[32]; /* LCP_NS_LEN */
}; };
enum lcp_itf_host_type : u8 enum lcp_itf_host_type : u8
@ -67,7 +67,7 @@ enum lcp_itf_host_type : u8
@param sw_if_index - index of VPP PHY SW interface @param sw_if_index - index of VPP PHY SW interface
@param host_if_name - host tap interface name @param host_if_name - host tap interface name
@param host_if_type - the type of host interface to create (tun, tap) @param host_if_type - the type of host interface to create (tun, tap)
@param namespace - optional tap namespace; namespace[0] == 0 iff none @param netns - optional tap netns; netns[0] == 0 iff none
*/ */
autoreply autoendian define lcp_itf_pair_add_del autoreply autoendian define lcp_itf_pair_add_del
{ {
@ -77,7 +77,7 @@ autoreply autoendian define lcp_itf_pair_add_del
vl_api_interface_index_t sw_if_index; vl_api_interface_index_t sw_if_index;
string host_if_name[16]; /* IFNAMSIZ */ string host_if_name[16]; /* IFNAMSIZ */
vl_api_lcp_itf_host_type_t host_if_type; vl_api_lcp_itf_host_type_t host_if_type;
string namespace[32]; /* LCP_NS_LEN */ string netns[32]; /* LCP_NS_LEN */
}; };
autoendian define lcp_itf_pair_add_del_v2 autoendian define lcp_itf_pair_add_del_v2
{ {
@ -87,7 +87,7 @@ autoendian define lcp_itf_pair_add_del_v2
vl_api_interface_index_t sw_if_index; vl_api_interface_index_t sw_if_index;
string host_if_name[16]; /* IFNAMSIZ */ string host_if_name[16]; /* IFNAMSIZ */
vl_api_lcp_itf_host_type_t host_if_type; vl_api_lcp_itf_host_type_t host_if_type;
string namespace[32]; /* LCP_NS_LEN */ string netns[32]; /* LCP_NS_LEN */
}; };
define lcp_itf_pair_add_del_v2_reply define lcp_itf_pair_add_del_v2_reply
{ {
@ -121,7 +121,7 @@ define lcp_itf_pair_get_reply
@param vif_index - tap linux index @param vif_index - tap linux index
@param host_if_name - host interface name @param host_if_name - host interface name
@param host_if_type - host interface type (tun, tap) @param host_if_type - host interface type (tun, tap)
@param namespace - host interface namespace @param netns - host interface netns
*/ */
autoendian define lcp_itf_pair_details autoendian define lcp_itf_pair_details
{ {
@ -131,7 +131,7 @@ autoendian define lcp_itf_pair_details
u32 vif_index; u32 vif_index;
string host_if_name[16]; /* IFNAMSIZ */ string host_if_name[16]; /* IFNAMSIZ */
vl_api_lcp_itf_host_type_t host_if_type; vl_api_lcp_itf_host_type_t host_if_type;
string namespace[32]; /* LCP_NS_LEN */ string netns[32]; /* LCP_NS_LEN */
}; };
service { service {

View File

@ -44,7 +44,7 @@ api_encode_host_type (lip_host_type_t type)
static int static int
vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type, vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type,
u8 *mp_host_if_name, size_t sizeof_host_if_name, u8 *mp_host_if_name, size_t sizeof_host_if_name,
u8 *mp_namespace, size_t sizeof_mp_namespace, u8 *mp_netns, size_t sizeof_mp_netns,
u32 *host_sw_if_index_p) u32 *host_sw_if_index_p)
{ {
u8 *host_if_name, *netns; u8 *host_if_name, *netns;
@ -57,8 +57,8 @@ vl_api_lcp_itf_pair_add (u32 phy_sw_if_index, lip_host_type_t lip_host_type,
vec_add (host_if_name, mp_host_if_name, host_len); vec_add (host_if_name, mp_host_if_name, host_len);
vec_add1 (host_if_name, 0); vec_add1 (host_if_name, 0);
netns_len = clib_strnlen ((char *) mp_namespace, sizeof_mp_namespace - 1); netns_len = clib_strnlen ((char *) mp_netns, sizeof_mp_netns - 1);
vec_add (netns, mp_namespace, netns_len); vec_add (netns, mp_netns, netns_len);
vec_add1 (netns, 0); vec_add1 (netns, 0);
rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type, rv = lcp_itf_pair_create (phy_sw_if_index, host_if_name, lip_host_type,
@ -78,20 +78,15 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp)
lip_host_type_t lip_host_type; lip_host_type_t lip_host_type;
int rv; int rv;
if (!vnet_sw_if_index_is_api_valid (mp->sw_if_index)) VALIDATE_SW_IF_INDEX_END (mp);
{
rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
goto bad_sw_if_index;
}
phy_sw_if_index = mp->sw_if_index; phy_sw_if_index = mp->sw_if_index;
lip_host_type = api_decode_host_type (mp->host_if_type); lip_host_type = api_decode_host_type (mp->host_if_type);
if (mp->is_add) if (mp->is_add)
{ {
rv = rv = vl_api_lcp_itf_pair_add (
vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type, phy_sw_if_index, lip_host_type, mp->host_if_name,
mp->host_if_name, sizeof (mp->host_if_name), sizeof (mp->host_if_name), mp->netns, sizeof (mp->netns), NULL);
mp->namespace, sizeof (mp->namespace), NULL);
} }
else else
{ {
@ -99,7 +94,7 @@ vl_api_lcp_itf_pair_add_del_t_handler (vl_api_lcp_itf_pair_add_del_t *mp)
} }
BAD_SW_IF_INDEX_LABEL; BAD_SW_IF_INDEX_LABEL;
REPLY_MACRO (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY); REPLY_MACRO_END (VL_API_LCP_ITF_PAIR_ADD_DEL_REPLY);
} }
static void static void
@ -110,11 +105,7 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
lip_host_type_t lip_host_type; lip_host_type_t lip_host_type;
int rv; int rv;
if (!vnet_sw_if_index_is_api_valid (mp->sw_if_index)) VALIDATE_SW_IF_INDEX_END (mp);
{
rv = VNET_API_ERROR_INVALID_SW_IF_INDEX;
goto bad_sw_if_index;
}
phy_sw_if_index = mp->sw_if_index; phy_sw_if_index = mp->sw_if_index;
lip_host_type = api_decode_host_type (mp->host_if_type); lip_host_type = api_decode_host_type (mp->host_if_type);
@ -122,8 +113,8 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
{ {
rv = vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type, rv = vl_api_lcp_itf_pair_add (phy_sw_if_index, lip_host_type,
mp->host_if_name, mp->host_if_name,
sizeof (mp->host_if_name), mp->namespace, sizeof (mp->host_if_name), mp->netns,
sizeof (mp->namespace), &host_sw_if_index); sizeof (mp->netns), &host_sw_if_index);
} }
else else
{ {
@ -131,8 +122,8 @@ vl_api_lcp_itf_pair_add_del_v2_t_handler (vl_api_lcp_itf_pair_add_del_v2_t *mp)
} }
BAD_SW_IF_INDEX_LABEL; BAD_SW_IF_INDEX_LABEL;
REPLY_MACRO2 (VL_API_LCP_ITF_PAIR_ADD_DEL_V2_REPLY, REPLY_MACRO2_END (VL_API_LCP_ITF_PAIR_ADD_DEL_V2_REPLY,
{ rmp->host_sw_if_index = ntohl (host_sw_if_index); }); { rmp->host_sw_if_index = host_sw_if_index; });
} }
static void static void
@ -153,9 +144,9 @@ send_lcp_itf_pair_details (index_t lipi, vl_api_registration_t *rp,
lcp_pair->lip_host_name, vec_len (lcp_pair->lip_host_name)); lcp_pair->lip_host_name, vec_len (lcp_pair->lip_host_name));
rmp->host_if_name[vec_len (lcp_pair->lip_host_name)] = 0; rmp->host_if_name[vec_len (lcp_pair->lip_host_name)] = 0;
memcpy_s (rmp->namespace, sizeof (rmp->namespace), memcpy_s (rmp->netns, sizeof (rmp->netns), lcp_pair->lip_namespace,
lcp_pair->lip_namespace, vec_len (lcp_pair->lip_namespace)); vec_len (lcp_pair->lip_namespace));
rmp->namespace[vec_len (lcp_pair->lip_namespace)] = 0; rmp->netns[vec_len (lcp_pair->lip_namespace)] = 0;
})); }));
} }
@ -175,15 +166,14 @@ vl_api_lcp_default_ns_set_t_handler(vl_api_lcp_default_ns_set_t *mp) {
vl_api_lcp_default_ns_set_reply_t *rmp; vl_api_lcp_default_ns_set_reply_t *rmp;
int rv; int rv;
mp->namespace[LCP_NS_LEN - 1] = 0; mp->netns[LCP_NS_LEN - 1] = 0;
rv = lcp_set_default_ns(mp->namespace); rv = lcp_set_default_ns (mp->netns);
REPLY_MACRO(VL_API_LCP_DEFAULT_NS_SET_REPLY); REPLY_MACRO(VL_API_LCP_DEFAULT_NS_SET_REPLY);
} }
static void static void
vl_api_lcp_default_ns_get_t_handler(vl_api_lcp_default_ns_get_t *mp) { vl_api_lcp_default_ns_get_t_handler(vl_api_lcp_default_ns_get_t *mp) {
lcp_main_t *lcpm = &lcp_main;
vl_api_lcp_default_ns_get_reply_t *rmp; vl_api_lcp_default_ns_get_reply_t *rmp;
vl_api_registration_t *reg; vl_api_registration_t *reg;
char *ns; char *ns;
@ -192,16 +182,12 @@ vl_api_lcp_default_ns_get_t_handler(vl_api_lcp_default_ns_get_t *mp) {
if (!reg) if (!reg)
return; return;
rmp = vl_msg_api_alloc (sizeof (*rmp)); REPLY_MACRO_DETAILS2_END (VL_API_LCP_DEFAULT_NS_GET_REPLY, ({
clib_memset (rmp, 0, sizeof (*rmp));
rmp->_vl_msg_id = (VL_API_LCP_DEFAULT_NS_GET_REPLY + lcpm->msg_id_base);
rmp->context = mp->context;
ns = (char *) lcp_get_default_ns (); ns = (char *) lcp_get_default_ns ();
if (ns) if (ns)
clib_strncpy ((char *) rmp->namespace, ns, LCP_NS_LEN - 1); clib_strncpy ((char *) rmp->netns, ns,
LCP_NS_LEN - 1);
vl_api_send_msg (reg, (u8 *) rmp); }));
} }
static void static void

View File

@ -951,13 +951,16 @@ lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name,
else else
{ {
tap_create_if_args_t args = { tap_create_if_args_t args = {
.num_rx_queues = 1, .num_rx_queues = clib_max (1, vlib_num_workers ()),
.num_tx_queues = 1,
.id = hw->hw_if_index, .id = hw->hw_if_index,
.sw_if_index = ~0, .sw_if_index = ~0,
.rx_ring_sz = 256, .rx_ring_sz = 256,
.tx_ring_sz = 256, .tx_ring_sz = 256,
.host_if_name = host_if_name, .host_if_name = host_if_name,
.host_namespace = 0, .host_namespace = 0,
.rv = 0,
.error = NULL,
}; };
ethernet_interface_t *ei; ethernet_interface_t *ei;
u32 host_sw_mtu_size; u32 host_sw_mtu_size;
@ -996,6 +999,7 @@ lcp_itf_pair_create (u32 phy_sw_if_index, u8 *host_if_name,
{ {
LCP_ITF_PAIR_ERR ("pair_create: could not create tap, retval:%d", LCP_ITF_PAIR_ERR ("pair_create: could not create tap, retval:%d",
args.rv); args.rv);
clib_error_free (args.error);
return args.rv; return args.rv;
} }

View File

@ -300,7 +300,7 @@ lcp_nl_process_msgs (void)
} }
else else
{ {
NL_INFO ("process_msgs: Processed %u messages in %llu usecs", n_msgs, NL_DBG ("process_msgs: Processed %u messages in %llu usecs", n_msgs,
usecs); usecs);
} }
} }

View File

@ -517,7 +517,18 @@ lcp_nl_route_add (struct rtnl_route *rr)
} }
else else
{ {
fib_source_t fib_src = lcp_nl_proto_fib_source (rproto); fib_source_t fib_src;
const fib_route_path_t *rpath;
vec_foreach (rpath, np.paths)
{
if (fib_route_path_is_attached (rpath))
{
entry_flags |= FIB_ENTRY_FLAG_ATTACHED;
break;
}
}
fib_src = lcp_nl_proto_fib_source (rproto);
NL_INFO ("route_add: table %d prefix %U flags %U", NL_INFO ("route_add: table %d prefix %U flags %U",
rtnl_route_get_table (rr), format_fib_prefix, &pfx, rtnl_route_get_table (rr), format_fib_prefix, &pfx,