From 3017c482bb5e8cdca11404fe8fad67720358e62b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Wed, 11 Sep 2024 00:15:49 +0200 Subject: [PATCH 01/16] Change pf1-proxy from TAP to MLX5 device --- include/dp_conf.h | 4 +- include/dp_port.h | 16 ++--- src/dp_conf.c | 35 +++------- src/dp_graph.c | 8 +-- src/dp_port.c | 130 ++++++++++++++----------------------- src/dp_service.c | 17 ++--- src/dpdk_layer.c | 6 +- src/nodes/cls_node.c | 2 +- src/nodes/pf1_proxy_node.c | 2 +- src/nodes/rx_node.c | 4 +- 10 files changed, 79 insertions(+), 145 deletions(-) diff --git a/include/dp_conf.h b/include/dp_conf.h index 7acb20b75..fb5f8ec1e 100644 --- a/include/dp_conf.h +++ b/include/dp_conf.h @@ -49,9 +49,7 @@ const struct dp_conf_dhcp_dns *dp_conf_get_dhcp_dns(void); const struct dp_conf_dhcp_dns *dp_conf_get_dhcpv6_dns(void); #ifdef ENABLE_PF1_PROXY -const char *dp_get_eal_pf1_proxy_mac_addr(void); -const char *dp_get_eal_pf1_proxy_dev_name(void); -const char *dp_generate_eal_pf1_proxy_params(void); +const char *dp_conf_get_pf1_proxy(void); bool dp_conf_is_pf1_proxy_enabled(void); #endif diff --git a/include/dp_port.h b/include/dp_port.h index b824038b6..de9955014 100644 --- a/include/dp_port.h +++ b/include/dp_port.h @@ -108,11 +108,10 @@ struct dp_ports { // hidden structures for inline functions to access extern struct dp_port *_dp_port_table[DP_MAX_PORTS]; extern struct dp_port *_dp_pf_ports[DP_MAX_PF_PORTS]; -extern struct dp_ports _dp_ports; - #ifdef ENABLE_PF1_PROXY -extern struct dp_port _dp_pf_proxy_tap_port; +extern struct dp_port _dp_pf1_proxy_port; #endif +extern struct dp_ports _dp_ports; struct dp_port *dp_get_port_by_name(const char *pci_name); @@ -123,7 +122,7 @@ void dp_ports_free(void); int dp_start_port(struct dp_port *port); #ifdef ENABLE_PF1_PROXY -int dp_start_pf_proxy_tap_port(void); +int dp_start_pf1_proxy_port(void); #endif int dp_stop_port(struct dp_port *port); @@ -158,11 +157,6 @@ struct dp_port *dp_get_out_port(struct dp_flow *df) static __rte_always_inline struct dp_port *dp_get_port_by_id(uint16_t port_id) { -#ifdef ENABLE_PF1_PROXY - if (unlikely(dp_conf_is_pf1_proxy_enabled() && port_id == _dp_pf_proxy_tap_port.port_id)) - return &_dp_pf_proxy_tap_port; -#endif - if (unlikely(port_id >= RTE_DIM(_dp_port_table))) { DPS_LOG_ERR("Port not registered in dpservice", DP_LOG_PORTID(port_id)); return NULL; @@ -201,9 +195,9 @@ struct dp_port *dp_get_port_by_pf_index(uint16_t index) #ifdef ENABLE_PF1_PROXY static __rte_always_inline -const struct dp_port *dp_get_pf_proxy_tap_port(void) +const struct dp_port *dp_get_pf1_proxy(void) { - return &_dp_pf_proxy_tap_port; + return &_dp_pf1_proxy_port; } #endif diff --git a/src/dp_conf.c b/src/dp_conf.c index 4e7ff0efc..8700ffc6e 100644 --- a/src/dp_conf.c +++ b/src/dp_conf.c @@ -39,32 +39,16 @@ static struct dp_conf_virtual_services virtual_services = {0}; #endif #ifdef ENABLE_PF1_PROXY -#define DP_EAL_PF1_MAC_ADDR_SIZE 18 -static char eal_pf1_proxy_mac_addr_str[DP_EAL_PF1_MAC_ADDR_SIZE] = {0}; -static const char *eal_pf1_proxy_dev_name = "pf1-tap"; -static char eal_pf1_proxy_params[DP_EAL_A_MAXLEN] = {0}; -static bool dp_conf_pf1_proxy_enabled = false; +static char dp_conf_pf1_proxy[IF_NAMESIZE] = {0}; -const char *dp_get_eal_pf1_proxy_mac_addr(void) +const char *dp_conf_get_pf1_proxy(void) { - return eal_pf1_proxy_mac_addr_str; -} - -const char *dp_get_eal_pf1_proxy_dev_name(void) -{ - return eal_pf1_proxy_dev_name; -} - -const char *dp_generate_eal_pf1_proxy_params(void) -{ - snprintf(eal_pf1_proxy_params, sizeof(eal_pf1_proxy_params), "net_tap0,iface=%s,mac=%s", - dp_get_eal_pf1_proxy_dev_name(), dp_get_eal_pf1_proxy_mac_addr()); - return eal_pf1_proxy_params; + return dp_conf_pf1_proxy; } bool dp_conf_is_pf1_proxy_enabled(void) { - return dp_conf_pf1_proxy_enabled; + return *dp_conf_pf1_proxy; } #endif @@ -299,15 +283,12 @@ static int parse_line(char *line, int lineno) if (!strcmp(key, "a-pf0")) return dp_argparse_string(value, eal_a_pf0, sizeof(eal_a_pf0)); - if (!strcmp(key, "a-pf1")) // TODO: throw an error when pf0 and pf1 are present and nic is in the mpesw mode + if (!strcmp(key, "a-pf1")) return dp_argparse_string(value, eal_a_pf1, sizeof(eal_a_pf1)); + #ifdef ENABLE_PF1_PROXY - else { - if (!strcmp(key, "pf1-proxy")) { - dp_conf_pf1_proxy_enabled = true; - return dp_argparse_string(value, eal_pf1_proxy_mac_addr_str, sizeof(eal_pf1_proxy_mac_addr_str)); - } - } + if (!strcmp(key, "pf1-proxy")) + return dp_argparse_string(value, dp_conf_pf1_proxy, sizeof(dp_conf_pf1_proxy)); #endif // Otherwise support all long options diff --git a/src/dp_graph.c b/src/dp_graph.c index c6dd6c602..2dabbc696 100644 --- a/src/dp_graph.c +++ b/src/dp_graph.c @@ -121,16 +121,16 @@ static rte_graph_t dp_graph_create(unsigned int lcore_id) } #ifdef ENABLE_PF1_PROXY -static int dp_graph_init_proxy_tap(void) +static int dp_graph_init_pf1_proxy(void) { if (!dp_conf_is_pf1_proxy_enabled()) return DP_OK; - const struct dp_port *port = dp_get_pf_proxy_tap_port(); + const struct dp_port *port = dp_get_pf1_proxy(); uint16_t port_id = port->port_id; if (DP_FAILED(rx_node_create(port_id, 0)) - || DP_FAILED(tx_node_create(port_id))) + || DP_FAILED(tx_node_create(port_id))) // TODO wait, this is never used! (rewire CLS or remove this) return DP_ERROR; return DP_OK; @@ -189,7 +189,7 @@ int dp_graph_init(void) return DP_ERROR; #ifdef ENABLE_PF1_PROXY - if (DP_FAILED(dp_graph_init_proxy_tap())) + if (DP_FAILED(dp_graph_init_pf1_proxy())) return DP_ERROR; #endif diff --git a/src/dp_port.c b/src/dp_port.c index 7d2b7329a..1aa8a4165 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -25,6 +25,9 @@ #define DP_PORT_INIT_PF true #define DP_PORT_INIT_VF false +#define DP_PORT_PROXIED true +#define DP_PORT_NORMAL false + #define DP_METER_CIR_BASE_VALUE (1024 * 1024) // 1 Mbits #define DP_METER_EBS_BREAK_VALUE 100 // 100 Mbits/s, it used to differentiate different ebs calculation strategy to achieve relative stable metering results. epirical value. #define DP_METER_MBITS_TO_BYTES (1024 * 1024 / 8) @@ -53,11 +56,10 @@ static const struct rte_meter_srtcm_params dp_srtcm_params_base = { struct dp_port *_dp_port_table[DP_MAX_PORTS]; struct dp_port *_dp_pf_ports[DP_MAX_PF_PORTS]; -struct dp_ports _dp_ports; - #ifdef ENABLE_PF1_PROXY -struct dp_port _dp_pf_proxy_tap_port; +struct dp_port _dp_pf1_proxy_port; #endif +struct dp_ports _dp_ports; static int dp_port_register_pf(struct dp_port *port) { @@ -125,7 +127,7 @@ static int dp_port_init_ethdev(struct dp_port *port, struct rte_eth_dev_info *de for (uint16_t i = 0; i < DP_NR_STD_RX_QUEUES; ++i) { mempool = dp_layer->rte_mempool; #ifdef ENABLE_PF1_PROXY - if (dp_conf_is_pf1_proxy_enabled() && (port == dp_get_pf1() || port == &_dp_pf_proxy_tap_port)) + if (dp_conf_is_pf1_proxy_enabled() && (port == dp_get_pf1() || port == dp_get_pf1_proxy())) mempool = dp_layer->rte_jumbo_mempool; #endif ret = rte_eth_rx_queue_setup(port->port_id, i, 1024, @@ -196,7 +198,7 @@ static int dp_port_flow_isolate(uint16_t port_id) return DP_OK; } -static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info, bool is_pf) +static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info, bool is_pf, bool is_proxied) { static int last_pf1_hairpin_tx_rx_queue_offset = 1; struct dp_port *port; @@ -208,7 +210,7 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d return NULL; } - if (is_pf) { + if (is_pf && !is_proxied) { if (dp_conf_get_nic_type() != DP_CONF_NIC_TYPE_TAP) if (DP_FAILED(dp_port_flow_isolate(port_id))) return NULL; @@ -240,6 +242,8 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) return NULL; + // TODO should proxied PF be promiscuous? To send everything? + if (is_pf) { ret = rte_eth_dev_callback_register(port_id, RTE_ETH_EVENT_INTR_LSC, dp_link_status_change_event_callback, NULL); if (DP_FAILED(ret)) { @@ -263,17 +267,13 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d } #ifdef ENABLE_PF1_PROXY -static struct dp_port *dp_port_init_proxied_pf_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info) +// TODO needs cleanup maybe merging! +static struct dp_port *dp_port_init_pf1_proxy_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info) { struct dp_port *port; int socket_id; int ret; - if (port_id >= RTE_DIM(_dp_port_table)) { - DPS_LOG_ERR("Invalid port id", DP_LOG_PORTID(port_id), DP_LOG_MAX(RTE_DIM(_dp_port_table))); - return NULL; - } - socket_id = rte_eth_dev_socket_id(port_id); if (DP_FAILED(socket_id)) { if (socket_id == SOCKET_ID_ANY) { @@ -284,9 +284,8 @@ static struct dp_port *dp_port_init_proxied_pf_interface(uint16_t port_id, struc } } - // oveflow check done by liming the number of calls to this function - port = _dp_ports.end++; - port->is_pf = true; + port = &_dp_pf1_proxy_port; + port->is_pf = false; port->port_id = port_id; port->socket_id = socket_id; _dp_port_table[port_id] = port; @@ -294,54 +293,11 @@ static struct dp_port *dp_port_init_proxied_pf_interface(uint16_t port_id, struc if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) return NULL; + // TODO eswitch is implied by the proxy if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) return NULL; - DPS_LOG_INFO("INIT setting proxied pf port to promiscuous mode", DP_LOG_PORT(port)); - ret = rte_eth_promiscuous_enable(port->port_id); - if (DP_FAILED(ret)) { - DPS_LOG_ERR("Promiscuous mode setting failed", DP_LOG_PORT(port), DP_LOG_RET(ret)); - return NULL; - } - - if (DP_FAILED(dp_port_register_pf(port))) - return NULL; - ret = rte_eth_dev_callback_register(port_id, RTE_ETH_EVENT_INTR_LSC, dp_link_status_change_event_callback, NULL); - if (DP_FAILED(ret)) { - DPS_LOG_ERR("Cannot register link status callback", DP_LOG_RET(ret)); - return NULL; - } - - return port; -} - -static struct dp_port *dp_port_init_proxy_tap(uint16_t port_id, struct rte_eth_dev_info *dev_info) -{ - // struct dp_port *port; - struct dp_port *port = &_dp_pf_proxy_tap_port; - int socket_id; - int ret; - - socket_id = rte_eth_dev_socket_id(port_id); - if (DP_FAILED(socket_id)) { - if (socket_id == SOCKET_ID_ANY) { - DPS_LOG_WARNING("Cannot get numa socket", DP_LOG_PORTID(port_id)); - } else { - DPS_LOG_ERR("Cannot get numa socket", DP_LOG_PORTID(port_id), DP_LOG_RET(rte_errno)); - return NULL; - } - } - - // oveflow check done by liming the number of calls to this function - // port = _dp_ports.end++; - port->is_pf = false; - port->port_id = port_id; - port->socket_id = socket_id; - - if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) - return NULL; - - DPS_LOG_INFO("INIT setting proxy tap to promiscuous mode", DP_LOG_PORT(port)); + DPS_LOG_INFO("INIT setting PF1 proxy to promiscuous mode", DP_LOG_PORT(port)); ret = rte_eth_promiscuous_enable(port->port_id); if (DP_FAILED(ret)) { DPS_LOG_ERR("Promiscuous mode setting failed", DP_LOG_PORT(port), DP_LOG_RET(ret)); @@ -374,6 +330,7 @@ static int dp_port_init_pf(const char *pf_name) struct rte_eth_dev_info dev_info; char ifname[IF_NAMESIZE] = {0}; struct dp_port *port; + bool proxied; RTE_ETH_FOREACH_DEV(port_id) { if (DP_FAILED(dp_get_dev_info(port_id, &dev_info, ifname))) @@ -381,13 +338,11 @@ static int dp_port_init_pf(const char *pf_name) if (!strncmp(pf_name, ifname, sizeof(ifname))) { DPS_LOG_INFO("INIT initializing PF port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); #ifdef ENABLE_PF1_PROXY - if (dp_conf_is_pf1_proxy_enabled() && strncmp(pf_name, dp_conf_get_pf1_name(), sizeof(ifname)) == 0) - port = dp_port_init_proxied_pf_interface(port_id, &dev_info); - else - port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_PF); + proxied = dp_conf_is_pf1_proxy_enabled() && !strncmp(pf_name, dp_conf_get_pf1_name(), sizeof(ifname)); #else - port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_PF); + proxied = false; #endif + port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_PF, proxied); if (!port) return DP_ERROR; snprintf(port->port_name, sizeof(port->port_name), "%s", pf_name); @@ -399,7 +354,8 @@ static int dp_port_init_pf(const char *pf_name) } #ifdef ENABLE_PF1_PROXY -static int dp_port_init_tap_proxy(const char *pf_tap_proxy_name) +// TODO this can be merged with the others maybe +static int dp_port_init_pf1_proxy(const char *pf1_proxy_name) { if (!dp_conf_is_pf1_proxy_enabled()) return DP_OK; @@ -412,16 +368,16 @@ static int dp_port_init_tap_proxy(const char *pf_tap_proxy_name) RTE_ETH_FOREACH_DEV(port_id) { if (DP_FAILED(dp_get_dev_info(port_id, &dev_info, ifname))) return DP_ERROR; - if (!strncmp(pf_tap_proxy_name, ifname, sizeof(ifname))) { - DPS_LOG_INFO("INIT initializing PF proxy tap port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); - port = dp_port_init_proxy_tap(port_id, &dev_info); + if (!strncmp(pf1_proxy_name, ifname, sizeof(ifname))) { + DPS_LOG_INFO("INIT initializing PF1 proxy port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); + port = dp_port_init_pf1_proxy_interface(port_id, &dev_info); if (!port) return DP_ERROR; - snprintf(port->port_name, sizeof(port->port_name), "%s", pf_tap_proxy_name); + snprintf(port->port_name, sizeof(port->port_name), "%s", pf1_proxy_name); return DP_OK; } } - DPS_LOG_ERR("No such PF proxy tap port", DP_LOG_NAME(pf_tap_proxy_name)); + DPS_LOG_ERR("No such PF1 proxy port", DP_LOG_NAME(pf1_proxy_name)); return DP_ERROR; } #endif @@ -439,7 +395,7 @@ static int dp_port_init_vfs(const char *vf_pattern, int num_of_vfs) return DP_ERROR; if (strstr(ifname, vf_pattern) && ++vf_count <= num_of_vfs) { DPS_LOG_INFO("INIT initializing VF port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); - port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_VF); + port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_VF, DP_PORT_NORMAL); if (!port) return DP_ERROR; snprintf(port->port_name, sizeof(port->port_name), "%s", vf_pattern); @@ -472,7 +428,7 @@ int dp_ports_init(void) if (DP_FAILED(dp_port_init_pf(dp_conf_get_pf0_name())) || DP_FAILED(dp_port_init_pf(dp_conf_get_pf1_name())) #ifdef ENABLE_PF1_PROXY - || DP_FAILED(dp_port_init_tap_proxy(dp_get_eal_pf1_proxy_dev_name())) + || DP_FAILED(dp_port_init_pf1_proxy(dp_conf_get_pf1_proxy())) #endif || DP_FAILED(dp_port_init_vfs(dp_conf_get_vf_pattern(), num_of_vfs))) return DP_ERROR; @@ -508,7 +464,7 @@ static int dp_stop_eth_port(struct dp_port *port) ret = rte_eth_dev_stop(port->port_id); if (DP_FAILED(ret)) - DPS_LOG_ERR("Cannot stop ethernet port", DP_LOG_PORTID(port->port_id), DP_LOG_RET(ret)); + DPS_LOG_ERR("Cannot stop ethernet port", DP_LOG_PORT(port), DP_LOG_RET(ret)); return ret; } @@ -518,12 +474,17 @@ void dp_ports_stop(void) // in multiport-mode, PF0 needs to be stopped last struct dp_port *pf0 = dp_get_port_by_pf_index(0); +#ifdef ENABLE_PF1_PROXY + if (_dp_pf1_proxy_port.allocated) + dp_stop_eth_port(&_dp_pf1_proxy_port); +#endif + // without stopping started ports, DPDK complains DP_FOREACH_PORT(&_dp_ports, port) { if (port->allocated && port != pf0) dp_stop_eth_port(port); } - if (pf0->allocated) + if (pf0 && pf0->allocated) dp_stop_eth_port(pf0); } @@ -581,16 +542,16 @@ static int dp_port_install_async_isolated_mode(struct dp_port *port) static int dp_port_create_default_pf_async_templates(struct dp_port *port) { - DPS_LOG_INFO("Installing PF async templates", DP_LOG_PORTID(port->port_id)); + DPS_LOG_INFO("Installing PF async templates", DP_LOG_PORT(port)); if (DP_FAILED(dp_create_pf_async_isolation_templates(port))) { - DPS_LOG_ERR("Failed to create pf async isolation templates", DP_LOG_PORTID(port->port_id)); + DPS_LOG_ERR("Failed to create pf async isolation templates", DP_LOG_PORT(port)); return DP_ERROR; } #ifdef ENABLE_VIRTSVC if (DP_FAILED(dp_create_virtsvc_async_isolation_templates(port, IPPROTO_TCP)) || DP_FAILED(dp_create_virtsvc_async_isolation_templates(port, IPPROTO_UDP)) ) { - DPS_LOG_ERR("Failed to create virtsvc async isolation templates", DP_LOG_PORTID(port->port_id)); + DPS_LOG_ERR("Failed to create virtsvc async isolation templates", DP_LOG_PORT(port)); return DP_ERROR; } #endif @@ -647,9 +608,18 @@ int dp_start_port(struct dp_port *port) } #ifdef ENABLE_PF1_PROXY -int dp_start_pf_proxy_tap_port(void) +int dp_start_pf1_proxy_port(void) { - return dp_start_port(&_dp_pf_proxy_tap_port); + int ret; + + ret = rte_eth_dev_start(_dp_pf1_proxy_port.port_id); + if (DP_FAILED(ret)) { + DPS_LOG_ERR("Cannot start ethernet port", DP_LOG_PORT(&_dp_pf1_proxy_port), DP_LOG_RET(ret)); + return ret; + } + + _dp_pf1_proxy_port.allocated = true; + return DP_OK; } #endif diff --git a/src/dp_service.c b/src/dp_service.c index 05caf2829..8701f0977 100644 --- a/src/dp_service.c +++ b/src/dp_service.c @@ -60,23 +60,13 @@ static int dp_args_add_mellanox(int *orig_argc, char ***orig_argv) // add mellanox args (remember that they can be written to, so strdup()) dp_mlx_args[0] = dp_argv[curarg++] = strdup("-a"); dp_mlx_args[1] = dp_argv[curarg++] = strdup(dp_conf_get_eal_a_pf0()); - if (dp_conf_get_eal_a_pf1()[0] == '\0') { -#ifdef ENABLE_PF1_PROXY - if (dp_conf_is_pf1_proxy_enabled()) { - dp_mlx_args[2] = dp_argv[curarg++] = strdup("--vdev"); - dp_mlx_args[3] = dp_argv[curarg++] = strdup(dp_generate_eal_pf1_proxy_params()); - } else -#endif - { - dp_mlx_args[2] = dp_argv[curarg++] = strdup(""); - dp_mlx_args[3] = dp_argv[curarg++] = strdup(""); - } + dp_mlx_args[2] = dp_argv[curarg++] = strdup(""); + dp_mlx_args[3] = dp_argv[curarg++] = strdup(""); } else { dp_mlx_args[2] = dp_argv[curarg++] = strdup("-a"); dp_mlx_args[3] = dp_argv[curarg++] = strdup(dp_conf_get_eal_a_pf1()); } - if (!dp_mlx_args[0] || !dp_mlx_args[1] || !dp_mlx_args[2] || !dp_mlx_args[3]) { DP_EARLY_ERR("Cannot allocate Mellanox arguments"); return DP_ERROR; @@ -177,7 +167,8 @@ static int init_interfaces(void) return DP_ERROR; #ifdef ENABLE_PF1_PROXY - if (DP_FAILED(dp_start_pf_proxy_tap_port())) + if (dp_conf_is_pf1_proxy_enabled() + && DP_FAILED(dp_start_pf1_proxy_port())) return DP_ERROR; #endif diff --git a/src/dpdk_layer.c b/src/dpdk_layer.c index 109cd04c7..be4b87283 100644 --- a/src/dpdk_layer.c +++ b/src/dpdk_layer.c @@ -46,9 +46,9 @@ static int dp_dpdk_layer_init_unsafe(void) #ifdef ENABLE_PF1_PROXY if (dp_conf_is_pf1_proxy_enabled()) { dp_layer.rte_jumbo_mempool = rte_pktmbuf_pool_create("jumbo_mbuf_pool", DP_JUMBO_MBUF_POOL_SIZE, - DP_MEMPOOL_CACHE_SIZE, DP_MBUF_PRIV_DATA_SIZE, - DP_JUMBO_MBUF_BUF_SIZE, - rte_socket_id()); + DP_MEMPOOL_CACHE_SIZE, DP_MBUF_PRIV_DATA_SIZE, + DP_JUMBO_MBUF_BUF_SIZE, + rte_socket_id()); if (!dp_layer.rte_jumbo_mempool) { DPS_LOG_ERR("Cannot create jumbo mbuf pool", DP_LOG_RET(rte_errno)); return DP_ERROR; diff --git a/src/nodes/cls_node.c b/src/nodes/cls_node.c index a6a369d18..516e62713 100644 --- a/src/nodes/cls_node.c +++ b/src/nodes/cls_node.c @@ -136,7 +136,7 @@ static __rte_always_inline bool pf1_tap_proxy_forward(struct rte_mbuf *m) const struct rte_ipv6_hdr *ipv6_hdr; uint32_t l3_type; - if (m->port == dp_get_pf_proxy_tap_port()->port_id) + if (m->port == dp_get_pf1_proxy()->port_id) return true; // this duplicates code from the main classifier, to pass underlay/virtsvc packets diff --git a/src/nodes/pf1_proxy_node.c b/src/nodes/pf1_proxy_node.c index 72f742ece..5ca093d6b 100644 --- a/src/nodes/pf1_proxy_node.c +++ b/src/nodes/pf1_proxy_node.c @@ -13,7 +13,7 @@ static uint16_t pf1_tap_port_id; static int pf1_proxy_node_init(__rte_unused const struct rte_graph *graph, __rte_unused struct rte_node *node) { pf1_port_id = dp_get_pf1()->port_id; - pf1_tap_port_id = dp_get_pf_proxy_tap_port()->port_id; + pf1_tap_port_id = dp_get_pf1_proxy()->port_id; return DP_OK; } diff --git a/src/nodes/rx_node.c b/src/nodes/rx_node.c index 7d71e6168..45f2396c9 100644 --- a/src/nodes/rx_node.c +++ b/src/nodes/rx_node.c @@ -19,7 +19,7 @@ DP_NODE_REGISTER_SOURCE(RX, rx, NEXT_NODES); // there are multiple Tx nodes, one per port, node context is needed struct rx_node_ctx { - struct dp_port *port; + const struct dp_port *port; uint16_t queue_id; }; static_assert(sizeof(struct rx_node_ctx) <= RTE_NODE_CTX_SZ, @@ -53,7 +53,7 @@ static int rx_node_init(const struct rte_graph *graph, struct rte_node *node) { struct rx_node_ctx *ctx = (struct rx_node_ctx *)node->ctx; uint16_t port_id; - struct dp_port *port; + const struct dp_port *port; // Find this node's dedicated port to be used in processing for (port_id = 0; port_id < RTE_DIM(rx_node_ids); ++port_id) From a04eeb4ef3f05e60d1e291bc8549d6a5e5ddd4b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Fri, 20 Sep 2024 16:17:08 +0200 Subject: [PATCH 02/16] Simplified dp_port code around proxy --- src/dp_port.c | 166 ++++++++++++++++++++++++++------------------------ 1 file changed, 88 insertions(+), 78 deletions(-) diff --git a/src/dp_port.c b/src/dp_port.c index 1aa8a4165..f43738dcd 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -90,10 +90,20 @@ struct dp_port *dp_get_port_by_name(const char *pci_name) return _dp_port_table[port_id]; } +static void dp_set_neighmac(struct dp_port *port, const struct rte_ether_addr *mac) +{ + char strmac[18]; + + rte_ether_addr_copy(mac, &port->neigh_mac); + + snprintf(strmac, sizeof(strmac), RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(&port->neigh_mac)); + DPS_LOG_INFO("Setting neighboring MAC", _DP_LOG_STR("mac", strmac), DP_LOG_PORT(port)); +} + static int dp_port_init_ethdev(struct dp_port *port, struct rte_eth_dev_info *dev_info) { struct dp_dpdk_layer *dp_layer = get_dpdk_layer(); - struct rte_ether_addr pf_neigh_mac; + struct rte_ether_addr pf_neigh_mac = {0}; struct rte_eth_txconf txq_conf; struct rte_eth_rxconf rxq_conf; struct rte_eth_conf port_conf = port_conf_default; @@ -174,8 +184,15 @@ static int dp_port_init_ethdev(struct dp_port *port, struct rte_eth_dev_info *de if (port->is_pf) { if (DP_FAILED(dp_get_pf_neigh_mac(dev_info->if_index, &pf_neigh_mac, &port->own_mac))) return DP_ERROR; - rte_ether_addr_copy(&pf_neigh_mac, &port->neigh_mac); + dp_set_neighmac(port, &pf_neigh_mac); } +#ifdef ENABLE_PF1_PROXY + else if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1_proxy()) + dp_set_neighmac(port, &dp_get_pf1()->neigh_mac); +#endif + + if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) + return DP_ERROR; return DP_OK; } @@ -198,34 +215,45 @@ static int dp_port_flow_isolate(uint16_t port_id) return DP_OK; } -static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info, bool is_pf, bool is_proxied) +static int dp_get_port_socket_id(uint16_t port_id) { - static int last_pf1_hairpin_tx_rx_queue_offset = 1; - struct dp_port *port; int socket_id; - int ret; if (port_id >= RTE_DIM(_dp_port_table)) { DPS_LOG_ERR("Invalid port id", DP_LOG_PORTID(port_id), DP_LOG_MAX(RTE_DIM(_dp_port_table))); - return NULL; - } - - if (is_pf && !is_proxied) { - if (dp_conf_get_nic_type() != DP_CONF_NIC_TYPE_TAP) - if (DP_FAILED(dp_port_flow_isolate(port_id))) - return NULL; + return DP_ERROR; } socket_id = rte_eth_dev_socket_id(port_id); if (DP_FAILED(socket_id)) { if (socket_id == SOCKET_ID_ANY) { - DPS_LOG_WARNING("Cannot get numa socket", DP_LOG_PORTID(port_id)); + DPS_LOG_WARNING("Cannot get numa socket, using 'any'", DP_LOG_PORTID(port_id)); } else { DPS_LOG_ERR("Cannot get numa socket", DP_LOG_PORTID(port_id), DP_LOG_RET(rte_errno)); - return NULL; + return DP_ERROR; } } + return socket_id; +} + +static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info, bool is_pf, bool is_proxied) +{ + static int last_pf1_hairpin_tx_rx_queue_offset = 1; + struct dp_port *port; + int socket_id; + int ret; + + socket_id = dp_get_port_socket_id(port_id); + if (DP_FAILED(socket_id) && socket_id != SOCKET_ID_ANY) + return NULL; + + if (is_pf && !is_proxied) { + if (dp_conf_get_nic_type() != DP_CONF_NIC_TYPE_TAP) + if (DP_FAILED(dp_port_flow_isolate(port_id))) + return NULL; + } + // oveflow check done by liming the number of calls to this function port = _dp_ports.end++; port->is_pf = is_pf; @@ -239,11 +267,6 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) return NULL; - if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) - return NULL; - - // TODO should proxied PF be promiscuous? To send everything? - if (is_pf) { ret = rte_eth_dev_callback_register(port_id, RTE_ETH_EVENT_INTR_LSC, dp_link_status_change_event_callback, NULL); if (DP_FAILED(ret)) { @@ -267,22 +290,14 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d } #ifdef ENABLE_PF1_PROXY -// TODO needs cleanup maybe merging! static struct dp_port *dp_port_init_pf1_proxy_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info) { struct dp_port *port; int socket_id; - int ret; - socket_id = rte_eth_dev_socket_id(port_id); - if (DP_FAILED(socket_id)) { - if (socket_id == SOCKET_ID_ANY) { - DPS_LOG_WARNING("Cannot get numa socket", DP_LOG_PORTID(port_id)); - } else { - DPS_LOG_ERR("Cannot get numa socket", DP_LOG_PORTID(port_id), DP_LOG_RET(rte_errno)); - return NULL; - } - } + socket_id = dp_get_port_socket_id(port_id); + if (DP_FAILED(socket_id) && socket_id != SOCKET_ID_ANY) + return NULL; port = &_dp_pf1_proxy_port; port->is_pf = false; @@ -293,17 +308,6 @@ static struct dp_port *dp_port_init_pf1_proxy_interface(uint16_t port_id, struct if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) return NULL; - // TODO eswitch is implied by the proxy - if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) - return NULL; - - DPS_LOG_INFO("INIT setting PF1 proxy to promiscuous mode", DP_LOG_PORT(port)); - ret = rte_eth_promiscuous_enable(port->port_id); - if (DP_FAILED(ret)) { - DPS_LOG_ERR("Promiscuous mode setting failed", DP_LOG_PORT(port), DP_LOG_RET(ret)); - return NULL; - } - return port; } #endif @@ -324,61 +328,67 @@ static int dp_port_set_up_hairpins(void) return DP_OK; } -static int dp_port_init_pf(const char *pf_name) +static int dp_find_port(const char *iface_name, uint16_t *out_port_id, struct rte_eth_dev_info *out_dev_info) { uint16_t port_id; - struct rte_eth_dev_info dev_info; char ifname[IF_NAMESIZE] = {0}; - struct dp_port *port; - bool proxied; RTE_ETH_FOREACH_DEV(port_id) { - if (DP_FAILED(dp_get_dev_info(port_id, &dev_info, ifname))) + if (DP_FAILED(dp_get_dev_info(port_id, out_dev_info, ifname))) return DP_ERROR; - if (!strncmp(pf_name, ifname, sizeof(ifname))) { - DPS_LOG_INFO("INIT initializing PF port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); -#ifdef ENABLE_PF1_PROXY - proxied = dp_conf_is_pf1_proxy_enabled() && !strncmp(pf_name, dp_conf_get_pf1_name(), sizeof(ifname)); -#else - proxied = false; -#endif - port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_PF, proxied); - if (!port) - return DP_ERROR; - snprintf(port->port_name, sizeof(port->port_name), "%s", pf_name); + if (!strncmp(iface_name, ifname, sizeof(ifname))) { + *out_port_id = port_id; return DP_OK; } } - DPS_LOG_ERR("No such PF", DP_LOG_NAME(pf_name)); + DPS_LOG_ERR("No such interface", DP_LOG_NAME(iface_name)); return DP_ERROR; } +static int dp_port_init_pf(const char *pf_name) +{ + uint16_t port_id; + struct rte_eth_dev_info dev_info; + struct dp_port *port; + bool proxied; + + if (DP_FAILED(dp_find_port(pf_name, &port_id, &dev_info))) + return DP_ERROR; + + DPS_LOG_INFO("INIT initializing PF port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(pf_name)); +#ifdef ENABLE_PF1_PROXY + proxied = dp_conf_is_pf1_proxy_enabled() && !strcmp(pf_name, dp_conf_get_pf1_name()); +#else + proxied = false; +#endif + port = dp_port_init_interface(port_id, &dev_info, DP_PORT_INIT_PF, proxied); + if (!port) + return DP_ERROR; + + snprintf(port->port_name, sizeof(port->port_name), "%s", pf_name); + return DP_OK; +} + #ifdef ENABLE_PF1_PROXY -// TODO this can be merged with the others maybe static int dp_port_init_pf1_proxy(const char *pf1_proxy_name) { - if (!dp_conf_is_pf1_proxy_enabled()) - return DP_OK; - uint16_t port_id; struct rte_eth_dev_info dev_info; - char ifname[IF_NAMESIZE] = {0}; struct dp_port *port; - RTE_ETH_FOREACH_DEV(port_id) { - if (DP_FAILED(dp_get_dev_info(port_id, &dev_info, ifname))) - return DP_ERROR; - if (!strncmp(pf1_proxy_name, ifname, sizeof(ifname))) { - DPS_LOG_INFO("INIT initializing PF1 proxy port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(ifname)); - port = dp_port_init_pf1_proxy_interface(port_id, &dev_info); - if (!port) - return DP_ERROR; - snprintf(port->port_name, sizeof(port->port_name), "%s", pf1_proxy_name); - return DP_OK; - } - } - DPS_LOG_ERR("No such PF1 proxy port", DP_LOG_NAME(pf1_proxy_name)); - return DP_ERROR; + if (!dp_conf_is_pf1_proxy_enabled()) + return DP_OK; + + if (DP_FAILED(dp_find_port(pf1_proxy_name, &port_id, &dev_info))) + return DP_ERROR; + + DPS_LOG_INFO("INIT initializing PF1 proxy port", DP_LOG_PORTID(port_id), DP_LOG_IFNAME(pf1_proxy_name)); + port = dp_port_init_pf1_proxy_interface(port_id, &dev_info); + if (!port) + return DP_ERROR; + + snprintf(port->port_name, sizeof(port->port_name), "%s", pf1_proxy_name); + return DP_OK; } #endif From 99907119013405e34b1b72d00deca987d7002c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Fri, 20 Sep 2024 17:46:59 +0200 Subject: [PATCH 03/16] Rewire pf1 proxy graph --- include/nodes/cls_node.h | 20 +++++++ src/dp_graph.c | 21 ++++++-- src/meson.build | 5 -- src/nodes/cls_node.c | 103 ++++++++++++++++--------------------- src/nodes/pf1_proxy_node.c | 63 ----------------------- 5 files changed, 82 insertions(+), 130 deletions(-) create mode 100644 include/nodes/cls_node.h delete mode 100644 src/nodes/pf1_proxy_node.c diff --git a/include/nodes/cls_node.h b/include/nodes/cls_node.h new file mode 100644 index 000000000..04ca2f57c --- /dev/null +++ b/include/nodes/cls_node.h @@ -0,0 +1,20 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef __INCLUDE_CLS_NODE_H__ +#define __INCLUDE_CLS_NODE_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef ENABLE_PF1_PROXY +int cls_node_append_tx(uint16_t port_id, const char *tx_node_name); +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/dp_graph.c b/src/dp_graph.c index 2dabbc696..4ba7f1804 100644 --- a/src/dp_graph.c +++ b/src/dp_graph.c @@ -10,6 +10,7 @@ #include "dp_timers.h" #include "monitoring/dp_graphtrace.h" #include "nodes/arp_node.h" +#include "nodes/cls_node.h" #include "nodes/dhcp_node.h" #include "nodes/dhcpv6_node.h" #include "nodes/ipip_encap_node.h" @@ -123,14 +124,28 @@ static rte_graph_t dp_graph_create(unsigned int lcore_id) #ifdef ENABLE_PF1_PROXY static int dp_graph_init_pf1_proxy(void) { + char name[RTE_NODE_NAMESIZE]; + uint16_t port_id; + if (!dp_conf_is_pf1_proxy_enabled()) return DP_OK; - const struct dp_port *port = dp_get_pf1_proxy(); - uint16_t port_id = port->port_id; + // pf1-proxy is not part of dp_ports list + // so create a separate Rx/Tx and wire Tx to CLS node + port_id = dp_get_pf1_proxy()->port_id; if (DP_FAILED(rx_node_create(port_id, 0)) - || DP_FAILED(tx_node_create(port_id))) // TODO wait, this is never used! (rewire CLS or remove this) + || DP_FAILED(tx_node_create(port_id))) + return DP_ERROR; + + snprintf(name, sizeof(name), "tx-%u", port_id); + if (DP_FAILED(cls_node_append_tx(port_id, name))) + return DP_ERROR; + + // also wire the PF1 Tx for return path + port_id = dp_get_pf1()->port_id; + snprintf(name, sizeof(name), "tx-%u", port_id); + if (DP_FAILED(cls_node_append_tx(port_id, name))) return DP_ERROR; return DP_OK; diff --git a/src/meson.build b/src/meson.build index 298ceef9b..8efd0e4a3 100644 --- a/src/meson.build +++ b/src/meson.build @@ -73,11 +73,6 @@ if get_option('enable_virtual_services') 'dp_virtsvc.c', ] endif -if get_option('enable_pf1_proxy') - dp_sources += [ - 'nodes/pf1_proxy_node.c', - ] -endif exe = executable('dpservice-bin', sources: [ dp_sources, grpc_generated, version_h ], diff --git a/src/nodes/cls_node.c b/src/nodes/cls_node.c index 516e62713..30b8b6c69 100644 --- a/src/nodes/cls_node.c +++ b/src/nodes/cls_node.c @@ -1,6 +1,7 @@ // SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors // SPDX-License-Identifier: Apache-2.0 +#include "nodes/cls_node.h" #include #include #include @@ -23,31 +24,43 @@ # define VIRTSVC_NEXT(NEXT) #endif -#ifdef ENABLE_PF1_PROXY -#define PF1_PROXY_NEXT(NEXT) NEXT(CLS_NEXT_PF1_PROXY, "pf1_proxy") -#else -#define PF1_PROXY_NEXT(NEXT) -#endif - #define NEXT_NODES(NEXT) \ NEXT(CLS_NEXT_ARP, "arp") \ NEXT(CLS_NEXT_IPV6_ND, "ipv6_nd") \ NEXT(CLS_NEXT_CONNTRACK, "conntrack") \ NEXT(CLS_NEXT_IPIP_DECAP, "ipip_decap") \ - PF1_PROXY_NEXT(NEXT) \ VIRTSVC_NEXT(NEXT) -#ifdef ENABLE_VIRTSVC DP_NODE_REGISTER(CLS, cls, NEXT_NODES); + +#ifdef ENABLE_PF1_PROXY +static bool pf1_proxy_enabled = false; +static uint16_t pf1_port_id; +static uint16_t pf1_proxy_port_id; +#endif + static int cls_node_init(__rte_unused const struct rte_graph *graph, __rte_unused struct rte_node *node) { +#ifdef ENABLE_PF1_PROXY + pf1_proxy_enabled = dp_conf_is_pf1_proxy_enabled(); + pf1_port_id = dp_get_pf1()->port_id; + pf1_proxy_port_id = dp_get_pf1_proxy()->port_id; +#endif +#ifdef ENABLE_VIRTSVC virtsvc_present = dp_virtsvc_get_count() > 0; virtsvc_ipv4_tree = dp_virtsvc_get_ipv4_tree(); virtsvc_ipv6_tree = dp_virtsvc_get_ipv6_tree(); +#endif return DP_OK; } -#else -DP_NODE_REGISTER_NOINIT(CLS, cls, NEXT_NODES); + +#ifdef ENABLE_PF1_PROXY +static uint16_t next_tx_index[DP_MAX_PORTS]; + +int cls_node_append_tx(uint16_t port_id, const char *tx_node_name) +{ + return dp_node_append_tx(DP_NODE_GET_SELF(cls), next_tx_index, port_id, tx_node_name); +} #endif static __rte_always_inline int is_arp(const struct rte_ether_hdr *ether_hdr) @@ -126,47 +139,6 @@ static __rte_always_inline struct dp_virtsvc *get_incoming_virtsvc(const struct } #endif -#ifdef ENABLE_PF1_PROXY -static __rte_always_inline bool pf1_tap_proxy_forward(struct rte_mbuf *m) -{ - if (!dp_conf_is_pf1_proxy_enabled()) - return false; - - const struct rte_ether_hdr *ether_hdr; - const struct rte_ipv6_hdr *ipv6_hdr; - uint32_t l3_type; - - if (m->port == dp_get_pf1_proxy()->port_id) - return true; - - // this duplicates code from the main classifier, to pass underlay/virtsvc packets - // TODO needs reworking if proxy is kept as a long-term solution - if (m->port == dp_get_pf1()->port_id) { - if (unlikely((m->packet_type & RTE_PTYPE_L2_MASK) != RTE_PTYPE_L2_ETHER)) - return true; - - ether_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *); - l3_type = m->packet_type & RTE_PTYPE_L3_MASK; - - if (RTE_ETH_IS_IPV6_HDR(l3_type)) { - ipv6_hdr = (const struct rte_ipv6_hdr *)(ether_hdr + 1); - if (ipv6_hdr->proto == IPPROTO_IPIP || ipv6_hdr->proto == IPPROTO_IPV6) - return false; -#ifdef ENABLE_VIRTSVC - if (virtsvc_present) { - if (get_incoming_virtsvc(ipv6_hdr)) - return false; - } -#endif - } - - return true; - } - - return false; -} -#endif - static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_node *node, struct rte_mbuf *m) { const struct rte_ether_hdr *ether_hdr; @@ -178,12 +150,6 @@ static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_nod struct dp_virtsvc *virtsvc; #endif -#ifdef ENABLE_PF1_PROXY - // TODO this is not the best way as this function duplicates work, needs reworking if pf1-proxy is kept in the future - if (unlikely(pf1_tap_proxy_forward(m))) - return CLS_NEXT_PF1_PROXY; -#endif - if (unlikely((m->packet_type & RTE_PTYPE_L2_MASK) != RTE_PTYPE_L2_ETHER)) return CLS_NEXT_DROP; @@ -244,8 +210,7 @@ static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_nod df->l3_type = RTE_ETHER_TYPE_IPV6; break; default: - df->l3_type = ntohs(ether_hdr->ether_type); - return CLS_NEXT_CONNTRACK; + return CLS_NEXT_DROP; } df->tun_info.l3_type = ntohs(ether_hdr->ether_type); dp_extract_underlay_header(df, ipv6_hdr); @@ -261,6 +226,26 @@ static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_nod return CLS_NEXT_DROP; } +#ifdef ENABLE_PF1_PROXY +static __rte_always_inline rte_edge_t get_next_index_proxy(__rte_unused struct rte_node *node, struct rte_mbuf *m) +{ + rte_edge_t next; + + if (!pf1_proxy_enabled) + return get_next_index(node, m); + + if (m->port == pf1_proxy_port_id) + return next_tx_index[pf1_port_id]; + + next = get_next_index(node, m); + if (unlikely(next == CLS_NEXT_DROP && m->port == pf1_port_id)) + return next_tx_index[pf1_proxy_port_id]; + + return next; +} +#define get_next_index get_next_index_proxy +#endif + static uint16_t cls_node_process(struct rte_graph *graph, struct rte_node *node, void **objs, diff --git a/src/nodes/pf1_proxy_node.c b/src/nodes/pf1_proxy_node.c deleted file mode 100644 index 5ca093d6b..000000000 --- a/src/nodes/pf1_proxy_node.c +++ /dev/null @@ -1,63 +0,0 @@ -// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors -// SPDX-License-Identifier: Apache-2.0 - -#include -#include -#include "nodes/common_node.h" - -DP_NODE_REGISTER(PF1_PROXY, pf1_proxy, DP_NODE_DEFAULT_NEXT_ONLY); - -static uint16_t pf1_port_id; -static uint16_t pf1_tap_port_id; - -static int pf1_proxy_node_init(__rte_unused const struct rte_graph *graph, __rte_unused struct rte_node *node) -{ - pf1_port_id = dp_get_pf1()->port_id; - pf1_tap_port_id = dp_get_pf1_proxy()->port_id; - return DP_OK; -} - -static __rte_always_inline int pf1_proxy_packet(struct rte_node *node, - struct rte_mbuf *pkt) -{ - uint16_t port_id; - uint16_t sent_count; - - if (pkt->port == pf1_tap_port_id) { - port_id = pf1_port_id; - } else if (pkt->port == pf1_port_id) { - port_id = pf1_tap_port_id; - } else { - DPNODE_LOG_WARNING(node, "Unexpected packet in PF1 Proxy node", DP_LOG_PORTID(pkt->port)); - return DP_ERROR; - } - - sent_count = rte_eth_tx_burst(port_id, 0, &pkt, 1); - if (sent_count != 1) { - DPNODE_LOG_WARNING(node, "Unable to send packet through PF1 Proxy node", DP_LOG_PORTID(pkt->port)); - return DP_ERROR; - } - - dp_graphtrace_tx_burst(node, (void **)&pkt, 1, port_id); - return DP_OK; -} - -static uint16_t pf1_proxy_node_process(struct rte_graph *graph, - struct rte_node *node, - void **objs, - uint16_t nb_objs) -{ - dp_graphtrace_node_burst(node, objs, nb_objs); - - // since this node is emitting packets, dp_forward_* wrapper functions cannot be used - // this code should closely resemble the one inside those functions - - for (uint16_t i = 0; i < nb_objs; ++i) { - if (DP_FAILED(pf1_proxy_packet(node, objs[i]))) { - dp_graphtrace_next_burst(node, &objs[i], 1, PF1_PROXY_NEXT_DROP); - rte_node_enqueue(graph, node, PF1_PROXY_NEXT_DROP, &objs[i], 1); - } - } - - return nb_objs; -} From 4153a93246340b2123eda4f2197a554558dd1b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Sat, 21 Sep 2024 01:19:59 +0200 Subject: [PATCH 04/16] Do not create isolation rules on proxied PFs --- src/dp_port.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/dp_port.c b/src/dp_port.c index f43738dcd..283ee202a 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -576,9 +576,13 @@ static int dp_init_port(struct dp_port *port) if (port->is_pf) { if (dp_conf_is_multiport_eswitch()) { - if (DP_FAILED(dp_port_create_default_pf_async_templates(port)) - || DP_FAILED(dp_port_install_async_isolated_mode(port))) - return DP_ERROR; + // no isolation on proxied PF +#ifdef ENABLE_PF1_PROXY + if (port == dp_get_pf0() || !dp_conf_is_pf1_proxy_enabled()) +#endif + if (DP_FAILED(dp_port_create_default_pf_async_templates(port)) + || DP_FAILED(dp_port_install_async_isolated_mode(port))) + return DP_ERROR; } else if (DP_FAILED(dp_port_install_sync_isolated_mode(port->port_id))) return DP_ERROR; From 589f54fad1636bd960425bed78818474c68d5343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Mon, 16 Sep 2024 01:30:45 +0200 Subject: [PATCH 05/16] Offloaded PF1 proxy --- include/dp_port.h | 8 + .../rte_flow/dp_rte_async_flow_pf1_proxy.h | 24 ++ include/rte_flow/dp_rte_flow_helpers.h | 11 + src/dp_graph.c | 6 +- src/dp_port.c | 12 + src/meson.build | 5 + src/nodes/cls_node.c | 13 +- src/rte_flow/dp_rte_async_flow_isolation.c | 80 ++++--- src/rte_flow/dp_rte_async_flow_pf1_proxy.c | 207 ++++++++++++++++++ test/local/dp_service.py | 2 +- test/local/test_telemetry.py | 11 +- 11 files changed, 323 insertions(+), 56 deletions(-) create mode 100644 include/rte_flow/dp_rte_async_flow_pf1_proxy.h create mode 100644 src/rte_flow/dp_rte_async_flow_pf1_proxy.c diff --git a/include/dp_port.h b/include/dp_port.h index de9955014..464d49a7b 100644 --- a/include/dp_port.h +++ b/include/dp_port.h @@ -57,6 +57,10 @@ struct dp_port_async_template { enum dp_port_async_template_type { DP_PORT_ASYNC_TEMPLATE_PF_ISOLATION, +#ifdef ENABLE_PF1_PROXY + DP_PORT_ASYNC_TEMPLATE_PF1_FROM_PROXY, + DP_PORT_ASYNC_TEMPLATE_PF1_TO_PROXY, +#endif #ifdef ENABLE_VIRTSVC DP_PORT_ASYNC_TEMPLATE_VIRTSVC_TCP_ISOLATION, DP_PORT_ASYNC_TEMPLATE_VIRTSVC_UDP_ISOLATION, @@ -67,6 +71,10 @@ enum dp_port_async_template_type { enum dp_port_async_flow_type { DP_PORT_ASYNC_FLOW_ISOLATE_IPIP, DP_PORT_ASYNC_FLOW_ISOLATE_IPV6, +#ifdef ENABLE_PF1_PROXY + DP_PORT_ASYNC_FLOW_PF1_FROM_PROXY, + DP_PORT_ASYNC_FLOW_PF1_TO_PROXY, +#endif DP_PORT_ASYNC_FLOW_COUNT, }; diff --git a/include/rte_flow/dp_rte_async_flow_pf1_proxy.h b/include/rte_flow/dp_rte_async_flow_pf1_proxy.h new file mode 100644 index 000000000..cf9cd1efe --- /dev/null +++ b/include/rte_flow/dp_rte_async_flow_pf1_proxy.h @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors +// SPDX-License-Identifier: Apache-2.0 + +#ifndef __INCLUDE_DP_RTE_FLOW_ASYNC_FLOW_PF1_PROXY_H__ +#define __INCLUDE_DP_RTE_FLOW_ASYNC_FLOW_PF1_PROXY_H__ + +#define DP_PF1_PROXY_RULE_COUNT 2 + +#ifdef __cplusplus +extern "C" { +#endif + +#include "dp_port.h" + +int dp_create_pf_async_from_proxy_templates(struct dp_port *port); +int dp_create_pf_async_to_proxy_templates(struct dp_port *port); + +uint16_t dp_create_pf1_proxy_async_isolation_rules(struct dp_port *port); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/rte_flow/dp_rte_flow_helpers.h b/include/rte_flow/dp_rte_flow_helpers.h index 27689886a..b8da4b7f5 100644 --- a/include/rte_flow/dp_rte_flow_helpers.h +++ b/include/rte_flow/dp_rte_flow_helpers.h @@ -38,6 +38,12 @@ union dp_flow_item_l4 { struct rte_flow_item_icmp6 icmp6; }; +#ifdef ENABLE_PF1_PROXY +static const struct rte_flow_item_ethdev dp_flow_item_ethdev_mask = { + .port_id = 0xffff, +}; +#endif + static const struct rte_flow_item_eth dp_flow_item_eth_mask = { .hdr.ether_type = 0xffff, }; @@ -62,6 +68,11 @@ static const struct rte_flow_item_ipv6 dp_flow_item_ipv6_dst_mask = { .hdr.dst_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", .hdr.proto = 0xff, }; +#ifdef ENABLE_PF1_PROXY +static const struct rte_flow_item_ipv6 dp_flow_item_ipv6_dst_only_mask = { + .hdr.dst_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", +}; +#endif static const struct rte_flow_item_ipv4 dp_flow_item_ipv4_dst_mask = { .hdr.dst_addr = 0xffffffff, diff --git a/src/dp_graph.c b/src/dp_graph.c index 4ba7f1804..76c28e454 100644 --- a/src/dp_graph.c +++ b/src/dp_graph.c @@ -131,11 +131,11 @@ static int dp_graph_init_pf1_proxy(void) return DP_OK; // pf1-proxy is not part of dp_ports list - // so create a separate Rx/Tx and wire Tx to CLS node + // so create a separate Tx and wire Tx to CLS node port_id = dp_get_pf1_proxy()->port_id; - if (DP_FAILED(rx_node_create(port_id, 0)) - || DP_FAILED(tx_node_create(port_id))) + // Note that there is no Rx node since all pf1-proxy -> pf1 packets are offloaded + if (DP_FAILED(tx_node_create(port_id))) return DP_ERROR; snprintf(name, sizeof(name), "tx-%u", port_id); diff --git a/src/dp_port.c b/src/dp_port.c index 283ee202a..aea93a7b7 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -17,6 +17,7 @@ #include "nodes/rx_node.h" #include "rte_flow/dp_rte_async_flow.h" #include "rte_flow/dp_rte_async_flow_isolation.h" +#include "rte_flow/dp_rte_async_flow_pf1_proxy.h" #include "rte_flow/dp_rte_async_flow_template.h" #include "rte_flow/dp_rte_flow.h" #include "rte_flow/dp_rte_flow_capture.h" @@ -557,6 +558,17 @@ static int dp_port_create_default_pf_async_templates(struct dp_port *port) DPS_LOG_ERR("Failed to create pf async isolation templates", DP_LOG_PORT(port)); return DP_ERROR; } +#ifdef ENABLE_PF1_PROXY + // Even though this is PF1 linking to VF on PF1, the rules need to be created in PF0 (multiport-eswitch mode) + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf0()) { + if (DP_FAILED(dp_create_pf_async_from_proxy_templates(port)) + || DP_FAILED(dp_create_pf_async_to_proxy_templates(port)) + ) { + DPS_LOG_ERR("Failed to create pf async proxy templates", DP_LOG_PORT(port)); + return DP_ERROR; + } + } +#endif #ifdef ENABLE_VIRTSVC if (DP_FAILED(dp_create_virtsvc_async_isolation_templates(port, IPPROTO_TCP)) || DP_FAILED(dp_create_virtsvc_async_isolation_templates(port, IPPROTO_UDP)) diff --git a/src/meson.build b/src/meson.build index 8efd0e4a3..80d523ae4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -73,6 +73,11 @@ if get_option('enable_virtual_services') 'dp_virtsvc.c', ] endif +if get_option('enable_pf1_proxy') + dp_sources += [ + 'rte_flow/dp_rte_async_flow_pf1_proxy.c', + ] +endif exe = executable('dpservice-bin', sources: [ dp_sources, grpc_generated, version_h ], diff --git a/src/nodes/cls_node.c b/src/nodes/cls_node.c index 30b8b6c69..4fdab3221 100644 --- a/src/nodes/cls_node.c +++ b/src/nodes/cls_node.c @@ -150,6 +150,8 @@ static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_nod struct dp_virtsvc *virtsvc; #endif + // this is where pf1-proxy -> pf1 should happen, but that is done via rte_flow rule + if (unlikely((m->packet_type & RTE_PTYPE_L2_MASK) != RTE_PTYPE_L2_ETHER)) return CLS_NEXT_DROP; @@ -229,16 +231,9 @@ static __rte_always_inline rte_edge_t get_next_index(__rte_unused struct rte_nod #ifdef ENABLE_PF1_PROXY static __rte_always_inline rte_edge_t get_next_index_proxy(__rte_unused struct rte_node *node, struct rte_mbuf *m) { - rte_edge_t next; - - if (!pf1_proxy_enabled) - return get_next_index(node, m); - - if (m->port == pf1_proxy_port_id) - return next_tx_index[pf1_port_id]; + rte_edge_t next = get_next_index(node, m); - next = get_next_index(node, m); - if (unlikely(next == CLS_NEXT_DROP && m->port == pf1_port_id)) + if (next == CLS_NEXT_DROP && pf1_proxy_enabled && m->port == pf1_port_id) return next_tx_index[pf1_proxy_port_id]; return next; diff --git a/src/rte_flow/dp_rte_async_flow_isolation.c b/src/rte_flow/dp_rte_async_flow_isolation.c index c20a6217d..7d000dd23 100644 --- a/src/rte_flow/dp_rte_async_flow_isolation.c +++ b/src/rte_flow/dp_rte_async_flow_isolation.c @@ -8,6 +8,9 @@ #include "dp_virtsvc.h" #endif #include "rte_flow/dp_rte_async_flow.h" +#ifdef ENABLE_PF1_PROXY +#include "rte_flow/dp_rte_async_flow_pf1_proxy.h" +#endif #include "rte_flow/dp_rte_async_flow_template.h" #include "rte_flow/dp_rte_flow_helpers.h" @@ -23,15 +26,15 @@ enum dp_isolation_actions_type { DP_ISOLATION_ACTIONS_COUNT, }; -static const struct rte_flow_pattern_template_attr default_pattern_template_attr = { +static const struct rte_flow_pattern_template_attr ingress_pattern_template_attr = { .ingress = 1 }; -static const struct rte_flow_actions_template_attr default_actions_template_attr = { +static const struct rte_flow_actions_template_attr ingress_actions_template_attr = { .ingress = 1 }; -static const struct rte_flow_template_table_attr pf_default_template_table_attr = { +static const struct rte_flow_template_table_attr pf_ingress_template_table_attr = { .flow_attr = { .group = 0, .ingress = 1, @@ -39,6 +42,7 @@ static const struct rte_flow_template_table_attr pf_default_template_table_attr .nb_flows = DP_ISOLATION_DEFAULT_TABLE_MAX_RULES, }; + int dp_create_pf_async_isolation_templates(struct dp_port *port) { struct dp_port_async_template *tmpl; @@ -58,20 +62,19 @@ int dp_create_pf_async_isolation_templates(struct dp_port *port) { .type = RTE_FLOW_ITEM_TYPE_IPV6, .mask = &dp_flow_item_ipv6_mask, }, - { .type = RTE_FLOW_ITEM_TYPE_END, - }, + { .type = RTE_FLOW_ITEM_TYPE_END }, }; tmpl->pattern_templates[DP_ISOLATION_PATTERN_IPV6_PROTO] - = dp_create_async_pattern_template(port->port_id, &default_pattern_template_attr, pattern); + = dp_create_async_pattern_template(port->port_id, &ingress_pattern_template_attr, pattern); static const struct rte_flow_action actions[] = { { .type = RTE_FLOW_ACTION_TYPE_QUEUE, }, { .type = RTE_FLOW_ACTION_TYPE_END, }, }; tmpl->actions_templates[DP_ISOLATION_ACTIONS_QUEUE] - = dp_create_async_actions_template(port->port_id, &default_actions_template_attr, actions, actions); + = dp_create_async_actions_template(port->port_id, &ingress_actions_template_attr, actions, actions); - tmpl->table_attr = &pf_default_template_table_attr; + tmpl->table_attr = &pf_ingress_template_table_attr; return dp_init_async_template(port->port_id, tmpl); } @@ -79,16 +82,16 @@ int dp_create_pf_async_isolation_templates(struct dp_port *port) #ifdef ENABLE_VIRTSVC int dp_create_virtsvc_async_isolation_templates(struct dp_port *port, uint8_t proto_id) { - struct dp_port_async_template *template; + struct dp_port_async_template *tmpl; - template = dp_alloc_async_template(DP_ISOLATION_PATTERN_COUNT, DP_ISOLATION_ACTIONS_COUNT); - if (!template) + tmpl = dp_alloc_async_template(DP_ISOLATION_PATTERN_COUNT, DP_ISOLATION_ACTIONS_COUNT); + if (!tmpl) return DP_ERROR; if (proto_id == IPPROTO_TCP) - port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_TCP_ISOLATION] = template; + port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_TCP_ISOLATION] = tmpl; else - port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_UDP_ISOLATION] = template; + port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_UDP_ISOLATION] = tmpl; const struct rte_flow_item tcp_src_pattern[] = { { .type = RTE_FLOW_ITEM_TYPE_ETH, @@ -100,35 +103,34 @@ int dp_create_virtsvc_async_isolation_templates(struct dp_port *port, uint8_t pr { .type = proto_id == IPPROTO_TCP ? RTE_FLOW_ITEM_TYPE_TCP : RTE_FLOW_ITEM_TYPE_UDP, .mask = proto_id == IPPROTO_TCP ? (const void *)&dp_flow_item_tcp_src_mask : (const void *)&dp_flow_item_udp_src_mask, }, - { .type = RTE_FLOW_ITEM_TYPE_END, - }, + { .type = RTE_FLOW_ITEM_TYPE_END }, }; - template->pattern_templates[DP_ISOLATION_PATTERN_IPV6_PROTO] - = dp_create_async_pattern_template(port->port_id, &default_pattern_template_attr, tcp_src_pattern); + tmpl->pattern_templates[DP_ISOLATION_PATTERN_IPV6_PROTO] + = dp_create_async_pattern_template(port->port_id, &ingress_pattern_template_attr, tcp_src_pattern); static const struct rte_flow_action actions[] = { { .type = RTE_FLOW_ACTION_TYPE_QUEUE, }, { .type = RTE_FLOW_ACTION_TYPE_END, }, }; - template->actions_templates[DP_ISOLATION_ACTIONS_QUEUE] - = dp_create_async_actions_template(port->port_id, &default_actions_template_attr, actions, actions); + tmpl->actions_templates[DP_ISOLATION_ACTIONS_QUEUE] + = dp_create_async_actions_template(port->port_id, &ingress_actions_template_attr, actions, actions); - template->table_attr = &pf_default_template_table_attr; + tmpl->table_attr = &pf_ingress_template_table_attr; - return dp_init_async_template(port->port_id, template); + return dp_init_async_template(port->port_id, tmpl); } #endif static struct rte_flow *dp_create_pf_async_isolation_rule(uint16_t port_id, uint8_t proto, struct rte_flow_template_table *template_table) { - struct rte_flow_item_eth eth_spec = { + const struct rte_flow_item_eth eth_spec = { .hdr.ether_type = htons(RTE_ETHER_TYPE_IPV6), }; - struct rte_flow_item_ipv6 ipv6_spec = { + const struct rte_flow_item_ipv6 ipv6_spec = { .hdr.proto = proto, }; - struct rte_flow_item pattern[] = { + const struct rte_flow_item pattern[] = { { .type = RTE_FLOW_ITEM_TYPE_ETH, .spec = ð_spec, }, @@ -161,7 +163,7 @@ struct rte_flow *dp_create_virtsvc_async_isolation_rule(uint16_t port_id, uint8_ const struct rte_flow_item_eth eth_spec = { .hdr.ether_type = htons(RTE_ETHER_TYPE_IPV6), }; - struct rte_flow_item_ipv6 ipv6_spec = { + const struct rte_flow_item_ipv6 ipv6_spec = { .hdr.proto = proto_id, .hdr.src_addr = DP_INIT_FROM_IPV6(svc_ipv6), }; @@ -187,7 +189,7 @@ struct rte_flow *dp_create_virtsvc_async_isolation_rule(uint16_t port_id, uint8_ static const struct rte_flow_action_queue queue_action = { .index = 0, }; - struct rte_flow_action actions[] = { + const struct rte_flow_action actions[] = { { .type = RTE_FLOW_ACTION_TYPE_QUEUE, .conf = &queue_action, }, @@ -210,7 +212,7 @@ int dp_create_pf_async_isolation_rules(struct dp_port *port) flow = dp_create_pf_async_isolation_rule(port->port_id, IPPROTO_IPIP, templates[DP_PORT_ASYNC_TEMPLATE_PF_ISOLATION]->template_table); if (!flow) { - DPS_LOG_ERR("Failed to install PF async IPIP isolation rule", DP_LOG_PORTID(port->port_id)); + DPS_LOG_ERR("Failed to install PF async IPIP isolation rule", DP_LOG_PORT(port)); return DP_ERROR; } else { port->default_async_rules.default_flows[DP_PORT_ASYNC_FLOW_ISOLATE_IPIP] = flow; @@ -220,31 +222,37 @@ int dp_create_pf_async_isolation_rules(struct dp_port *port) flow = dp_create_pf_async_isolation_rule(port->port_id, IPPROTO_IPV6, templates[DP_PORT_ASYNC_TEMPLATE_PF_ISOLATION]->template_table); if (!flow) { - DPS_LOG_ERR("Failed to install PF async IPV6 isolation rule", DP_LOG_PORTID(port->port_id)); - // cannot return, need to commit all previous rules + DPS_LOG_ERR("Failed to install PF async IPV6 isolation rule", DP_LOG_PORT(port)); + // cannot return, need to push all previous rules and then return error } else { port->default_async_rules.default_flows[DP_PORT_ASYNC_FLOW_ISOLATE_IPV6] = flow; rule_count++; } +#ifdef ENABLE_PF1_PROXY + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf0()) { + rules_required += DP_PF1_PROXY_RULE_COUNT; + rule_count += dp_create_pf1_proxy_async_isolation_rules(port); + // cannot return, need to push all previous rules and then return error + } +#endif + #ifdef ENABLE_VIRTSVC + rules_required += dp_virtsvc_get_count(); rule_count += dp_create_virtsvc_async_isolation_rules(port->port_id, templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_TCP_ISOLATION]->template_table, templates[DP_PORT_ASYNC_TEMPLATE_VIRTSVC_UDP_ISOLATION]->template_table); - // cannot end on error, need to commit partial success + // cannot return, need to push all previous rules and then return error #endif if (dp_blocking_commit_async_rules(port->port_id, rule_count)) { - DPS_LOG_ERR("Failed to commit PF async isolation rules", DP_LOG_PORTID(port->port_id)); + DPS_LOG_ERR("Failed to commit PF async isolation rules", DP_LOG_PORT(port)); return DP_ERROR; } - -#ifdef ENABLE_VIRTSVC - rules_required += dp_virtsvc_get_count(); -#endif + // only now we can fail due to previous errors if (rule_count != rules_required) { - DPS_LOG_ERR("Not all PF async isolation rules were installed", DP_LOG_VALUE(rule_count), DP_LOG_MAX(rules_required), DP_LOG_PORTID(port->port_id)); + DPS_LOG_ERR("Not all PF async isolation rules were installed", DP_LOG_VALUE(rule_count), DP_LOG_MAX(rules_required), DP_LOG_PORT(port)); return DP_ERROR; } diff --git a/src/rte_flow/dp_rte_async_flow_pf1_proxy.c b/src/rte_flow/dp_rte_async_flow_pf1_proxy.c new file mode 100644 index 000000000..0d70a7650 --- /dev/null +++ b/src/rte_flow/dp_rte_async_flow_pf1_proxy.c @@ -0,0 +1,207 @@ +// SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors +// SPDX-License-Identifier: Apache-2.0 + +#include "rte_flow/dp_rte_async_flow_pf1_proxy.h" +#include "rte_flow/dp_rte_async_flow.h" +#include "rte_flow/dp_rte_async_flow_template.h" +#include "rte_flow/dp_rte_flow_helpers.h" + +// having MAX equal to actual number of rules impacts throughput (for unknown reason) +#define DP_PF1_DEFAULT_TABLE_MAX_RULES (DP_PF1_PROXY_RULE_COUNT+1) + +enum dp_pf1_proxy_pattern_type { + DP_PF1_PROXY_PATTERN_REPR_PORT, + DP_PF1_PROXY_PATTERN_COUNT, +}; + +enum dp_pf1_proxy_actions_type { + DP_PF1_PROXY_ACTIONS_REPR_PORT, + DP_PF1_PROXY_ACTIONS_COUNT, +}; + +static const struct rte_flow_pattern_template_attr transfer_pattern_template_attr = { + .transfer = 1 +}; + +static const struct rte_flow_actions_template_attr transfer_actions_template_attr = { + .transfer = 1 +}; + +static const struct rte_flow_template_table_attr pf_transfer_template_table_attr = { + .flow_attr = { + .group = 0, + .transfer = 1, + }, + .nb_flows = DP_PF1_DEFAULT_TABLE_MAX_RULES, +}; + + +int dp_create_pf_async_from_proxy_templates(struct dp_port *port) +{ + struct dp_port_async_template *tmpl; + + tmpl = dp_alloc_async_template(DP_PF1_PROXY_PATTERN_COUNT, DP_PF1_PROXY_ACTIONS_COUNT); + if (!tmpl) + return DP_ERROR; + + port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_PF1_FROM_PROXY] = tmpl; + + static const struct rte_flow_item pattern[] = { + { .type = RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT, + .mask = &dp_flow_item_ethdev_mask, + }, + { .type = RTE_FLOW_ITEM_TYPE_END }, + }; + tmpl->pattern_templates[DP_PF1_PROXY_PATTERN_REPR_PORT] + = dp_create_async_pattern_template(port->port_id, &transfer_pattern_template_attr, pattern); + + static const struct rte_flow_action actions[] = { + { .type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT, }, + { .type = RTE_FLOW_ACTION_TYPE_END, }, + }; + tmpl->actions_templates[DP_PF1_PROXY_ACTIONS_REPR_PORT] + = dp_create_async_actions_template(port->port_id, &transfer_actions_template_attr, actions, actions); + + tmpl->table_attr = &pf_transfer_template_table_attr; + + return dp_init_async_template(port->port_id, tmpl); +} + +int dp_create_pf_async_to_proxy_templates(struct dp_port *port) +{ + struct dp_port_async_template *tmpl; + + tmpl = dp_alloc_async_template(DP_PF1_PROXY_PATTERN_COUNT, DP_PF1_PROXY_ACTIONS_COUNT); + if (!tmpl) + return DP_ERROR; + + port->default_async_rules.default_templates[DP_PORT_ASYNC_TEMPLATE_PF1_TO_PROXY] = tmpl; + + static const struct rte_flow_item pattern[] = { + { .type = RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT, + .mask = &dp_flow_item_ethdev_mask, + }, + { .type = RTE_FLOW_ITEM_TYPE_ETH, + .mask = &dp_flow_item_eth_mask, + }, + { .type = RTE_FLOW_ITEM_TYPE_IPV6, + .mask = &dp_flow_item_ipv6_dst_only_mask, + }, + { .type = RTE_FLOW_ITEM_TYPE_END }, + }; + tmpl->pattern_templates[DP_PF1_PROXY_PATTERN_REPR_PORT] + = dp_create_async_pattern_template(port->port_id, &transfer_pattern_template_attr, pattern); + + static const struct rte_flow_action actions[] = { + { .type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT, }, + { .type = RTE_FLOW_ACTION_TYPE_END, }, + }; + tmpl->actions_templates[DP_PF1_PROXY_ACTIONS_REPR_PORT] + = dp_create_async_actions_template(port->port_id, &transfer_actions_template_attr, actions, actions); + + tmpl->table_attr = &pf_transfer_template_table_attr; + + return dp_init_async_template(port->port_id, tmpl); +} + + +static struct rte_flow *dp_create_pf_async_from_proxy_rule(uint16_t port_id, + uint16_t src_port_id, uint16_t dst_port_id, + struct rte_flow_template_table *template_table) +{ + const struct rte_flow_item_ethdev src_port_pattern = { + .port_id = src_port_id, + }; + const struct rte_flow_item pattern[] = { + { .type = RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT, + .spec = &src_port_pattern, + }, + { .type = RTE_FLOW_ITEM_TYPE_END }, + }; + + const struct rte_flow_item_ethdev dst_port_action = { + .port_id = dst_port_id, + }; + const struct rte_flow_action actions[] = { + { .type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT, + .conf = &dst_port_action, + }, + { .type = RTE_FLOW_ACTION_TYPE_END }, + }; + + return dp_create_async_rule(port_id, template_table, + pattern, DP_PF1_PROXY_PATTERN_REPR_PORT, + actions, DP_PF1_PROXY_ACTIONS_REPR_PORT); +} + +static struct rte_flow *dp_create_pf_async_to_proxy_rule(uint16_t port_id, + uint16_t src_port_id, uint16_t dst_port_id, + struct rte_flow_template_table *template_table) +{ + const struct rte_flow_item_ethdev src_port_pattern = { + .port_id = src_port_id, + }; + const struct rte_flow_item_eth eth_ipv6_pattern = { + .type = htons(RTE_ETHER_TYPE_IPV6), + }; + const struct rte_flow_item_ipv6 ipv6_dst_pattern = { + .hdr.dst_addr = DP_INIT_FROM_IPV6(dp_conf_get_underlay_ip()), + }; + const struct rte_flow_item pattern[] = { + { .type = RTE_FLOW_ITEM_TYPE_REPRESENTED_PORT, + .spec = &src_port_pattern, + }, + { .type = RTE_FLOW_ITEM_TYPE_ETH, + .spec = ð_ipv6_pattern, + }, + { .type = RTE_FLOW_ITEM_TYPE_IPV6, + .spec = &ipv6_dst_pattern, + }, + { .type = RTE_FLOW_ITEM_TYPE_END }, + }; + + const struct rte_flow_item_ethdev dst_port_action = { + .port_id = dst_port_id, + }; + const struct rte_flow_action actions[] = { + { .type = RTE_FLOW_ACTION_TYPE_REPRESENTED_PORT, + .conf = &dst_port_action, + }, + { .type = RTE_FLOW_ACTION_TYPE_END }, + }; + + return dp_create_async_rule(port_id, template_table, + pattern, DP_PF1_PROXY_PATTERN_REPR_PORT, + actions, DP_PF1_PROXY_ACTIONS_REPR_PORT); +} + +uint16_t dp_create_pf1_proxy_async_isolation_rules(struct dp_port *port) +{ + uint16_t pf1_port_id = dp_get_pf1()->port_id; + uint16_t proxy_port_id = dp_get_pf1_proxy()->port_id; + struct dp_port_async_template **templates = port->default_async_rules.default_templates; + struct rte_flow *flow; + uint16_t rule_count = 0; + + flow = dp_create_pf_async_from_proxy_rule(port->port_id, proxy_port_id, pf1_port_id, + templates[DP_PORT_ASYNC_TEMPLATE_PF1_FROM_PROXY]->template_table); + if (!flow) { + DPS_LOG_ERR("Failed to install PF async pf1 from proxy rule", DP_LOG_PORT(port)); + return rule_count; + } + + port->default_async_rules.default_flows[DP_PORT_ASYNC_FLOW_PF1_FROM_PROXY] = flow; + rule_count++; + + flow = dp_create_pf_async_to_proxy_rule(port->port_id, pf1_port_id, proxy_port_id, + templates[DP_PORT_ASYNC_TEMPLATE_PF1_TO_PROXY]->template_table); + if (!flow) { + DPS_LOG_ERR("Failed to install PF async pf1 to proxy rule", DP_LOG_PORT(port)); + return rule_count; + } + + port->default_async_rules.default_flows[DP_PORT_ASYNC_FLOW_PF1_TO_PROXY] = flow; + rule_count++; + + return rule_count; +} diff --git a/test/local/dp_service.py b/test/local/dp_service.py index 048af8cd6..e376c4645 100755 --- a/test/local/dp_service.py +++ b/test/local/dp_service.py @@ -126,7 +126,7 @@ def reconfigure_tests(self, cfgfile): elif key == "pf1": PF1.tap = value elif key == "pf1-proxy": - PF1.tap = "pf1-tap" + PF1.tap = "pf1-tap" # TODO works for now, but make better elif key == "vf-pattern": # MACs cannot be changed for VFs, use actual values VM1.mac = get_if_hwaddr(f"{value}0") diff --git a/test/local/test_telemetry.py b/test/local/test_telemetry.py index a6c98e7f1..0c88e5185 100644 --- a/test/local/test_telemetry.py +++ b/test/local/test_telemetry.py @@ -69,7 +69,6 @@ def get_telemetry(request): return response def check_tel_graph(key): - expected_tel_rx_node_count = 7 if PF1.tap == "pf1-tap" else 6 tel = get_telemetry(f"/dp_service/graph/{key}") assert tel is not None, \ "Missing graph telemetry" @@ -78,8 +77,8 @@ def check_tel_graph(key): # Check for rx-X-0 pattern where X can be any number rx_nodes = [node for node in tel["Node_0_to_255"] if re.match(r'rx-\d+-0', node)] - assert len(rx_nodes) == expected_tel_rx_node_count, \ - f"Expected {expected_tel_rx_node_count} 'rx-X-0' nodes, found {len(rx_nodes)} in {key} graph telemetry" + assert len(rx_nodes) == 6, \ + f"Expected 6 'rx-X-0' nodes, found {len(rx_nodes)} in {key} graph telemetry" def test_telemetry_graph(request, prepare_ifaces): @@ -139,17 +138,15 @@ def test_telemetry_exporter(request, prepare_ifaces, start_exporter): else: assert metric.startswith("#"), \ f"Unknown exported metric '{metric.split('{')[0]}' found" - # meson options (e.g. enable_pf1_proxy) are hard to do in these scripts, so just check manually + # meson options (e.g. enable_virtual_services) are hard to do in these scripts, so just check manually graph_nodes = GRAPH_NODES iface_stats = IFACE_STATS - if 'pf1_proxy' in graph_stats: - graph_nodes += ('pf1_proxy',) if 'virtsvc' in graph_stats: graph_nodes += ('virtsvc',) if request.config.getoption("--hw"): iface_stats += HW_IFACE_STATS if PF1.tap == "pf1-tap": - graph_nodes += ('rx-6-0',) + graph_nodes += ('tx-6',) if 'rx_q1_bytes' in interface_stats: iface_stats += HW_PF1_IFACE_STATS assert graph_stats == set(graph_nodes), \ From 102e6e76109b9664e3a4ebca04a64a1803b537a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Thu, 19 Sep 2024 16:54:58 +0200 Subject: [PATCH 06/16] Assign a unique underlay address to each virtual service --- include/dp_virtsvc.h | 1 + include/rte_flow/dp_rte_async_flow_isolation.h | 3 ++- include/rte_flow/dp_rte_flow_helpers.h | 7 +++++++ src/dp_virtsvc.c | 4 +++- src/nodes/virtsvc_node.c | 13 ++----------- src/rte_flow/dp_rte_async_flow_isolation.c | 6 ++++-- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/include/dp_virtsvc.h b/include/dp_virtsvc.h index 4a34ad9e8..73012971b 100644 --- a/include/dp_virtsvc.h +++ b/include/dp_virtsvc.h @@ -46,6 +46,7 @@ struct dp_virtsvc { rte_be16_t service_port; uint8_t proto; uint16_t last_assigned_port; + union dp_ipv6 ul_addr; struct rte_hash *open_ports; struct dp_virtsvc_conn connections[DP_VIRTSVC_PORTCOUNT]; struct rte_flow *isolation_rules[DP_MAX_PF_PORTS]; diff --git a/include/rte_flow/dp_rte_async_flow_isolation.h b/include/rte_flow/dp_rte_async_flow_isolation.h index 080ccc1a0..2fa7a40de 100644 --- a/include/rte_flow/dp_rte_async_flow_isolation.h +++ b/include/rte_flow/dp_rte_async_flow_isolation.h @@ -22,7 +22,8 @@ int dp_create_virtsvc_async_isolation_templates(struct dp_port *port, uint8_t pr struct rte_flow *dp_create_virtsvc_async_isolation_rule(uint16_t port_id, uint8_t proto_id, const union dp_ipv6 *svc_ipv6, rte_be16_t svc_port, - struct rte_flow_template_table *template_table); + struct rte_flow_template_table *template_table, + const union dp_ipv6 *ul_addr); #endif #ifdef __cplusplus diff --git a/include/rte_flow/dp_rte_flow_helpers.h b/include/rte_flow/dp_rte_flow_helpers.h index b8da4b7f5..0953c97c0 100644 --- a/include/rte_flow/dp_rte_flow_helpers.h +++ b/include/rte_flow/dp_rte_flow_helpers.h @@ -68,6 +68,13 @@ static const struct rte_flow_item_ipv6 dp_flow_item_ipv6_dst_mask = { .hdr.dst_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", .hdr.proto = 0xff, }; +#ifdef ENABLE_VIRTSVC +static const struct rte_flow_item_ipv6 dp_flow_item_ipv6_src_dst_mask = { + .hdr.src_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + .hdr.dst_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", + .hdr.proto = 0xff, +}; +#endif #ifdef ENABLE_PF1_PROXY static const struct rte_flow_item_ipv6 dp_flow_item_ipv6_dst_only_mask = { .hdr.dst_addr = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", diff --git a/src/dp_virtsvc.c b/src/dp_virtsvc.c index 84d2d2cba..46132a148 100644 --- a/src/dp_virtsvc.c +++ b/src/dp_virtsvc.c @@ -169,6 +169,7 @@ int dp_virtsvc_init(int socket_id) dp_virtservices_end->virtual_port = rule->virtual_port; dp_virtservices_end->service_port = rule->service_port; dp_copy_ipv6(&dp_virtservices_end->service_addr, &rule->service_addr); + dp_generate_ul_ipv6(&dp_virtservices_end->ul_addr); // last_assigned_port is 0 due to zmalloc() snprintf(hashtable_name, sizeof(hashtable_name), "virtsvc_table_%u", i); dp_virtservices_end->open_ports = dp_create_jhash_table(DP_VIRTSVC_PORTCOUNT, @@ -264,7 +265,8 @@ uint16_t dp_create_virtsvc_async_isolation_rules(uint16_t port_id, service->service_port, service->proto == IPPROTO_TCP ? tcp_template_table - : udp_template_table); + : udp_template_table, + &service->ul_addr); if (!flow) { DPS_LOG_ERR("Cannot create async virtsvc isolation rule", DP_LOG_VIRTSVC(service)); break; diff --git a/src/nodes/virtsvc_node.c b/src/nodes/virtsvc_node.c index 8f2459d1b..7cf468676 100644 --- a/src/nodes/virtsvc_node.c +++ b/src/nodes/virtsvc_node.c @@ -16,7 +16,7 @@ #include "nodes/common_node.h" #include "rte_flow/dp_rte_flow.h" -DP_NODE_REGISTER(VIRTSVC, virtsvc, DP_NODE_DEFAULT_NEXT_ONLY); +DP_NODE_REGISTER_NOINIT(VIRTSVC, virtsvc, DP_NODE_DEFAULT_NEXT_ONLY); static uint16_t next_tx_index[DP_MAX_PORTS]; @@ -25,15 +25,6 @@ int virtsvc_node_append_tx(uint16_t port_id, const char *tx_node_name) return dp_node_append_tx(DP_NODE_GET_SELF(virtsvc), next_tx_index, port_id, tx_node_name); } -// runtime constant, precompute -static const union dp_ipv6 *service_ul_ip; - -static int virtsvc_node_init(__rte_unused const struct rte_graph *graph, __rte_unused struct rte_node *node) -{ - service_ul_ip = dp_conf_get_underlay_ip(); - return DP_OK; -} - static __rte_always_inline void virtsvc_tcp_state_change(struct dp_virtsvc_conn *conn, uint8_t tcp_flags) { if (DP_TCP_PKT_FLAG_RST(tcp_flags)) { @@ -102,7 +93,7 @@ static __rte_always_inline uint16_t virtsvc_request_next(struct rte_node *node, ipv6_hdr->payload_len = htons((uint16_t)(hdr_total_len - sizeof(struct rte_ipv4_hdr))); ipv6_hdr->proto = proto; ipv6_hdr->hop_limits = ttl; - dp_set_src_ipv6(ipv6_hdr, service_ul_ip); + dp_set_src_ipv6(ipv6_hdr, &virtsvc->ul_addr); dp_set_dst_ipv6(ipv6_hdr, &virtsvc->service_addr); m->ol_flags |= RTE_MBUF_F_TX_IPV6; m->tx_offload = 0; diff --git a/src/rte_flow/dp_rte_async_flow_isolation.c b/src/rte_flow/dp_rte_async_flow_isolation.c index 7d000dd23..ad118c5f5 100644 --- a/src/rte_flow/dp_rte_async_flow_isolation.c +++ b/src/rte_flow/dp_rte_async_flow_isolation.c @@ -98,7 +98,7 @@ int dp_create_virtsvc_async_isolation_templates(struct dp_port *port, uint8_t pr .mask = &dp_flow_item_eth_mask, }, { .type = RTE_FLOW_ITEM_TYPE_IPV6, - .mask = &dp_flow_item_ipv6_src_mask, + .mask = &dp_flow_item_ipv6_src_dst_mask, }, { .type = proto_id == IPPROTO_TCP ? RTE_FLOW_ITEM_TYPE_TCP : RTE_FLOW_ITEM_TYPE_UDP, .mask = proto_id == IPPROTO_TCP ? (const void *)&dp_flow_item_tcp_src_mask : (const void *)&dp_flow_item_udp_src_mask, @@ -158,7 +158,8 @@ static struct rte_flow *dp_create_pf_async_isolation_rule(uint16_t port_id, uint #ifdef ENABLE_VIRTSVC struct rte_flow *dp_create_virtsvc_async_isolation_rule(uint16_t port_id, uint8_t proto_id, const union dp_ipv6 *svc_ipv6, rte_be16_t svc_port, - struct rte_flow_template_table *template_table) + struct rte_flow_template_table *template_table, + const union dp_ipv6 *ul_addr) { const struct rte_flow_item_eth eth_spec = { .hdr.ether_type = htons(RTE_ETHER_TYPE_IPV6), @@ -166,6 +167,7 @@ struct rte_flow *dp_create_virtsvc_async_isolation_rule(uint16_t port_id, uint8_ const struct rte_flow_item_ipv6 ipv6_spec = { .hdr.proto = proto_id, .hdr.src_addr = DP_INIT_FROM_IPV6(svc_ipv6), + .hdr.dst_addr = DP_INIT_FROM_IPV6(ul_addr), }; const struct rte_flow_item_tcp tcp_spec = { .hdr.src_port = svc_port, From e11317dc5c6c7b81ffae148c0dd3f70a30578e2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Tue, 24 Sep 2024 17:00:13 +0200 Subject: [PATCH 07/16] Update prepare script for pf1-proxy --- hack/prepare.sh | 79 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 23 deletions(-) diff --git a/hack/prepare.sh b/hack/prepare.sh index b392bf8b5..4dc64f1e4 100755 --- a/hack/prepare.sh +++ b/hack/prepare.sh @@ -140,32 +140,31 @@ process_multiport_eswitch_mode() { } function create_vf() { - local pf="${devs[0]}" + local pf0="${devs[0]}" + local pf1="${devs[1]}" if [[ "$IS_ARM_WITH_BLUEFIELD" == "true" ]]; then actualvfs=$NUMVFS log "Skipping VF creation for BlueField card on ARM" # enable switchdev mode, this operation takes most time - process_switchdev_mode "$pf" + process_switchdev_mode "$pf0" return fi if [[ "$CONFIG_ONLY" == "true" ]]; then - actualvfs=$(cat /sys/bus/pci/devices/$pf/sriov_numvfs) + actualvfs=$(cat /sys/bus/pci/devices/$pf0/sriov_numvfs) log "Skipping VF creation as requested" return fi # we disable automatic binding so that VFs don't get created, saves a lot of time # plus we don't need to unbind them before enabling switchdev mode - log "disabling automatic binding of VFs on pf: $pf" - echo 0 > /sys/bus/pci/devices/$pf/sriov_drivers_autoprobe - - # calculating amount of VFs to create, 126 if more are available, or maximum available - totalvfs=$(cat /sys/bus/pci/devices/$pf/sriov_totalvfs) - actualvfs=$((NUMVFS /sys/bus/pci/devices/$pf/sriov_numvfs + log "disabling automatic binding of VFs on pf0 '$pf0'" + echo 0 > /sys/bus/pci/devices/$pf0/sriov_drivers_autoprobe + if [[ "$OPT_PF1_PROXY" == "true" ]]; then + log "enabling automatic binding of VFs on pf1 '$pf1'" + echo 1 > /sys/bus/pci/devices/$pf1/sriov_drivers_autoprobe + fi if [[ "$IS_X86_WITH_MLX" == "true" ]]; then # enable switchdev mode, this operation takes most time @@ -174,7 +173,7 @@ function create_vf() { process_switchdev_mode "$pf" done else - process_switchdev_mode "$pf" + process_switchdev_mode "$pf0" fi fi @@ -183,19 +182,60 @@ function create_vf() { process_multiport_eswitch_mode "$pf" done fi + + # calculating amount of VFs to create, 126 if more are available, or maximum available + totalvfs=$(cat /sys/bus/pci/devices/$pf0/sriov_totalvfs) + actualvfs=$((NUMVFS /sys/bus/pci/devices/$pf0/sriov_numvfs + if [[ "$OPT_PF1_PROXY" == "true" ]]; then + log "creating pf1-proxy virtual function" + echo 1 > /sys/bus/pci/devices/$pf1/sriov_numvfs + log "configuring pf1-proxy" + local pf1proxy=$(get_pf1_proxy $pf1) + ip link set $pf1proxy mtu 9100 + ip link set $pf1proxy up + local pf1_name=$(get_ifname 1) + local pf1_mac=$(cat /sys/class/net/$pf1_name/address) + local pf1proxy_vf=$(get_pf1_proxy_vf) + ip link set $pf1proxy_vf mtu 9100 + ip link set $pf1proxy_vf address $pf1_mac + ip link set $pf1proxy_vf up + fi } function get_pattern() { local dev=$1 pattern=$(devlink port | grep pci/$dev/ | grep "virtual\|pcivf" | awk '{print $5}' | sed -rn 's/(.*[a-z_])[0-9]{1,3}$/\1/p' | uniq) if [ -z "$pattern" ]; then - err "can't determine the pattern for $dev" + err "can't determine the vf pattern for $dev" elif [ $(wc -l <<< "$pattern") -ne 1 ]; then - err "multiple patterns found for $dev" + err "multiple vf patterns found for $dev" fi echo "$pattern" } +function get_pf1_proxy() { + local dev=$1 + proxy=$(devlink port | grep pci/$dev/ | grep "virtual\|pcivf" | awk '{print $5}' | uniq) + if [ -z "$proxy" ]; then + err "can't determine the pf1-proxy vf for $dev" + elif [ $(wc -l <<< "$proxy") -ne 1 ]; then + err "multiple pf1-proxy devices found for $dev" + fi + echo "$proxy" +} + +function get_pf1_proxy_vf() { + vf=$(devlink port | grep auxiliary/mlx5_core.eth.2/ | grep virtual | awk '{print $5}' | uniq) + if [ -z "$vf" ]; then + err "can't determine the pf1-proxy vf" + elif [ $(wc -l <<< "$vf") -ne 1 ]; then + err "multiple pf1-proxy vfs found" + fi + echo "$vf" +} + function get_ifname() { local port=$1 devlink port | grep "physical port $port" | awk '{ print $5}' @@ -211,13 +251,6 @@ function get_ipv6() { done < <(ip -6 -o addr show lo | awk '{print $4}') } - -function get_pf_mac() { - local pci_dev=${devs[$1]} - local pf=$(get_ifname $1) - cat /sys/bus/pci/devices/$pci_dev/net/$pf/address -} - function make_config() { if [[ "$IS_X86_WITH_BLUEFIELD" == "true" ]]; then log "Skipping config file creation on AMD/Intel 64-bit host with Bluefield" @@ -233,7 +266,7 @@ function make_config() { if [[ "$OPT_MULTIPORT" == "true" ]]; then echo "a-pf0 ${devs[0]},class=rxq_cqe_comp_en=0,rx_vec_en=1,dv_flow_en=2,dv_esw_en=1,fdb_def_rule_en=1,representor=pf[0-1]vf[0-$[$actualvfs-1]]" if [[ "$OPT_PF1_PROXY" == "true" ]]; then - echo "pf1-proxy $(get_pf_mac 1)" + echo "pf1-proxy $(get_pf1_proxy ${devs[1]})" fi echo "multiport-eswitch" else @@ -244,7 +277,7 @@ function make_config() { if [[ "$OPT_MULTIPORT" == "true" ]]; then log "dpservice configured in multiport-eswitch mode" if [[ "$OPT_PF1_PROXY" == "true" ]]; then - log "dpservice will create a TAP device to proxy PF1" + log "dpservice will create a PF1-proxy" fi else log "dpservice configured in normal mode" From fc40f8c85e336a36808e430c36b57ea50e5c548b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Mon, 30 Sep 2024 23:46:31 +0200 Subject: [PATCH 08/16] Make pf1-proxy a command-line argument --- docs/deployment/help_dpservice-bin.md | 1 + hack/dp_conf.json | 9 +++++++++ include/dp_conf.h | 1 - include/dp_conf_opts.h | 3 +++ src/dp_conf.c | 14 +------------- src/dp_conf_opts.c | 27 ++++++++++++++++++++++++++- 6 files changed, 40 insertions(+), 15 deletions(-) diff --git a/docs/deployment/help_dpservice-bin.md b/docs/deployment/help_dpservice-bin.md index 960fb61e0..bceb7a451 100644 --- a/docs/deployment/help_dpservice-bin.md +++ b/docs/deployment/help_dpservice-bin.md @@ -6,6 +6,7 @@ | -v, --version | None | display version and exit | | | --pf0 | IFNAME | first physical interface (e.g. eth0) | | | --pf1 | IFNAME | second physical interface (e.g. eth1) | | +| --pf1-proxy | IFNAME | VF representor to use as a proxy for pf1 packets | | | --ipv6 | ADDR6 | IPv6 underlay address | | | --vf-pattern | PATTERN | virtual interface name pattern (e.g. 'eth1vf') | | | --dhcp-mtu | SIZE | set the mtu field in DHCP responses (68 - 1500) | | diff --git a/hack/dp_conf.json b/hack/dp_conf.json index c4c3c40c7..d89582c63 100644 --- a/hack/dp_conf.json +++ b/hack/dp_conf.json @@ -19,6 +19,15 @@ "type": "char", "array_size": "IF_NAMESIZE" }, + { + "lgopt": "pf1-proxy", + "arg": "IFNAME", + "help": "VF representor to use as a proxy for pf1 packets", + "var": "pf1_proxy", + "type": "char", + "array_size": "IF_NAMESIZE", + "ifdef": "ENABLE_PF1_PROXY" + }, { "lgopt": "ipv6", "arg": "ADDR6", diff --git a/include/dp_conf.h b/include/dp_conf.h index fb5f8ec1e..318b8e412 100644 --- a/include/dp_conf.h +++ b/include/dp_conf.h @@ -49,7 +49,6 @@ const struct dp_conf_dhcp_dns *dp_conf_get_dhcp_dns(void); const struct dp_conf_dhcp_dns *dp_conf_get_dhcpv6_dns(void); #ifdef ENABLE_PF1_PROXY -const char *dp_conf_get_pf1_proxy(void); bool dp_conf_is_pf1_proxy_enabled(void); #endif diff --git a/include/dp_conf_opts.h b/include/dp_conf_opts.h index 33d9f8260..c3e8b0a87 100644 --- a/include/dp_conf_opts.h +++ b/include/dp_conf_opts.h @@ -27,6 +27,9 @@ enum dp_conf_log_format { const char *dp_conf_get_pf0_name(void); const char *dp_conf_get_pf1_name(void); +#ifdef ENABLE_PF1_PROXY +const char *dp_conf_get_pf1_proxy(void); +#endif const char *dp_conf_get_vf_pattern(void); int dp_conf_get_dhcp_mtu(void); int dp_conf_get_wcmp_perc(void); diff --git a/src/dp_conf.c b/src/dp_conf.c index 8700ffc6e..2e6767d34 100644 --- a/src/dp_conf.c +++ b/src/dp_conf.c @@ -39,16 +39,9 @@ static struct dp_conf_virtual_services virtual_services = {0}; #endif #ifdef ENABLE_PF1_PROXY -static char dp_conf_pf1_proxy[IF_NAMESIZE] = {0}; - -const char *dp_conf_get_pf1_proxy(void) -{ - return dp_conf_pf1_proxy; -} - bool dp_conf_is_pf1_proxy_enabled(void) { - return *dp_conf_pf1_proxy; + return *pf1_proxy; } #endif @@ -286,11 +279,6 @@ static int parse_line(char *line, int lineno) if (!strcmp(key, "a-pf1")) return dp_argparse_string(value, eal_a_pf1, sizeof(eal_a_pf1)); -#ifdef ENABLE_PF1_PROXY - if (!strcmp(key, "pf1-proxy")) - return dp_argparse_string(value, dp_conf_pf1_proxy, sizeof(dp_conf_pf1_proxy)); -#endif - // Otherwise support all long options if (!longopt) { DP_EARLY_ERR("Config file: unknown key '%s'", key); diff --git a/src/dp_conf_opts.c b/src/dp_conf_opts.c index 049f4adc3..e63a8674d 100644 --- a/src/dp_conf_opts.c +++ b/src/dp_conf_opts.c @@ -20,6 +20,9 @@ enum { _OPT_SHOPT_MAX = 255, OPT_PF0, OPT_PF1, +#ifdef ENABLE_PF1_PROXY + OPT_PF1_PROXY, +#endif OPT_IPV6, OPT_VF_PATTERN, OPT_DHCP_MTU, @@ -56,6 +59,9 @@ static const struct option dp_conf_longopts[] = { { "version", 0, 0, OPT_VERSION }, { "pf0", 1, 0, OPT_PF0 }, { "pf1", 1, 0, OPT_PF1 }, +#ifdef ENABLE_PF1_PROXY + { "pf1-proxy", 1, 0, OPT_PF1_PROXY }, +#endif { "ipv6", 1, 0, OPT_IPV6 }, { "vf-pattern", 1, 0, OPT_VF_PATTERN }, { "dhcp-mtu", 1, 0, OPT_DHCP_MTU }, @@ -105,6 +111,9 @@ static const char *log_format_choices[] = { static char pf0_name[IF_NAMESIZE]; static char pf1_name[IF_NAMESIZE]; +#ifdef ENABLE_PF1_PROXY +static char pf1_proxy[IF_NAMESIZE]; +#endif static char vf_pattern[IF_NAMESIZE]; static int dhcp_mtu = 1500; static int wcmp_perc = 100; @@ -134,6 +143,13 @@ const char *dp_conf_get_pf1_name(void) return pf1_name; } +#ifdef ENABLE_PF1_PROXY +const char *dp_conf_get_pf1_proxy(void) +{ + return pf1_proxy; +} + +#endif const char *dp_conf_get_vf_pattern(void) { return vf_pattern; @@ -201,13 +217,15 @@ int dp_conf_get_flow_timeout(void) { return flow_timeout; } -#endif +#endif bool dp_conf_is_multiport_eswitch(void) { return multiport_eswitch; } + + /* These functions need to be implemented by the user of this generated code */ static void dp_argparse_version(void); static int dp_argparse_opt_ipv6(const char *arg); @@ -228,6 +246,9 @@ static inline void dp_argparse_help(const char *progname, FILE *outfile) " -v, --version display version and exit\n" " --pf0=IFNAME first physical interface (e.g. eth0)\n" " --pf1=IFNAME second physical interface (e.g. eth1)\n" +#ifdef ENABLE_PF1_PROXY + " --pf1-proxy=IFNAME VF representor to use as a proxy for pf1 packets\n" +#endif " --ipv6=ADDR6 IPv6 underlay address\n" " --vf-pattern=PATTERN virtual interface name pattern (e.g. 'eth1vf')\n" " --dhcp-mtu=SIZE set the mtu field in DHCP responses (68 - 1500)\n" @@ -266,6 +287,10 @@ static int dp_conf_parse_arg(int opt, const char *arg) return dp_argparse_string(arg, pf0_name, ARRAY_SIZE(pf0_name)); case OPT_PF1: return dp_argparse_string(arg, pf1_name, ARRAY_SIZE(pf1_name)); +#ifdef ENABLE_PF1_PROXY + case OPT_PF1_PROXY: + return dp_argparse_string(arg, pf1_proxy, ARRAY_SIZE(pf1_proxy)); +#endif case OPT_IPV6: return dp_argparse_opt_ipv6(arg); case OPT_VF_PATTERN: From ae921ed064936aa562fad22c568a12c6262012d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Thu, 3 Oct 2024 14:36:25 +0200 Subject: [PATCH 09/16] Update dataplane schema for pf1-proxy --- docs/sys_design/README.md | 22 ++++++++++++++++++ .../sys_design/dpservice_dataplane.drawio.png | Bin 142378 -> 151703 bytes docs/sys_design/dpservice_virtsvc.drawio.png | Bin 0 -> 54535 bytes 3 files changed, 22 insertions(+) create mode 100644 docs/sys_design/README.md create mode 100644 docs/sys_design/dpservice_virtsvc.drawio.png diff --git a/docs/sys_design/README.md b/docs/sys_design/README.md new file mode 100644 index 000000000..1d07e49a6 --- /dev/null +++ b/docs/sys_design/README.md @@ -0,0 +1,22 @@ +# Graph Framework +This is the graph topology for packets handled by dpservice. Offloaded packets never enter dpservice (and thus the graph) itself. + +![dpservice graph schema](dpservice_dataplane.drawio.png "dpservice graph schema") + +Note that every graph node actually has one other edge to it that leads to a **"Drop"** node, but for clarity this is omitted. As the name suggests, that node has no other edge and is simply dropping the packets without sending them anywhere. + +## PF1-proxy +When using a (conditionally compiled-in) pf1-proxy feature, all traffic for the host (i.e. not underlay traffic for dpservice) needs to be forwarded to a special VF on PF1 called "pf1-proxy" and back. + +### Traffic from proxy to PF1 +Since **all packets** without exception need to be forwarded directly to PF1, an rte-rule is installed to do just that, so all packets are offloaded and never enter the graph. + +### Traffic from PF1 to proxy +Only non-underlay IPv6 packets, i.e. IPv6 packets with destination IP matching the host's IP (`--ipv6` command-line argument) are directly forwarded by offloading via an rte-rule. The remaining packets enter dpservice normally and if they are classified as "unusable" (i.e. should be dropped by "Classify" node), they are instead forwarded to pf1-proxy. See the dashed graph edge above. + +## Virtual services +If virtual services are compiled-in, there is another path for packets to take. Packets going from a virtual IPv4 and TCP/UDP port to a specific web-service (i.e. specific IPv6 and TCP/UDP port) undergo an IP header replacement (from IPv4 to IPv6 and back) to enable VMs to contact IPv6 web-services without the use of NAT. This is useful for services that are heavily used by many connections, like DNS, k8s api-servers, etc. + +For this to work some changes to the graph topology are needed. For simplicity, this schema is separate and should be imagined as an "overlay" over the standard schema above. + +![dpservice virtual services schema](dpservice_virtsvc.drawio.png "virtual services graph schema") diff --git a/docs/sys_design/dpservice_dataplane.drawio.png b/docs/sys_design/dpservice_dataplane.drawio.png index 3757288ecbedb30d1d39e78ec6a03bb9446bd43f..2c3a5dd4f04c5c7b32f5c495199781af72079717 100644 GIT binary patch literal 151703 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
n>~Dt7o1pEO{Db(-(0xjGw-L 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 U8i@$aT?2nmC)Jg+j$gR)e=4hm?EnA( literal 142378 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

vWdr{4xusu4dM}bGvk+HP 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 KkI)UBFaHhCr5RQL diff --git a/docs/sys_design/dpservice_virtsvc.drawio.png b/docs/sys_design/dpservice_virtsvc.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..ab920ae93f8804105ea5ad59912b7890aba4d8eb GIT binary patch literal 54535 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 literal 0 HcmV?d00001 From 71a72113f64c413532b1530c162e265f6ff9a129 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Thu, 17 Oct 2024 18:05:24 +0200 Subject: [PATCH 10/16] Add Mellanox-specific firmware options for multiport-eswitch --- docs/deployment/mellanox.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/deployment/mellanox.md b/docs/deployment/mellanox.md index 2fb4c5f01..c7214cf7a 100644 --- a/docs/deployment/mellanox.md +++ b/docs/deployment/mellanox.md @@ -38,6 +38,11 @@ Set the number of VFs to the needed value (max 126 at the moment) and enable bot Restart the machine for the changes to take effect. > These changes are done in the NIC itself, it does not matter if the host is an ephemeral image or if another host OS will boot later. +### Multiport-eswitch +For this mode to be functional, an additional firmware setting `LAG_RESOURCE_ALLOCATION=1` is needed. + +In some cases (looks like a nic/switch combination) performance is severly affected when VM traffic is happening. This has been observed to be fixed by setting `ROCE_CONTROL=1` (this means "disabled", the default is `2` meaning "enabled"). The actual cause of this is yet to be discovered. + ## Dp-service setup Either `prepare.sh` script or `preparedp.service` systemd unit needs to be run before dp-service can work properly. This should already be done automatically if using the Docker image provided. Make sure this does not produce any errors. From 17bb85cf8b8bd628402b93da671bd1b7b76b10ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Thu, 17 Oct 2024 18:10:37 +0200 Subject: [PATCH 11/16] Add pf1-proxy build to tester image (compilation only) --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index c8ea6dae5..b5f5dc811 100644 --- a/Dockerfile +++ b/Dockerfile @@ -100,6 +100,7 @@ ARG DPSERVICE_FEATURES="" RUN meson setup release_build $DPSERVICE_FEATURES --buildtype=release && ninja -C release_build RUN CC=clang CXX=clang++ meson setup clang_build $DPSERVICE_FEATURES && ninja -C clang_build RUN meson setup xtratest_build $DPSERVICE_FEATURES -Denable_tests=true && ninja -C xtratest_build +RUN meson setup pf1_proxy_build $DPSERVICE_FEATURES -Denable_pf1_proxy=true && ninja -C pf1_proxy_build # Test-image to run pytest From 547e5a30769ce19cf4397cdd37c8e4055d26d63a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Mon, 16 Sep 2024 18:30:40 +0200 Subject: [PATCH 12/16] Retrieve initial link status for PFs --- src/dp_port.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/dp_port.c b/src/dp_port.c index aea93a7b7..0938e9927 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -614,6 +614,9 @@ static int dp_init_port(struct dp_port *port) int dp_start_port(struct dp_port *port) { + struct rte_eth_link link = { + .link_status = RTE_ETH_LINK_DOWN + }; int ret; ret = rte_eth_dev_start(port->port_id); @@ -628,7 +631,15 @@ int dp_start_port(struct dp_port *port) return ret; } - port->link_status = RTE_ETH_LINK_UP; + if (port->is_pf) { + // this really only fails on bad arguments (or incompatible driver) + ret = rte_eth_link_get(port->port_id, &link); + if (DP_FAILED(ret)) + DPS_LOG_WARNING("Unable to get the initial link status, assuming it down", DP_LOG_PORT(port), DP_LOG_RET(ret)); + } else + link.link_status = RTE_ETH_LINK_UP; + + port->link_status = link.link_status; port->allocated = true; return DP_OK; } From 8cae39177ba181065f8ca6b2c29d8b33b0e40002 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Wed, 25 Sep 2024 01:40:50 +0200 Subject: [PATCH 13/16] More verbose port startup and link state --- include/dp_log.h | 1 + include/dp_port.h | 1 + src/dp_port.c | 20 ++++++++++++++++++++ src/dp_service.c | 4 ++-- src/monitoring/dp_event.c | 6 ++---- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/include/dp_log.h b/include/dp_log.h index d596dc2ec..bf73ed725 100644 --- a/include/dp_log.h +++ b/include/dp_log.h @@ -53,6 +53,7 @@ extern "C" { #define DP_LOG_IFNAME(VALUE) _DP_LOG_STR("interface_name", VALUE) #define DP_LOG_LCORE(VALUE) _DP_LOG_UINT("lcore_id", VALUE) #define DP_LOG_RTE_GROUP(VALUE) _DP_LOG_UINT("rte_group", VALUE) +#define DP_LOG_LINKSTATE(VALUE) _DP_LOG_STR("link_state", (VALUE) ? "up" : "down") // networking stack #define DP_LOG_IPV4(VALUE) _DP_LOG_IPV4("ipv4", VALUE) #define DP_LOG_IPV6(VALUE) _DP_LOG_IPV6("ipv6", VALUE) diff --git a/include/dp_port.h b/include/dp_port.h index 464d49a7b..49eb4e452 100644 --- a/include/dp_port.h +++ b/include/dp_port.h @@ -129,6 +129,7 @@ void dp_ports_stop(void); void dp_ports_free(void); int dp_start_port(struct dp_port *port); +int dp_start_pf_port(uint16_t index); #ifdef ENABLE_PF1_PROXY int dp_start_pf1_proxy_port(void); #endif diff --git a/src/dp_port.c b/src/dp_port.c index 0938e9927..6645e647e 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -462,6 +462,8 @@ static int dp_stop_eth_port(struct dp_port *port) { int ret; + DPS_LOG_INFO("Stopping port", DP_LOG_PORT(port)); + if (dp_conf_is_multiport_eswitch()) { #ifdef ENABLE_VIRTSVC if (port->is_pf) @@ -619,6 +621,8 @@ int dp_start_port(struct dp_port *port) }; int ret; + DPS_LOG_INFO("Starting port", DP_LOG_PORT(port)); + ret = rte_eth_dev_start(port->port_id); if (DP_FAILED(ret)) { DPS_LOG_ERR("Cannot start ethernet port", DP_LOG_PORT(port), DP_LOG_RET(ret)); @@ -644,6 +648,22 @@ int dp_start_port(struct dp_port *port) return DP_OK; } +int dp_start_pf_port(uint16_t index) +{ + struct dp_port *port = dp_get_port_by_pf_index(index); + + if (!port) { + DPS_LOG_ERR("Invalid PF index", DP_LOG_VALUE(index), DP_LOG_MAX(DP_MAX_PF_PORTS)); + return DP_ERROR; + } + + if (DP_FAILED(dp_start_port(port))) + return DP_ERROR; + + DPS_LOG_INFO("Received initial PF link state", DP_LOG_LINKSTATE(port->link_status), DP_LOG_PORT(port)); + return DP_OK; +} + #ifdef ENABLE_PF1_PROXY int dp_start_pf1_proxy_port(void) { diff --git a/src/dp_service.c b/src/dp_service.c index 8701f0977..0e39ba372 100644 --- a/src/dp_service.c +++ b/src/dp_service.c @@ -160,10 +160,10 @@ static int init_interfaces(void) || DP_FAILED(dp_telemetry_init())) return DP_ERROR; - if (DP_FAILED(dp_start_port(dp_get_port_by_pf_index(0)))) + if (DP_FAILED(dp_start_pf_port(0))) return DP_ERROR; - if (DP_FAILED(dp_start_port(dp_get_port_by_pf_index(1)))) + if (DP_FAILED(dp_start_pf_port(1))) return DP_ERROR; #ifdef ENABLE_PF1_PROXY diff --git a/src/monitoring/dp_event.c b/src/monitoring/dp_event.c index 5956425ee..4302221a8 100644 --- a/src/monitoring/dp_event.c +++ b/src/monitoring/dp_event.c @@ -68,10 +68,7 @@ int dp_link_status_change_event_callback(uint16_t port_id, return ret; } - if (DP_FAILED(dp_send_event_link_msg(port_id, link.link_status))) - return DP_ERROR; - - return DP_OK; + return dp_send_event_link_msg(port_id, link.link_status); } void dp_process_event_link_msg(struct rte_mbuf *m) @@ -88,6 +85,7 @@ void dp_process_event_link_msg(struct rte_mbuf *m) } port->link_status = status; + DPS_LOG_INFO("PF link state changed", DP_LOG_LINKSTATE(port->link_status), DP_LOG_PORT(port)); } // Flow-aging message - sent periodically to age-out conntracked flows From 818d49dd44488744bc57bab3611ad487eb36cd0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Tue, 1 Oct 2024 23:53:25 +0200 Subject: [PATCH 14/16] Set neighboring router MAC on link state change --- docs/deployment/help_dpservice-bin.md | 1 + hack/dp_conf.json | 9 ++++ hack/prepare.sh | 1 + include/dp_conf_opts.h | 3 ++ include/dp_netlink.h | 3 +- include/dp_port.h | 3 ++ src/dp_conf_opts.c | 23 ++++++++ src/dp_netlink.c | 8 +-- src/dp_port.c | 76 +++++++++++++++++++-------- src/monitoring/dp_event.c | 3 ++ 10 files changed, 100 insertions(+), 30 deletions(-) diff --git a/docs/deployment/help_dpservice-bin.md b/docs/deployment/help_dpservice-bin.md index bceb7a451..b28e0ade0 100644 --- a/docs/deployment/help_dpservice-bin.md +++ b/docs/deployment/help_dpservice-bin.md @@ -7,6 +7,7 @@ | --pf0 | IFNAME | first physical interface (e.g. eth0) | | | --pf1 | IFNAME | second physical interface (e.g. eth1) | | | --pf1-proxy | IFNAME | VF representor to use as a proxy for pf1 packets | | +| --pf1-proxy-vf | IFNAME | VF interface of the pf1-proxy VF representor | | | --ipv6 | ADDR6 | IPv6 underlay address | | | --vf-pattern | PATTERN | virtual interface name pattern (e.g. 'eth1vf') | | | --dhcp-mtu | SIZE | set the mtu field in DHCP responses (68 - 1500) | | diff --git a/hack/dp_conf.json b/hack/dp_conf.json index d89582c63..75387ee4d 100644 --- a/hack/dp_conf.json +++ b/hack/dp_conf.json @@ -28,6 +28,15 @@ "array_size": "IF_NAMESIZE", "ifdef": "ENABLE_PF1_PROXY" }, + { + "lgopt": "pf1-proxy-vf", + "arg": "IFNAME", + "help": "VF interface of the pf1-proxy VF representor", + "var": "pf1_proxy_vf", + "type": "char", + "array_size": "IF_NAMESIZE", + "ifdef": "ENABLE_PF1_PROXY" + }, { "lgopt": "ipv6", "arg": "ADDR6", diff --git a/hack/prepare.sh b/hack/prepare.sh index 4dc64f1e4..8f67dd39f 100755 --- a/hack/prepare.sh +++ b/hack/prepare.sh @@ -267,6 +267,7 @@ function make_config() { echo "a-pf0 ${devs[0]},class=rxq_cqe_comp_en=0,rx_vec_en=1,dv_flow_en=2,dv_esw_en=1,fdb_def_rule_en=1,representor=pf[0-1]vf[0-$[$actualvfs-1]]" if [[ "$OPT_PF1_PROXY" == "true" ]]; then echo "pf1-proxy $(get_pf1_proxy ${devs[1]})" + echo "pf1-proxy-vf $(get_pf1_proxy_vf)" fi echo "multiport-eswitch" else diff --git a/include/dp_conf_opts.h b/include/dp_conf_opts.h index c3e8b0a87..a7c0b2dd1 100644 --- a/include/dp_conf_opts.h +++ b/include/dp_conf_opts.h @@ -30,6 +30,9 @@ const char *dp_conf_get_pf1_name(void); #ifdef ENABLE_PF1_PROXY const char *dp_conf_get_pf1_proxy(void); #endif +#ifdef ENABLE_PF1_PROXY +const char *dp_conf_get_pf1_proxy_vf(void); +#endif const char *dp_conf_get_vf_pattern(void); int dp_conf_get_dhcp_mtu(void); int dp_conf_get_wcmp_perc(void); diff --git a/include/dp_netlink.h b/include/dp_netlink.h index e731be7c0..39e9a689e 100644 --- a/include/dp_netlink.h +++ b/include/dp_netlink.h @@ -4,6 +4,7 @@ #ifndef __INCLUDE_DP_NETLINK_H__ #define __INCLUDE_DP_NETLINK_H__ +#include #include #include @@ -25,7 +26,7 @@ struct dp_nlnk_req { struct dp_nl_tlv if_tlv; }; -int dp_get_pf_neigh_mac(int if_idx, struct rte_ether_addr *neigh, const struct rte_ether_addr *own_mac); +int dp_get_pf_neigh_mac(uint32_t if_idx, struct rte_ether_addr *neigh, const struct rte_ether_addr *own_mac); #ifdef __cplusplus } diff --git a/include/dp_port.h b/include/dp_port.h index 49eb4e452..215fbe85d 100644 --- a/include/dp_port.h +++ b/include/dp_port.h @@ -89,6 +89,7 @@ struct dp_port { char dev_name[RTE_ETH_NAME_MAX_LEN]; uint8_t peer_pf_hairpin_tx_rx_queue_offset; uint16_t peer_pf_port_id; + uint32_t if_index; struct rte_ether_addr own_mac; struct rte_ether_addr neigh_mac; struct dp_port_iface iface; @@ -135,6 +136,8 @@ int dp_start_pf1_proxy_port(void); #endif int dp_stop_port(struct dp_port *port); +int dp_acquire_neigh_mac(struct dp_port *port); + int dp_port_meter_config(struct dp_port *port, uint64_t total_flow_rate_cap, uint64_t public_flow_rate_cap); static __rte_always_inline diff --git a/src/dp_conf_opts.c b/src/dp_conf_opts.c index e63a8674d..a06d718cd 100644 --- a/src/dp_conf_opts.c +++ b/src/dp_conf_opts.c @@ -22,6 +22,9 @@ _OPT_SHOPT_MAX = 255, OPT_PF1, #ifdef ENABLE_PF1_PROXY OPT_PF1_PROXY, +#endif +#ifdef ENABLE_PF1_PROXY + OPT_PF1_PROXY_VF, #endif OPT_IPV6, OPT_VF_PATTERN, @@ -61,6 +64,9 @@ static const struct option dp_conf_longopts[] = { { "pf1", 1, 0, OPT_PF1 }, #ifdef ENABLE_PF1_PROXY { "pf1-proxy", 1, 0, OPT_PF1_PROXY }, +#endif +#ifdef ENABLE_PF1_PROXY + { "pf1-proxy-vf", 1, 0, OPT_PF1_PROXY_VF }, #endif { "ipv6", 1, 0, OPT_IPV6 }, { "vf-pattern", 1, 0, OPT_VF_PATTERN }, @@ -114,6 +120,9 @@ static char pf1_name[IF_NAMESIZE]; #ifdef ENABLE_PF1_PROXY static char pf1_proxy[IF_NAMESIZE]; #endif +#ifdef ENABLE_PF1_PROXY +static char pf1_proxy_vf[IF_NAMESIZE]; +#endif static char vf_pattern[IF_NAMESIZE]; static int dhcp_mtu = 1500; static int wcmp_perc = 100; @@ -149,6 +158,13 @@ const char *dp_conf_get_pf1_proxy(void) return pf1_proxy; } +#endif +#ifdef ENABLE_PF1_PROXY +const char *dp_conf_get_pf1_proxy_vf(void) +{ + return pf1_proxy_vf; +} + #endif const char *dp_conf_get_vf_pattern(void) { @@ -248,6 +264,9 @@ static inline void dp_argparse_help(const char *progname, FILE *outfile) " --pf1=IFNAME second physical interface (e.g. eth1)\n" #ifdef ENABLE_PF1_PROXY " --pf1-proxy=IFNAME VF representor to use as a proxy for pf1 packets\n" +#endif +#ifdef ENABLE_PF1_PROXY + " --pf1-proxy-vf=IFNAME VF interface of the pf1-proxy VF representor\n" #endif " --ipv6=ADDR6 IPv6 underlay address\n" " --vf-pattern=PATTERN virtual interface name pattern (e.g. 'eth1vf')\n" @@ -290,6 +309,10 @@ static int dp_conf_parse_arg(int opt, const char *arg) #ifdef ENABLE_PF1_PROXY case OPT_PF1_PROXY: return dp_argparse_string(arg, pf1_proxy, ARRAY_SIZE(pf1_proxy)); +#endif +#ifdef ENABLE_PF1_PROXY + case OPT_PF1_PROXY_VF: + return dp_argparse_string(arg, pf1_proxy_vf, ARRAY_SIZE(pf1_proxy_vf)); #endif case OPT_IPV6: return dp_argparse_opt_ipv6(arg); diff --git a/src/dp_netlink.c b/src/dp_netlink.c index 0685cf417..adbd4a8b4 100644 --- a/src/dp_netlink.c +++ b/src/dp_netlink.c @@ -66,7 +66,7 @@ static int dp_recv_msg(struct sockaddr_nl sock_addr, int sock, char *buf, int bu return (int)msg_len; } -int dp_get_pf_neigh_mac(int if_idx, struct rte_ether_addr *neigh, const struct rte_ether_addr *own_mac) +int dp_get_pf_neigh_mac(uint32_t if_idx, struct rte_ether_addr *neigh, const struct rte_ether_addr *own_mac) { struct sockaddr_nl sa = { .nl_family = AF_NETLINK, @@ -119,11 +119,7 @@ int dp_get_pf_neigh_mac(int if_idx, struct rte_ether_addr *neigh, const struct r goto cleanup; } - // TODO this should be an error in production - if (DP_FAILED(dp_read_neigh((struct nlmsghdr *)reply, reply_len, neigh, own_mac))) - DPS_LOG_WARNING("No neighboring router found"); - - ret = DP_OK; + ret = dp_read_neigh((struct nlmsghdr *)reply, reply_len, neigh, own_mac); cleanup: close(sock); diff --git a/src/dp_port.c b/src/dp_port.c index 6645e647e..a89bdd1ec 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -1,14 +1,14 @@ // SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and IronCore contributors // SPDX-License-Identifier: Apache-2.0 -#include "dp_error.h" +#include "dp_port.h" #include #include "dp_conf.h" +#include "dp_error.h" #include "dp_hairpin.h" #include "dp_log.h" #include "dp_lpm.h" #include "dp_netlink.h" -#include "dp_port.h" #ifdef ENABLE_VIRTSVC # include "dp_virtsvc.h" #endif @@ -91,20 +91,9 @@ struct dp_port *dp_get_port_by_name(const char *pci_name) return _dp_port_table[port_id]; } -static void dp_set_neighmac(struct dp_port *port, const struct rte_ether_addr *mac) -{ - char strmac[18]; - - rte_ether_addr_copy(mac, &port->neigh_mac); - - snprintf(strmac, sizeof(strmac), RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(&port->neigh_mac)); - DPS_LOG_INFO("Setting neighboring MAC", _DP_LOG_STR("mac", strmac), DP_LOG_PORT(port)); -} - static int dp_port_init_ethdev(struct dp_port *port, struct rte_eth_dev_info *dev_info) { struct dp_dpdk_layer *dp_layer = get_dpdk_layer(); - struct rte_ether_addr pf_neigh_mac = {0}; struct rte_eth_txconf txq_conf; struct rte_eth_rxconf rxq_conf; struct rte_eth_conf port_conf = port_conf_default; @@ -182,16 +171,6 @@ static int dp_port_init_ethdev(struct dp_port *port, struct rte_eth_dev_info *de static_assert(sizeof(port->dev_name) == RTE_ETH_NAME_MAX_LEN, "Incompatible port dev_name size"); rte_eth_dev_get_name_by_port(port->port_id, port->dev_name); - if (port->is_pf) { - if (DP_FAILED(dp_get_pf_neigh_mac(dev_info->if_index, &pf_neigh_mac, &port->own_mac))) - return DP_ERROR; - dp_set_neighmac(port, &pf_neigh_mac); - } -#ifdef ENABLE_PF1_PROXY - else if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1_proxy()) - dp_set_neighmac(port, &dp_get_pf1()->neigh_mac); -#endif - if (dp_conf_is_multiport_eswitch() && DP_FAILED(dp_configure_async_flows(port->port_id))) return DP_ERROR; @@ -260,6 +239,7 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d port->is_pf = is_pf; port->port_id = port_id; port->socket_id = socket_id; + port->if_index = dev_info->if_index; _dp_port_table[port_id] = port; if (is_pf && DP_FAILED(dp_port_register_pf(port))) @@ -294,16 +274,24 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d static struct dp_port *dp_port_init_pf1_proxy_interface(uint16_t port_id, struct rte_eth_dev_info *dev_info) { struct dp_port *port; + uint32_t if_index; int socket_id; socket_id = dp_get_port_socket_id(port_id); if (DP_FAILED(socket_id) && socket_id != SOCKET_ID_ANY) return NULL; + if_index = if_nametoindex(dp_conf_get_pf1_proxy_vf()); + if (if_index == 0) { + DPS_LOG_ERR("Cannot get pf1-proxy vf interface index", DP_LOG_IFACE(dp_conf_get_pf1_proxy_vf())); + return NULL; + } + port = &_dp_pf1_proxy_port; port->is_pf = false; port->port_id = port_id; port->socket_id = socket_id; + port->if_index = if_index; _dp_port_table[port_id] = port; if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) @@ -661,6 +649,14 @@ int dp_start_pf_port(uint16_t index) return DP_ERROR; DPS_LOG_INFO("Received initial PF link state", DP_LOG_LINKSTATE(port->link_status), DP_LOG_PORT(port)); + + if (port->link_status == RTE_ETH_LINK_UP) +#ifdef ENABLE_PF1_PROXY + // Do not use PF1 in pf1-proxy mode as Linux does not use it then (thus the mac will never be there) + if (!dp_conf_is_pf1_proxy_enabled() || port != dp_get_pf1()) +#endif + dp_acquire_neigh_mac(port); + return DP_OK; } @@ -675,6 +671,9 @@ int dp_start_pf1_proxy_port(void) return ret; } + if (dp_get_pf1()->link_status == RTE_ETH_LINK_UP) + dp_acquire_neigh_mac(&_dp_pf1_proxy_port); + _dp_pf1_proxy_port.allocated = true; return DP_OK; } @@ -692,6 +691,37 @@ int dp_stop_port(struct dp_port *port) return DP_OK; } + +static void dp_set_neighmac(struct dp_port *port, const struct rte_ether_addr *mac) +{ + char strmac[18]; + + rte_ether_addr_copy(mac, &port->neigh_mac); + + snprintf(strmac, sizeof(strmac), RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(&port->neigh_mac)); + DPS_LOG_INFO("Setting neighboring MAC", _DP_LOG_STR("mac", strmac), DP_LOG_PORT(port)); +} + +int dp_acquire_neigh_mac(struct dp_port *port) +{ + struct rte_ether_addr pf_neigh_mac = {0}; + +#ifdef ENABLE_PF1_PROXY + // The pf1-proxy VF is actually the interface that Linux uses (thus has the right value) + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1()) + port = &_dp_pf1_proxy_port; +#endif + + if (DP_FAILED(dp_get_pf_neigh_mac(port->if_index, &pf_neigh_mac, &port->own_mac))) { + DPS_LOG_WARNING("No PF neighboring router", DP_LOG_PORT(port)); + return DP_ERROR; + } + + dp_set_neighmac(port, &pf_neigh_mac); + return DP_OK; +} + + static int dp_port_total_flow_meter_config(struct dp_port *port, uint64_t total_flow_rate_cap) { return dp_set_vf_rate_limit(port->port_id, total_flow_rate_cap); diff --git a/src/monitoring/dp_event.c b/src/monitoring/dp_event.c index 4302221a8..02e1a4f59 100644 --- a/src/monitoring/dp_event.c +++ b/src/monitoring/dp_event.c @@ -86,6 +86,9 @@ void dp_process_event_link_msg(struct rte_mbuf *m) port->link_status = status; DPS_LOG_INFO("PF link state changed", DP_LOG_LINKSTATE(port->link_status), DP_LOG_PORT(port)); + + if (status == RTE_ETH_LINK_UP) + dp_acquire_neigh_mac(port); } // Flow-aging message - sent periodically to age-out conntracked flows From 1e8379e74074c8b653f16704287b57338bdf209f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Wed, 25 Sep 2024 16:57:15 +0200 Subject: [PATCH 15/16] Check for neighboring mac with exponential backoff --- include/dp_port.h | 9 ++- include/monitoring/dp_event.h | 5 +- include/monitoring/dp_monitoring.h | 8 ++ src/dp_port.c | 117 +++++++++++++++++++++-------- src/monitoring/dp_event.c | 29 ++++++- src/monitoring/dp_monitoring.c | 3 + 6 files changed, 135 insertions(+), 36 deletions(-) diff --git a/include/dp_port.h b/include/dp_port.h index 215fbe85d..74886899e 100644 --- a/include/dp_port.h +++ b/include/dp_port.h @@ -7,8 +7,9 @@ #include #include #include -#include #include +#include +#include #include "dp_conf.h" #include "dp_firewall.h" #include "dp_internal_stats.h" @@ -107,6 +108,8 @@ struct dp_port { struct rte_flow *default_flows[DP_PORT_ASYNC_FLOW_COUNT]; } default_async_rules; }; + struct rte_timer neighmac_timer; + uint8_t neighmac_period; }; struct dp_ports { @@ -136,7 +139,9 @@ int dp_start_pf1_proxy_port(void); #endif int dp_stop_port(struct dp_port *port); -int dp_acquire_neigh_mac(struct dp_port *port); +void dp_start_acquiring_neigh_mac(struct dp_port *port); +void dp_stop_acquiring_neigh_mac(struct dp_port *port); +int dp_set_neigh_mac(uint16_t port_id, const struct rte_ether_addr *mac); int dp_port_meter_config(struct dp_port *port, uint64_t total_flow_rate_cap, uint64_t public_flow_rate_cap); diff --git a/include/monitoring/dp_event.h b/include/monitoring/dp_event.h index 76367b07d..8f39da2d6 100644 --- a/include/monitoring/dp_event.h +++ b/include/monitoring/dp_event.h @@ -11,6 +11,7 @@ extern "C" { #include #include #include +#include int dp_link_status_change_event_callback(uint16_t port_id, enum rte_eth_event_type type, @@ -19,9 +20,11 @@ int dp_link_status_change_event_callback(uint16_t port_id, void dp_process_event_link_msg(struct rte_mbuf *m); int dp_send_event_flow_aging_msg(void); - void dp_process_event_flow_aging_msg(struct rte_mbuf *m); +int dp_send_event_neighmac_msg(uint16_t port_id, struct rte_ether_addr *neighmac); +void dp_process_event_neighmac_msg(struct rte_mbuf *m); + #ifdef __cplusplus } #endif diff --git a/include/monitoring/dp_monitoring.h b/include/monitoring/dp_monitoring.h index 36af9b452..68691cf3e 100644 --- a/include/monitoring/dp_monitoring.h +++ b/include/monitoring/dp_monitoring.h @@ -5,6 +5,7 @@ #define __INCLUDE_DP_MONITORING_H__ #include +#include #include #include "dp_ipaddr.h" @@ -17,6 +18,7 @@ extern "C" { enum dp_event_type { DP_EVENT_TYPE_LINK_STATUS, DP_EVENT_TYPE_FLOW_AGING, + DP_EVENT_TYPE_NEIGHMAC, }; struct dp_event_msg_head { @@ -28,10 +30,16 @@ struct dp_link_status { uint8_t status; }; +struct dp_neighmac { + uint16_t port_id; + struct rte_ether_addr mac; +}; + struct dp_event_msg { struct dp_event_msg_head msg_head; union { struct dp_link_status link_status; + struct dp_neighmac neighmac; } event_entry; }; diff --git a/src/dp_port.c b/src/dp_port.c index a89bdd1ec..0f42c1192 100644 --- a/src/dp_port.c +++ b/src/dp_port.c @@ -29,6 +29,10 @@ #define DP_PORT_PROXIED true #define DP_PORT_NORMAL false +#define DP_PORT_NEIGHMAC_INITIAL_PERIOD 1 +#define DP_PORT_NEIGHMAC_BACKOFF_COEF 2 +#define DP_PORT_NEIGHMAC_MAX_PERIOD 60 + #define DP_METER_CIR_BASE_VALUE (1024 * 1024) // 1 Mbits #define DP_METER_EBS_BREAK_VALUE 100 // 100 Mbits/s, it used to differentiate different ebs calculation strategy to achieve relative stable metering results. epirical value. #define DP_METER_MBITS_TO_BYTES (1024 * 1024 / 8) @@ -254,6 +258,7 @@ static struct dp_port *dp_port_init_interface(uint16_t port_id, struct rte_eth_d DPS_LOG_ERR("Cannot register link status callback", DP_LOG_RET(ret)); return NULL; } + rte_timer_init(&port->neighmac_timer); } else { // All VFs belong to pf0, assign a tx queue from pf1 for it if (dp_conf_is_offload_enabled()) { @@ -292,6 +297,7 @@ static struct dp_port *dp_port_init_pf1_proxy_interface(uint16_t port_id, struct port->port_id = port_id; port->socket_id = socket_id; port->if_index = if_index; + rte_timer_init(&port->neighmac_timer); _dp_port_table[port_id] = port; if (DP_FAILED(dp_port_init_ethdev(port, dev_info))) @@ -570,6 +576,83 @@ static int dp_port_create_default_pf_async_templates(struct dp_port *port) return DP_OK; } + +static void dp_acquire_neigh_mac(struct dp_port *port); + +static void dp_neighmac_timer_cb(__rte_unused struct rte_timer *timer, void *arg) +{ + struct dp_port *port = arg; + + port->neighmac_period *= DP_PORT_NEIGHMAC_BACKOFF_COEF; + if (port->neighmac_period > DP_PORT_NEIGHMAC_MAX_PERIOD) + port->neighmac_period = DP_PORT_NEIGHMAC_MAX_PERIOD; + + dp_acquire_neigh_mac(port); +} + +static void dp_acquire_neigh_mac(struct dp_port *port) +{ + struct rte_ether_addr pf_neigh_mac = {0}; + int ret; + + if (DP_FAILED(dp_get_pf_neigh_mac(port->if_index, &pf_neigh_mac, &port->own_mac))) { + DPS_LOG_WARNING("No neighboring router, setting timer", DP_LOG_VALUE(port->neighmac_period), DP_LOG_PORT(port)); + + // need to use the same lcore each time, thus staying on main one even when called from the worker + ret = rte_timer_reset(&port->neighmac_timer, port->neighmac_period * rte_get_timer_hz(), + SINGLE, rte_get_main_lcore(), dp_neighmac_timer_cb, port); + if (DP_FAILED(ret)) + DPS_LOG_WARNING("Cannot start neigboring router timer", DP_LOG_PORT(port), DP_LOG_RET(ret)); + + return; + } + +#ifdef ENABLE_PF1_PROXY + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1_proxy()) + port = dp_get_port_by_pf_index(1); +#endif + if (DP_FAILED(dp_send_event_neighmac_msg(port->port_id, &pf_neigh_mac))) + DPS_LOG_WARNING("Cannot send neigboring router mac to worker thread"); +} + +void dp_start_acquiring_neigh_mac(struct dp_port *port) +{ +#ifdef ENABLE_PF1_PROXY + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1()) + port = &_dp_pf1_proxy_port; +#endif + port->neighmac_period = DP_PORT_NEIGHMAC_INITIAL_PERIOD; + dp_acquire_neigh_mac(port); +} + +void dp_stop_acquiring_neigh_mac(struct dp_port *port) +{ +#ifdef ENABLE_PF1_PROXY + if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1()) + port = &_dp_pf1_proxy_port; +#endif + rte_timer_stop_sync(&port->neighmac_timer); +} + +int dp_set_neigh_mac(uint16_t port_id, const struct rte_ether_addr *mac) +{ + struct dp_port *port; + char strmac[18]; + + port = dp_get_port_by_id(port_id); + if (!port) { + DPS_LOG_WARNING("Cannot set neighboring router, port invalid", DP_LOG_PORTID(port_id)); + return DP_ERROR; + } + + rte_ether_addr_copy(mac, &port->neigh_mac); + + snprintf(strmac, sizeof(strmac), RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(&port->neigh_mac)); + DPS_LOG_INFO("Setting PF neighboring router", _DP_LOG_STR("mac", strmac), DP_LOG_PORT(port)); + return DP_OK; +} + + static int dp_init_port(struct dp_port *port) { // TAP devices do not support offloading/isolation @@ -655,7 +738,7 @@ int dp_start_pf_port(uint16_t index) // Do not use PF1 in pf1-proxy mode as Linux does not use it then (thus the mac will never be there) if (!dp_conf_is_pf1_proxy_enabled() || port != dp_get_pf1()) #endif - dp_acquire_neigh_mac(port); + dp_start_acquiring_neigh_mac(port); return DP_OK; } @@ -672,7 +755,7 @@ int dp_start_pf1_proxy_port(void) } if (dp_get_pf1()->link_status == RTE_ETH_LINK_UP) - dp_acquire_neigh_mac(&_dp_pf1_proxy_port); + dp_start_acquiring_neigh_mac(&_dp_pf1_proxy_port); _dp_pf1_proxy_port.allocated = true; return DP_OK; @@ -692,36 +775,6 @@ int dp_stop_port(struct dp_port *port) } -static void dp_set_neighmac(struct dp_port *port, const struct rte_ether_addr *mac) -{ - char strmac[18]; - - rte_ether_addr_copy(mac, &port->neigh_mac); - - snprintf(strmac, sizeof(strmac), RTE_ETHER_ADDR_PRT_FMT, RTE_ETHER_ADDR_BYTES(&port->neigh_mac)); - DPS_LOG_INFO("Setting neighboring MAC", _DP_LOG_STR("mac", strmac), DP_LOG_PORT(port)); -} - -int dp_acquire_neigh_mac(struct dp_port *port) -{ - struct rte_ether_addr pf_neigh_mac = {0}; - -#ifdef ENABLE_PF1_PROXY - // The pf1-proxy VF is actually the interface that Linux uses (thus has the right value) - if (dp_conf_is_pf1_proxy_enabled() && port == dp_get_pf1()) - port = &_dp_pf1_proxy_port; -#endif - - if (DP_FAILED(dp_get_pf_neigh_mac(port->if_index, &pf_neigh_mac, &port->own_mac))) { - DPS_LOG_WARNING("No PF neighboring router", DP_LOG_PORT(port)); - return DP_ERROR; - } - - dp_set_neighmac(port, &pf_neigh_mac); - return DP_OK; -} - - static int dp_port_total_flow_meter_config(struct dp_port *port, uint64_t total_flow_rate_cap) { return dp_set_vf_rate_limit(port->port_id, total_flow_rate_cap); diff --git a/src/monitoring/dp_event.c b/src/monitoring/dp_event.c index 02e1a4f59..9b6ed564d 100644 --- a/src/monitoring/dp_event.c +++ b/src/monitoring/dp_event.c @@ -88,7 +88,9 @@ void dp_process_event_link_msg(struct rte_mbuf *m) DPS_LOG_INFO("PF link state changed", DP_LOG_LINKSTATE(port->link_status), DP_LOG_PORT(port)); if (status == RTE_ETH_LINK_UP) - dp_acquire_neigh_mac(port); + dp_start_acquiring_neigh_mac(port); + else + dp_stop_acquiring_neigh_mac(port); } // Flow-aging message - sent periodically to age-out conntracked flows @@ -120,3 +122,28 @@ void dp_process_event_flow_aging_msg(__rte_unused struct rte_mbuf *m) // which enables fully control of hw rules' lifecycle from the software path for tcp flows. dp_process_aged_flows_non_offload(); } + +// Neighboring router MAC message - sent after acquiring it (sometimes asynchronously from a timer) + +int dp_send_event_neighmac_msg(uint16_t port_id, struct rte_ether_addr *neighmac) +{ + struct dp_event_msg neighmac_msg = { + .msg_head = { + .type = DP_EVENT_TYPE_NEIGHMAC, + }, + .event_entry = { + .neighmac = { + .port_id = port_id, + .mac = *neighmac, + } + } + }; + return dp_send_event_msg(&neighmac_msg); +} + +void dp_process_event_neighmac_msg(struct rte_mbuf *m) +{ + struct dp_event_msg *neighmac_msg = rte_pktmbuf_mtod(m, struct dp_event_msg *); + + dp_set_neigh_mac(neighmac_msg->event_entry.neighmac.port_id, &neighmac_msg->event_entry.neighmac.mac); +} diff --git a/src/monitoring/dp_monitoring.c b/src/monitoring/dp_monitoring.c index 3ab020e76..baae36e67 100644 --- a/src/monitoring/dp_monitoring.c +++ b/src/monitoring/dp_monitoring.c @@ -21,6 +21,9 @@ void dp_process_event_msg(struct rte_mbuf *m) case DP_EVENT_TYPE_FLOW_AGING: dp_process_event_flow_aging_msg(m); break; + case DP_EVENT_TYPE_NEIGHMAC: + dp_process_event_neighmac_msg(m); + break; } rte_pktmbuf_free(m); From 722a29d019b8e96cba3911729a28f90b49eaf803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Smr=C4=8Dek?= <4plague@gmail.com> Date: Fri, 27 Sep 2024 13:12:46 +0200 Subject: [PATCH 16/16] Make prepare script end on error --- hack/prepare.sh | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/hack/prepare.sh b/hack/prepare.sh index 8f67dd39f..2cbe87c0a 100755 --- a/hack/prepare.sh +++ b/hack/prepare.sh @@ -246,9 +246,10 @@ function get_ipv6() { while read -r l1; do if [ "$l1" != "::1/128" ]; then echo ${l1%/*} - break + return fi done < <(ip -6 -o addr show lo | awk '{print $4}') + err "no ipv6 found" } function make_config() { @@ -257,17 +258,27 @@ function make_config() { return fi + # To make error propagation work, need to assign separately + conf_pf0="$(get_ifname 0)" + conf_pf1="$(get_ifname 1)" + conf_vf_pattern="$(get_pattern ${devs[0]})" + conf_ipv6="$(get_ipv6)" + if [[ "$OPT_MULTIPORT" == "true" ]]; then + conf_pf1_proxy="$(get_pf1_proxy ${devs[1]})" + conf_pf1_proxy_vf="$(get_pf1_proxy_vf)" + fi + { echo "# This has been generated by prepare.sh" echo "no-stats" - echo "pf0 $(get_ifname 0)" - echo "pf1 $(get_ifname 1)" - echo "vf-pattern $(get_pattern ${devs[0]})" - echo "ipv6 $(get_ipv6)" + echo "pf0 $conf_pf0" + echo "pf1 $conf_pf1" + echo "vf-pattern $conf_vf_pattern" + echo "ipv6 $conf_ipv6" if [[ "$OPT_MULTIPORT" == "true" ]]; then echo "a-pf0 ${devs[0]},class=rxq_cqe_comp_en=0,rx_vec_en=1,dv_flow_en=2,dv_esw_en=1,fdb_def_rule_en=1,representor=pf[0-1]vf[0-$[$actualvfs-1]]" if [[ "$OPT_PF1_PROXY" == "true" ]]; then - echo "pf1-proxy $(get_pf1_proxy ${devs[1]})" - echo "pf1-proxy-vf $(get_pf1_proxy_vf)" + echo "pf1-proxy $conf_pf1_proxy" + echo "pf1-proxy-vf $conf_pf1_proxy_vf" fi echo "multiport-eswitch" else @@ -278,7 +289,7 @@ function make_config() { if [[ "$OPT_MULTIPORT" == "true" ]]; then log "dpservice configured in multiport-eswitch mode" if [[ "$OPT_PF1_PROXY" == "true" ]]; then - log "dpservice will create a PF1-proxy" + log "dpservice will create a pf1-proxy" fi else log "dpservice configured in normal mode"