diff --git a/dpdk/dpdk_vrouter.c b/dpdk/dpdk_vrouter.c index cd676b023..8d1abc9a4 100644 --- a/dpdk/dpdk_vrouter.c +++ b/dpdk/dpdk_vrouter.c @@ -13,22 +13,21 @@ * dpdk_vrouter.c -- vRouter/DPDK application * */ + +/* For sched_getaffinity() */ #define _GNU_SOURCE -#include -#include + +#include "vr_dpdk.h" +#include "vr_dpdk_virtio.h" +#include "vr_uvhost.h" #include #include -#include -#include #include - -#include "vr_dpdk.h" -#include "vr_uvhost.h" -#include "vr_packet.h" -#include "qemu_uvhost.h" -#include "vr_dpdk_virtio.h" +#include +#include +#include static int no_daemon_set; extern char *ContrailBuildInfo; @@ -36,21 +35,20 @@ extern char *ContrailBuildInfo; /* Global vRouter/DPDK structure */ struct vr_dpdk_global vr_dpdk; -/* TODO: default commandline params */ static char *dpdk_argv[] = { "dpdk", - "-m", VR_DPDK_MAX_MEM, - "-n", VR_DPDK_MAX_MEMCHANNELS, /* the argument will be updated in dpdk_init() */ "--lcores", NULL, - /* up to five optional arguments */ + "-m", VR_DPDK_MAX_MEM, + "-n", VR_DPDK_MAX_MEMCHANNELS, + /* up to ten optional arguments (5 pairs of argument + option) */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; -static int dpdk_argc = sizeof(dpdk_argv)/sizeof(*dpdk_argv) - 5*2; +static int dpdk_argc = sizeof(dpdk_argv)/sizeof(*dpdk_argv) - 10; /* Pktmbuf constructor with vr_packet support */ void @@ -148,7 +146,9 @@ dpdk_core_mask_get(void) long system_cpus_count, core_mask_count; if (sched_getaffinity(0, sizeof(cs), &cs) < 0) { - printf("Error getting affinity. Falling back do the default core mask.\n"); + RTE_LOG(ERR, VROUTER, "Error getting affinity." + " Falling back do the default core mask 0x%" PRIx64 "\n", + (uint64_t)(VR_DPDK_DEF_LCORE_MASK)); return VR_DPDK_DEF_LCORE_MASK; } @@ -166,7 +166,9 @@ dpdk_core_mask_get(void) } if (!cpu_core_mask) { - printf("Error: core mask is zero. Falling back do the default core mask.\n"); + RTE_LOG(ERR, VROUTER, "Error: core mask is zero." + " Falling back do the default core mask 0x%" PRIx64 "\n", + (uint64_t)(VR_DPDK_DEF_LCORE_MASK)); return VR_DPDK_DEF_LCORE_MASK; } @@ -176,7 +178,9 @@ dpdk_core_mask_get(void) */ system_cpus_count = sysconf(_SC_NPROCESSORS_CONF); if (system_cpus_count == -1) { - printf("Error getting number of processors. Falling back do the default core mask.\n"); + RTE_LOG(ERR, VROUTER, "Error getting number of processors." + " Falling back do the default core mask 0x%" PRIx64 "\n", + (uint64_t)(VR_DPDK_DEF_LCORE_MASK)); return cpu_core_mask; } @@ -184,7 +188,9 @@ dpdk_core_mask_get(void) = __builtin_popcountll((unsigned long long)cpu_core_mask); if (core_mask_count == system_cpus_count) { - printf("Using default core mask.\n"); + RTE_LOG(NOTICE, VROUTER, "Use taskset(1) to set the core mask." + " Falling back do the default core mask 0x%" PRIx64 "\n", + (uint64_t)(VR_DPDK_DEF_LCORE_MASK)); return VR_DPDK_DEF_LCORE_MASK; } @@ -196,7 +202,7 @@ static char * dpdk_core_mask_stringify(uint64_t core_mask) { int ret, lcore_id = 0, core_id = 0; - static char core_mask_string[256]; + static char core_mask_string[VR_DPDK_STR_BUF_SZ]; char *p = core_mask_string; bool first_lcore = true; @@ -230,7 +236,7 @@ dpdk_argv_update(void) long int system_cpus_count; int i; char *core_mask_str; - static char lcores_string[512]; + static char lcores_string[VR_DPDK_STR_BUF_SZ]; /* get number of available CPUs */ system_cpus_count = sysconf(_SC_NPROCESSORS_CONF); @@ -260,11 +266,13 @@ dpdk_argv_update(void) } /* print out configuration */ - if (vr_dpdk.vlan_tag != VLAN_ID_INVALID) - printf("Using VLAN TCI: %"PRIu16"\n", vr_dpdk.vlan_tag); - printf("EAL arguments:\n"); - for (i = 1; i < dpdk_argc - 1; i += 2) - printf("\t%s \"%s\"\n", dpdk_argv[i], dpdk_argv[i + 1]); + if (vr_dpdk.vlan_tag != VLAN_ID_INVALID) { + RTE_LOG(INFO, VROUTER, "Using VLAN TCI: %" PRIu16 "\n", vr_dpdk.vlan_tag); + } + RTE_LOG(INFO, VROUTER, "EAL arguments:\n"); + for (i = 1; i < dpdk_argc - 1; i += 2) { + RTE_LOG(INFO, VROUTER, " %9s \"%s\"\n", dpdk_argv[i], dpdk_argv[i + 1]); + } return 0; } @@ -277,19 +285,19 @@ dpdk_init(void) ret = vr_dpdk_flow_mem_init(); if (ret < 0) { - fprintf(stderr, "Error initializing flow table: %s (%d)\n", + RTE_LOG(ERR, VROUTER, "Error initializing flow table: %s (%d)\n", rte_strerror(-ret), -ret); return ret; } if (dpdk_argv_update() == -1) { - fprintf(stderr, "Error updating lcores arguments\n"); + RTE_LOG(ERR, VROUTER, "Error updating lcores arguments\n"); return -1; } ret = rte_eal_init(dpdk_argc, dpdk_argv); if (ret < 0) { - fprintf(stderr, "Error initializing EAL\n"); + RTE_LOG(ERR, VROUTER, "Error initializing EAL\n"); return ret; } /* disable unwanted logtypes for debug purposes */ @@ -459,15 +467,17 @@ static struct option long_options[] = { static void Usage(void) { - printf("Usage: contrail-vrouter-dpdk [--no-daemon] [--help] [--version]\n"); - printf(" [--vlan ] [--vdev ]\n"); - printf("\n"); - printf("--no-daemon Do not demonize the vRouter\n"); - printf("--help Prints this help message\n"); - printf("--version Prints build information\n"); - printf("\n"); - printf("--vlan VLAN tag control information\n"); - printf("--vdev Virtual device configuration\n"); + RTE_LOG(INFO, VROUTER, + "Usage: contrail-vrouter-dpdk [--no-daemon] [--help] [--version]\n" + " [--vlan ] [--vdev ]\n" + "\n" + "--no-daemon Do not demonize the vRouter\n" + "--help Prints this help message\n" + "--version Prints build information\n" + "\n" + "--vlan VLAN tag control information\n" + "--vdev Virtual device configuration\n" + ); exit(1); } @@ -475,7 +485,7 @@ Usage(void) static void version_print(void) { - printf("Build information: %s\n", ContrailBuildInfo); + RTE_LOG(INFO, VROUTER, "Build information: %s\n", ContrailBuildInfo); } static void @@ -528,6 +538,9 @@ main(int argc, char *argv[]) int ret, opt, option_index; vr_dpdk.vlan_tag = VLAN_ID_INVALID; + /* early init the log */ + rte_openlog_stream(stdout); + while ((opt = getopt_long(argc, argv, "", long_options, &option_index)) >= 0) { switch (opt) { @@ -537,7 +550,7 @@ main(int argc, char *argv[]) case '?': default: - fprintf(stderr, "Invalid option %s\n", argv[optind - 1]); + RTE_LOG(ERR, VROUTER, "Invalid option %s\n", argv[optind - 1]); Usage(); break; } @@ -547,15 +560,14 @@ main(int argc, char *argv[]) if (!no_daemon_set) { if (daemon(0, 0) < 0) { - fprintf(stderr, "Error daemonizing vRouter: %s (%d)\n", - strerror(errno), errno); + RTE_LOG(ERR, VROUTER, "Error daemonizing vRouter: %s (%d)\n", + rte_strerror(errno), errno); return 1; } } - printf("Starting vRouter/DPDK...\n"); + RTE_LOG(INFO, VROUTER, "Starting vRouter/DPDK...\n"); version_print(); - fflush(stdout); /* init DPDK first since vRouter uses DPDK mallocs and logs */ ret = dpdk_init(); diff --git a/dpdk/qemu_uvhost.h b/dpdk/qemu_uvhost.h index 742ef7ada..c598dbda7 100644 --- a/dpdk/qemu_uvhost.h +++ b/dpdk/qemu_uvhost.h @@ -8,6 +8,8 @@ #ifndef __QEMU_UVHOST_H__ #define __QEMU_UVHOST_H__ +#include + #define VHOST_MEMORY_MAX_NREGIONS 8 #define VHOST_CLIENT_MAX_VRINGS 2 diff --git a/dpdk/vr_dpdk_ethdev.c b/dpdk/vr_dpdk_ethdev.c index c13c54c90..46a1e9502 100644 --- a/dpdk/vr_dpdk_ethdev.c +++ b/dpdk/vr_dpdk_ethdev.c @@ -13,15 +13,13 @@ * vr_dpdk_ethdev.c -- DPDK ethernet device * */ -#include -#include #include "vr_dpdk.h" -#include #include #include -#include +#include +#include static struct rte_eth_conf ethdev_conf = { .link_speed = 0, /* ETH_LINK_SPEED_10[0|00|000], or 0 for autonegotation */ @@ -139,7 +137,7 @@ vr_dpdk_ethdev_filter_add(struct vr_interface *vif, uint16_t queue_id, (unsigned)dst_ip, (unsigned)VR_MPLS_OVER_UDP_DST_PORT, (unsigned)mpls_label); if (queue_id >= 0xFF) { - RTE_LOG(ERR, VROUTER, "\terror adding perfect filter for eth device %" + RTE_LOG(ERR, VROUTER, " error adding perfect filter for eth device %" PRIu8 ": queue ID %" PRIu16 " is out of range\n", port_id, queue_id); return -EINVAL; @@ -178,7 +176,7 @@ dpdk_ethdev_rx_queue_release(unsigned lcore_id, struct vr_interface *vif) /* free the queue */ if (rx_queue->rxq_ops.f_free(rx_queue->q_queue_h)) { - RTE_LOG(ERR, VROUTER, "\terror freeing lcore %u eth device RX queue\n", + RTE_LOG(ERR, VROUTER, " error freeing lcore %u eth device RX queue\n", lcore_id); } @@ -220,7 +218,7 @@ vr_dpdk_ethdev_rx_queue_init(unsigned lcore_id, struct vr_interface *vif, }; rx_queue->q_queue_h = rx_queue->rxq_ops.f_create(&reader_params, socket_id); if (rx_queue->q_queue_h == NULL) { - RTE_LOG(ERR, VROUTER, "\terror creating eth device %" PRIu8 + RTE_LOG(ERR, VROUTER, " error creating eth device %" PRIu8 " RX queue %" PRIu16 "\n", port_id, rx_queue_id); return NULL; } @@ -245,7 +243,7 @@ dpdk_ethdev_tx_queue_release(unsigned lcore_id, struct vr_interface *vif) /* flush and free the queue */ if (tx_queue->txq_ops.f_free(tx_queue->q_queue_h)) { - RTE_LOG(ERR, VROUTER, "\terror freeing lcore %u eth device TX queue\n", + RTE_LOG(ERR, VROUTER, " error freeing lcore %u eth device TX queue\n", lcore_id); } @@ -287,7 +285,7 @@ vr_dpdk_ethdev_tx_queue_init(unsigned lcore_id, struct vr_interface *vif, }; tx_queue->q_queue_h = tx_queue->txq_ops.f_create(&writer_params, socket_id); if (tx_queue->q_queue_h == NULL) { - RTE_LOG(ERR, VROUTER, "\terror creating eth device %" PRIu8 + RTE_LOG(ERR, VROUTER, " error creating eth device %" PRIu8 " TX queue %" PRIu16 "\n", port_id, tx_queue_id); return NULL; } @@ -318,9 +316,9 @@ dpdk_ethdev_info_update(struct vr_dpdk_ethdev *ethdev) VR_DPDK_MAX_RETA_SIZE); RTE_LOG(DEBUG, VROUTER, "dev_info: driver_name=%s if_index=%u" - " max_rx_queues=%"PRIu16 " max_tx_queues=%"PRIu16 - " max_vfs=%"PRIu16" max_vmdq_pools=%"PRIu16 - " rx_offload_capa=%"PRIx32" tx_offload_capa=%"PRIx32"\n", + " max_rx_queues=%" PRIu16 " max_tx_queues=%" PRIu16 + " max_vfs=%" PRIu16 " max_vmdq_pools=%" PRIu16 + " rx_offload_capa=%" PRIx32 " tx_offload_capa=%" PRIx32 "\n", dev_info.driver_name, dev_info.if_index, dev_info.max_rx_queues, dev_info.max_tx_queues, dev_info.max_vfs, dev_info.max_vmdq_pools, @@ -330,7 +328,7 @@ dpdk_ethdev_info_update(struct vr_dpdk_ethdev *ethdev) /* use RSS queues only */ ethdev->ethdev_nb_rx_queues = ethdev->ethdev_nb_rss_queues; #else - /* use RSS queues only if device does not support RETA */ + /* we use just RSS queues if the device does not support RETA */ if (ethdev->ethdev_reta_size == 0) ethdev->ethdev_nb_rx_queues = ethdev->ethdev_nb_rss_queues; #endif @@ -357,7 +355,7 @@ dpdk_ethdev_queues_setup(struct vr_dpdk_ethdev *ethdev) ethdev->ethdev_queue_states[i] = VR_DPDK_QUEUE_RSS_STATE; } else if (i < ethdev->ethdev_nb_rx_queues) { if (vr_dpdk.nb_free_mempools == 0) { - RTE_LOG(ERR, VROUTER, "\terror assigning mempool to eth device %" + RTE_LOG(ERR, VROUTER, " error assigning mempool to eth device %" PRIu8 " RX queue %d\n", port_id, i); return -ENOMEM; } @@ -375,7 +373,7 @@ dpdk_ethdev_queues_setup(struct vr_dpdk_ethdev *ethdev) /* return mempool to the list */ if (mempool != vr_dpdk.rss_mempool) vr_dpdk.nb_free_mempools++; - RTE_LOG(ERR, VROUTER, "\terror setting up eth device %" PRIu8 " RX queue %d" + RTE_LOG(ERR, VROUTER, " error setting up eth device %" PRIu8 " RX queue %d" ": %s (%d)\n", port_id, i, rte_strerror(-ret), -ret); return ret; } @@ -383,7 +381,7 @@ dpdk_ethdev_queues_setup(struct vr_dpdk_ethdev *ethdev) ethdev->ethdev_mempools[i] = mempool; } i = ethdev->ethdev_nb_rx_queues - ethdev->ethdev_nb_rss_queues; - RTE_LOG(INFO, VROUTER, "\tsetup %d RSS queue(s) and %d filtering queue(s)\n", + RTE_LOG(INFO, VROUTER, " setup %d RSS queue(s) and %d filtering queue(s)\n", (int)ethdev->ethdev_nb_rss_queues, i); /* configure TX queues */ @@ -391,7 +389,7 @@ dpdk_ethdev_queues_setup(struct vr_dpdk_ethdev *ethdev) ret = rte_eth_tx_queue_setup(port_id, i, VR_DPDK_NB_TXD, rte_eth_dev_socket_id(port_id), &tx_queue_conf); if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror setting up eth device %" PRIu8 " TX queue %d" + RTE_LOG(ERR, VROUTER, " error setting up eth device %" PRIu8 " TX queue %d" ": %s (%d)\n", port_id, i, rte_strerror(-ret), -ret); return ret; } @@ -409,7 +407,10 @@ vr_dpdk_ethdev_rss_init(struct vr_dpdk_ethdev *ethdev) struct rte_eth_rss_reta_entry64 reta_entries[VR_DPDK_MAX_RETA_ENTRIES]; struct rte_eth_rss_reta_entry64 *reta; - /* check if device support RETA */ + /* There is nothing to configure if the device does not support RETA. + * If the device reported few RX queues earlier, we assume those + * queues are preconfigured for RSS by default. + */ if (ethdev->ethdev_reta_size == 0) return 0; @@ -435,7 +436,7 @@ vr_dpdk_ethdev_rss_init(struct vr_dpdk_ethdev *ethdev) return 0; if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror initializing ethdev %" PRIu8 " RSS: %s (%d)\n", + RTE_LOG(ERR, VROUTER, " error initializing ethdev %" PRIu8 " RSS: %s (%d)\n", port_id, rte_strerror(-ret), -ret); } @@ -474,7 +475,7 @@ vr_dpdk_ethdev_filtering_init(struct vr_interface *vif, ret = rte_eth_dev_fdir_get_infos(port_id, &fdir_info); if (ret == 0) { /* enable hardware filtering */ - RTE_LOG(INFO, VROUTER, "\tenable hardware filtering for ethdev %" + RTE_LOG(INFO, VROUTER, " enable hardware filtering for ethdev %" PRIu8 "\n", port_id); vif->vif_flags |= VIF_FLAG_FILTERING_OFFLOAD; } else { @@ -492,7 +493,7 @@ vr_dpdk_ethdev_filtering_init(struct vr_interface *vif, ret = rte_eth_dev_fdir_set_masks(port_id, &masks); if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror setting ethdev %" PRIu8 + RTE_LOG(ERR, VROUTER, " error setting ethdev %" PRIu8 " Flow Director masks: %s (%d)\n", port_id, rte_strerror(-ret), -ret); } @@ -517,7 +518,7 @@ dpdk_ethdev_bond_info_update(struct vr_dpdk_ethdev *ethdev) memset(&mac_addr, 0, sizeof(bond_mac)); rte_eth_macaddr_get(port_id, &bond_mac); - RTE_LOG(INFO, VROUTER, "\tbond eth device %" PRIu8 + RTE_LOG(INFO, VROUTER, " bond eth device %" PRIu8 " configured MAC " MAC_FORMAT "\n", port_id, MAC_VALUE(bond_mac.addr_bytes)); /* log out and configure bond members */ @@ -526,9 +527,8 @@ dpdk_ethdev_bond_info_update(struct vr_dpdk_ethdev *ethdev) memset(&mac_addr, 0, sizeof(mac_addr)); rte_eth_macaddr_get(slave_port_id, &mac_addr); pci_addr = &rte_eth_devices[slave_port_id].pci_dev->addr; - RTE_LOG(INFO, VROUTER, "\tbond member eth device %" PRIu8 - " PCI "PCI_PRI_FMT - " MAC " MAC_FORMAT "\n", + RTE_LOG(INFO, VROUTER, " bond member eth device %" PRIu8 + " PCI " PCI_PRI_FMT " MAC " MAC_FORMAT "\n", slave_port_id, pci_addr->domain, pci_addr->bus, pci_addr->devid, pci_addr->function, MAC_VALUE(mac_addr.addr_bytes)); @@ -538,10 +538,10 @@ dpdk_ethdev_bond_info_update(struct vr_dpdk_ethdev *ethdev) && rte_eth_dev_mac_addr_add(slave_port_id, &lacp_mac, 0) == 0) { /* disable the promisc mode enabled by default */ rte_eth_promiscuous_disable(ethdev->ethdev_port_id); - RTE_LOG(INFO, VROUTER, "\tbond member eth device %"PRIu8 + RTE_LOG(INFO, VROUTER, " bond member eth device %" PRIu8 " promisc mode disabled\n", slave_port_id); } else { - RTE_LOG(INFO, VROUTER, "\tbond member eth device %"PRIu8 + RTE_LOG(INFO, VROUTER, " bond member eth device %" PRIu8 ": unable to add MAC addresses\n", slave_port_id); } } @@ -571,7 +571,7 @@ vr_dpdk_ethdev_init(struct vr_dpdk_ethdev *ethdev) ret = rte_eth_dev_configure(port_id, ethdev->ethdev_nb_rx_queues, ethdev->ethdev_nb_tx_queues, ðdev_conf); if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror configuring eth dev %" PRIu8 + RTE_LOG(ERR, VROUTER, " error configuring eth dev %" PRIu8 ": %s (%d)\n", port_id, rte_strerror(-ret), -ret); return ret; diff --git a/dpdk/vr_dpdk_flow_mem.c b/dpdk/vr_dpdk_flow_mem.c index db77bd949..ee90edd8b 100644 --- a/dpdk/vr_dpdk_flow_mem.c +++ b/dpdk/vr_dpdk_flow_mem.c @@ -4,21 +4,16 @@ * Copyright(c) 2014, Juniper Networks Inc., * All rights reserved */ -#include -#include -#include -#include -#include -#include - -#include -#include -#include #include "vr_dpdk.h" - #include "vr_btable.h" +#include +#include +#include + +#include + #define MAX_LINE_SIZE 128 #define HPI_MAX 16 #define MOUNT_TABLE "/proc/mounts" @@ -150,7 +145,7 @@ vr_dpdk_flow_mem_init(void) ret = vr_hugepage_info_init(); if (ret < 0) { - fprintf(stderr, "Error initializing hugepage info: %s (%d)\n", + RTE_LOG(ERR, VROUTER, "Error initializing hugepage info: %s (%d)\n", rte_strerror(-ret), -ret); return ret; } @@ -181,7 +176,7 @@ vr_dpdk_flow_mem_init(void) if (touse_file_name) { fd = open(touse_file_name, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); if (fd == -1) { - fprintf(stderr, "Error opening file %s: %s (%d)\n", + RTE_LOG(ERR, VROUTER, "Error opening file %s: %s (%d)\n", touse_file_name, rte_strerror(errno), errno); return -errno; } @@ -190,7 +185,7 @@ vr_dpdk_flow_mem_init(void) /* the file descriptor is no longer needed */ close(fd); if (vr_dpdk.flow_table == MAP_FAILED) { - fprintf(stderr, "Error mmapping file %s: %s (%d)\n", + RTE_LOG(ERR, VROUTER, "Error mmapping file %s: %s (%d)\n", touse_file_name, rte_strerror(errno), errno); return -errno; } diff --git a/dpdk/vr_dpdk_host.c b/dpdk/vr_dpdk_host.c index 10f31630d..18546e342 100644 --- a/dpdk/vr_dpdk_host.c +++ b/dpdk/vr_dpdk_host.c @@ -14,28 +14,25 @@ * */ -#include -#include -#include +#include "vr_dpdk.h" +#include "vr_fragment.h" +#include "vr_hash.h" +#include "vr_proto.h" +#include "vr_sandesh.h" +#include #include #include +#include #include -#include -#include -#include -#include #include #include +#include #include - -#include "vr_dpdk.h" -#include "vr_sandesh.h" -#include "vr_proto.h" -#include "vr_hash.h" -#include "vr_fragment.h" +#include +#include /* Max number of CPUs. We adjust it later in vr_dpdk_host_init() */ unsigned int vr_num_cpus = VR_MAX_CPUS; @@ -68,7 +65,7 @@ dpdk_printf(const char *format, ...) va_list args; if (RTE_LOGTYPE_DPCORE & rte_logs.type) { - char buf[256] = "DPCORE: "; + char buf[VR_DPDK_STR_BUF_SZ] = "DPCORE: "; strncat(buf, format, sizeof(buf) - strlen(buf) - 1); buf[sizeof(buf) - 1] = '\0'; @@ -126,7 +123,7 @@ static struct vr_packet * dpdk_palloc_head(struct vr_packet *pkt, unsigned int size) { /* TODO: not implemented */ - fprintf(stderr, "%s: not implemented\n", __func__); + RTE_LOG(ERR, VROUTER, "%s: not implemented\n", __func__); return NULL; } @@ -972,13 +969,13 @@ dpdk_add_mpls(struct vrouter *router, unsigned mpls_label) RTE_LOG(INFO, VROUTER, "Enabling hardware acceleration on vif %u for MPLS %u\n", (unsigned)eth_vif->vif_idx, mpls_label); if (!eth_vif->vif_ip) { - RTE_LOG(ERR, VROUTER, "\terror accelerating MPLS %u: no IP address set\n", + RTE_LOG(ERR, VROUTER, " error accelerating MPLS %u: no IP address set\n", mpls_label); continue; } ret = vr_dpdk_lcore_mpls_schedule(eth_vif, eth_vif->vif_ip, mpls_label); if (ret != 0) - RTE_LOG(INFO, VROUTER, "\terror accelerating MPLS %u: %s (%d)\n", + RTE_LOG(INFO, VROUTER, " error accelerating MPLS %u: %s (%d)\n", mpls_label, rte_strerror(-ret), -ret); } } @@ -1244,7 +1241,7 @@ int vr_dpdk_ulog(uint32_t level, uint32_t logtype, uint32_t *last_hash, va_list ap; int ret = 0; uint32_t hash; - char buf[256]; + char buf[VR_DPDK_STR_BUF_SZ]; /* fallback to rte_log */ if (last_hash == NULL) { diff --git a/dpdk/vr_dpdk_interface.c b/dpdk/vr_dpdk_interface.c index b0f0c242e..edfe234dc 100644 --- a/dpdk/vr_dpdk_interface.c +++ b/dpdk/vr_dpdk_interface.c @@ -14,20 +14,13 @@ * */ -#include -#include -#include -#include -#include - -#include "vr_queue.h" #include "vr_dpdk.h" +#include "vr_dpdk_netlink.h" #include "vr_dpdk_usocket.h" #include "vr_dpdk_virtio.h" -#include "vr_dpdk_netlink.h" #include -#include +#include #include /* @@ -195,7 +188,9 @@ dpdk_fabric_if_add(struct vr_interface *vif) dpdk_dbdf_to_pci(vif->vif_os_idx, &pci_address); port_id = dpdk_find_port_id_by_pci_addr(&pci_address); if (port_id == VR_DPDK_INVALID_PORT_ID) { - RTE_LOG(ERR, VROUTER, "Invalid PCI address %d:%d:%d:%d\n", + RTE_LOG(ERR, VROUTER, "Error adding vif %u eth device %s:" + " no port ID found for PCI " PCI_PRI_FMT "\n", + vif->vif_idx, vif->vif_name, pci_address.domain, pci_address.bus, pci_address.devid, pci_address.function); return -ENOENT; @@ -205,7 +200,7 @@ dpdk_fabric_if_add(struct vr_interface *vif) memset(&mac_addr, 0, sizeof(mac_addr)); rte_eth_macaddr_get(port_id, &mac_addr); - RTE_LOG(INFO, VROUTER, "Adding vif %u eth device %" PRIu8 " PCI "PCI_PRI_FMT + RTE_LOG(INFO, VROUTER, "Adding vif %u eth device %" PRIu8 " PCI " PCI_PRI_FMT " MAC " MAC_FORMAT "\n", vif->vif_idx, port_id, pci_address.domain, pci_address.bus, pci_address.devid, pci_address.function, @@ -213,7 +208,7 @@ dpdk_fabric_if_add(struct vr_interface *vif) ethdev = &vr_dpdk.ethdevs[port_id]; if (ethdev->ethdev_ptr != NULL) { - RTE_LOG(ERR, VROUTER, "\terror adding eth dev %s: already added\n", + RTE_LOG(ERR, VROUTER, " error adding eth dev %s: already added\n", vif->vif_name); return -EEXIST; } @@ -230,7 +225,7 @@ dpdk_fabric_if_add(struct vr_interface *vif) ret = rte_eth_dev_start(port_id); if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror starting eth device %" PRIu8 + RTE_LOG(ERR, VROUTER, " error starting eth device %" PRIu8 ": %s (%d)\n", port_id, rte_strerror(-ret), -ret); return ret; } @@ -266,7 +261,7 @@ dpdk_fabric_if_del(struct vr_interface *vif) * then vif->vif_os will be NULL. */ if (vif->vif_os == NULL) { - RTE_LOG(ERR, VROUTER, "\terror deleting eth dev %s: already removed\n", + RTE_LOG(ERR, VROUTER, " error deleting eth dev %s: already removed\n", vif->vif_name); return -EEXIST; } @@ -289,21 +284,29 @@ dpdk_vhost_if_add(struct vr_interface *vif) uint8_t port_id, slave_port_id = VR_DPDK_INVALID_PORT_ID; int ret; struct ether_addr mac_addr; - struct rte_pci_addr pci_address; struct vr_dpdk_ethdev *ethdev; if (vif->vif_flags & VIF_FLAG_PMD) { port_id = vif->vif_os_idx; } else { - memset(&pci_address, 0, sizeof(pci_address)); - dpdk_dbdf_to_pci(vif->vif_os_idx, &pci_address); - port_id = dpdk_find_port_id_by_pci_addr(&pci_address); + /* The Agent passes xconnect fabric interface in cross_connect_idx, + * but dp-core does not copy it into vr_interface. Instead + * it looks for an interface with os_idx == cross_connect_idx + * and sets vif->vif_bridge if there is such an interface. + */ + ethdev = (struct vr_dpdk_ethdev *)(vif->vif_bridge->vif_os); + if (ethdev == NULL) { + RTE_LOG(ERR, VROUTER, "Error adding vif %u KNI device %s:" + " bridge vif %u ethdev is not initialized\n", + vif->vif_idx, vif->vif_name, vif->vif_bridge->vif_idx); + return -ENOENT; + } + port_id = ethdev->ethdev_port_id; /* * KNI does not support bond interfaces and generate random MACs, - * so we try to get a bond member istead. + * so we try to get a bond member instead. */ - ethdev = &vr_dpdk.ethdevs[port_id]; if (ethdev->ethdev_nb_slaves > 0) slave_port_id = ethdev->ethdev_slaves[0]; } @@ -321,14 +324,14 @@ dpdk_vhost_if_add(struct vr_interface *vif) memset(&mac_addr, 0, sizeof(mac_addr)); rte_eth_macaddr_get(port_id, &mac_addr); - RTE_LOG(INFO, VROUTER, "\tusing bond slave eth device %" PRIu8 + RTE_LOG(INFO, VROUTER, " using bond slave eth device %" PRIu8 " MAC " MAC_FORMAT "\n", port_id, MAC_VALUE(mac_addr.addr_bytes)); } /* check if KNI is already added */ if (vr_dpdk.knis[vif->vif_idx] != NULL) { - RTE_LOG(ERR, VROUTER, "\terror adding KNI device %s: already exist\n", + RTE_LOG(ERR, VROUTER, " error adding KNI device %s: already exist\n", vif->vif_name); return -EEXIST; } @@ -358,7 +361,7 @@ dpdk_vhost_if_del(struct vr_interface *vif) /* check if KNI exists */ if (vr_dpdk.knis[vif->vif_idx] == NULL) { - RTE_LOG(ERR, VROUTER, "\terror deleting KNI device %u: " + RTE_LOG(ERR, VROUTER, " error deleting KNI device %u: " "device does not exist\n", vif->vif_idx); return -EEXIST; } @@ -440,15 +443,15 @@ dpdk_monitoring_if_add(struct vr_interface *vif) */ monitored_vif = __vrouter_get_interface(router, monitored_vif_id); if (!monitored_vif) { - RTE_LOG(ERR, VROUTER, "\terror getting vif to monitor: vif %u does not exist\n", - monitored_vif_id); + RTE_LOG(ERR, VROUTER, " error getting vif to monitor:" + " vif %u does not exist\n", monitored_vif_id); return -EINVAL; } /* check if KNI is already added */ if (vr_dpdk.knis[vif->vif_idx] != NULL) { - RTE_LOG(ERR, VROUTER, "\terror adding monitoring device %s: " - "vif %d KNI device already exist\n", + RTE_LOG(ERR, VROUTER, " error adding monitoring device %s:" + " vif %d KNI device already exist\n", vif->vif_name, vif->vif_idx); return -EEXIST; } @@ -457,7 +460,7 @@ dpdk_monitoring_if_add(struct vr_interface *vif) * TODO: we always use DPDK port 0 for monitoring KNI * DPDK numerates all the detected Ethernet devices starting from 0. * So we might only get into an issue if we have no eth devices at all - * or we have few eth ports and don't what to use the first one. + * or we have few eth ports and don't want to use the first one. */ ret = vr_dpdk_knidev_init(0, vif); if (ret != 0) @@ -494,8 +497,8 @@ dpdk_monitoring_if_del(struct vr_interface *vif) monitored_vif = __vrouter_get_interface(vrouter_get(vif->vif_rid), monitored_vif_id); if (!monitored_vif) { - RTE_LOG(ERR, VROUTER, "\terror getting vif to monitor: vif %u does not exist\n", - monitored_vif_id); + RTE_LOG(ERR, VROUTER, " error getting vif to monitor:" + " vif %u does not exist\n", monitored_vif_id); } else { /* stop monitoring */ dpdk_monitoring_stop(monitored_vif, vif); @@ -505,8 +508,8 @@ dpdk_monitoring_if_del(struct vr_interface *vif) /* check if KNI is added */ if (vr_dpdk.knis[vif->vif_idx] == NULL) { - RTE_LOG(ERR, VROUTER, "\terror deleting monitoring device: " - "vif %d KNI device does not exist\n", + RTE_LOG(ERR, VROUTER, " error deleting monitoring device:" + " vif %d KNI device does not exist\n", vif->vif_idx); return -EEXIST; } @@ -529,7 +532,7 @@ dpdk_agent_if_add(struct vr_interface *vif) /* check if packet device is already added */ if (vr_dpdk.packet_ring != NULL) { - RTE_LOG(ERR, VROUTER, "\terror adding packet device %s: already exist\n", + RTE_LOG(ERR, VROUTER, " error adding packet device %s: already exist\n", vif->vif_name); return -EEXIST; } @@ -537,8 +540,8 @@ dpdk_agent_if_add(struct vr_interface *vif) /* init packet device */ ret = dpdk_packet_socket_init(); if (ret < 0) { - RTE_LOG(ERR, VROUTER, "\terror initializing packet socket: %s (%d)\n", - strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error initializing packet socket: %s (%d)\n", + rte_strerror(errno), errno); return ret; } diff --git a/dpdk/vr_dpdk_knidev.c b/dpdk/vr_dpdk_knidev.c index 49aeda59a..d80fa58f8 100644 --- a/dpdk/vr_dpdk_knidev.c +++ b/dpdk/vr_dpdk_knidev.c @@ -13,13 +13,13 @@ * vr_dpdk_knidev.c -- DPDK KNI device * */ -#include -#include - -#include #include "vr_dpdk.h" +#include +#include +#include + /* * KNI Reader */ @@ -211,7 +211,7 @@ dpdk_kni_rx_queue_release(unsigned lcore_id, struct vr_interface *vif) /* free the queue */ if (rx_queue->rxq_ops.f_free(rx_queue->q_queue_h)) { - RTE_LOG(ERR, VROUTER, "\terror freeing lcore %u KNI device RX queue\n", + RTE_LOG(ERR, VROUTER, " error freeing lcore %u KNI device RX queue\n", lcore_id); } @@ -251,8 +251,8 @@ vr_dpdk_kni_rx_queue_init(unsigned lcore_id, struct vr_interface *vif, }; rx_queue->q_queue_h = rx_queue->rxq_ops.f_create(&reader_params, socket_id); if (rx_queue->q_queue_h == NULL) { - RTE_LOG(ERR, VROUTER, "\terror creating KNI device %s RX queue at eth device %" - PRIu8 "\n", vif->vif_name, port_id); + RTE_LOG(ERR, VROUTER, " error creating KNI device %s RX queue" + " at eth device %" PRIu8 "\n", vif->vif_name, port_id); return NULL; } @@ -276,7 +276,7 @@ dpdk_kni_tx_queue_release(unsigned lcore_id, struct vr_interface *vif) /* flush and free the queue */ if (tx_queue->txq_ops.f_free(tx_queue->q_queue_h)) { - RTE_LOG(ERR, VROUTER, "\terror freeing lcore %u KNI device TX queue\n", + RTE_LOG(ERR, VROUTER, " error freeing lcore %u KNI device TX queue\n", lcore_id); } @@ -298,10 +298,17 @@ vr_dpdk_kni_tx_queue_init(unsigned lcore_id, struct vr_interface *vif, struct vr_dpdk_queue *tx_queue = &lcore->lcore_tx_queues[vif_idx]; struct vr_dpdk_queue_params *tx_queue_params = &lcore->lcore_tx_queue_params[vif_idx]; + struct vr_dpdk_ethdev *ethdev; if (vif->vif_type == VIF_TYPE_HOST) { - port_id = (((struct vr_dpdk_ethdev *)(vif->vif_bridge->vif_os))-> - ethdev_port_id); + ethdev = vif->vif_bridge->vif_os; + if (ethdev == NULL) { + RTE_LOG(ERR, VROUTER, " error creating KNI device %s TX queue:" + " bridge vif %u ethdev is not initialized\n", + vif->vif_name, vif->vif_bridge->vif_idx); + return NULL; + } + port_id = ethdev->ethdev_port_id; } /* init queue */ @@ -316,8 +323,8 @@ vr_dpdk_kni_tx_queue_init(unsigned lcore_id, struct vr_interface *vif, }; tx_queue->q_queue_h = tx_queue->txq_ops.f_create(&writer_params, socket_id); if (tx_queue->q_queue_h == NULL) { - RTE_LOG(ERR, VROUTER, "\terror creating KNI device %s TX queue at eth device %" - PRIu8 "\n", vif->vif_name, port_id); + RTE_LOG(ERR, VROUTER, " error creating KNI device %s TX queue" + " at eth device %" PRIu8 "\n", vif->vif_name, port_id); return NULL; } @@ -426,8 +433,8 @@ vr_dpdk_knidev_init(uint8_t port_id, struct vr_interface *vif) /* allocate KNI device */ kni = rte_kni_alloc(vr_dpdk.rss_mempool, &kni_conf, &kni_ops); if (kni == NULL) { - RTE_LOG(ERR, VROUTER, "\terror allocation KNI device %s at eth device %" - PRIu8 "\n", vif->vif_name, port_id); + RTE_LOG(ERR, VROUTER, " error allocation KNI device %s" + " at eth device %" PRIu8 "\n", vif->vif_name, port_id); return -ENOMEM; } diff --git a/dpdk/vr_dpdk_lcore.c b/dpdk/vr_dpdk_lcore.c index a3a419a4f..1b7f22405 100644 --- a/dpdk/vr_dpdk_lcore.c +++ b/dpdk/vr_dpdk_lcore.c @@ -14,20 +14,19 @@ * */ -#include -#include -#include -#include - #include "vr_dpdk.h" -#include "vr_uvhost.h" +#include "vr_dpdk_netlink.h" #include "vr_dpdk_usocket.h" #include "vr_dpdk_virtio.h" -#include "vr_dpdk_netlink.h" +#include "vr_uvhost.h" + +#include -#include #include +#include +#include #include +#include /* * vr_dpdk_phys_lcore_least_used_get - returns the least used lcore among the @@ -172,7 +171,7 @@ vr_dpdk_lcore_mpls_schedule(struct vr_interface *vif, unsigned dst_ip, unsigned least_used_id = vr_dpdk_lcore_least_used_get(); if (least_used_id == VR_MAX_CPUS) { - RTE_LOG(ERR, VROUTER, "\terror getting the least used lcore ID\n"); + RTE_LOG(ERR, VROUTER, " error getting the least used lcore ID\n"); return -EFAULT; } @@ -186,7 +185,7 @@ vr_dpdk_lcore_mpls_schedule(struct vr_interface *vif, unsigned dst_ip, return ret; /* init RX queue */ - RTE_LOG(INFO, VROUTER, "\tlcore %u RX from filtering queue %" PRIu16 + RTE_LOG(INFO, VROUTER, " lcore %u RX from filtering queue %" PRIu16 " MPLS %u\n", least_used_id, queue_id, mpls_label); rx_queue = vr_dpdk_ethdev_rx_queue_init(least_used_id, vif, queue_id); if (rx_queue == NULL) @@ -212,7 +211,7 @@ vr_dpdk_lcore_if_schedule(struct vr_interface *vif, unsigned least_used_id, struct vr_dpdk_lcore *lcore; if (least_used_id == VR_MAX_CPUS) { - RTE_LOG(ERR, VROUTER, "\terror getting the least used lcore ID\n"); + RTE_LOG(ERR, VROUTER, " error getting the least used lcore ID\n"); return -EFAULT; } @@ -231,7 +230,7 @@ vr_dpdk_lcore_if_schedule(struct vr_interface *vif, unsigned least_used_id, (nb_tx_queues > vr_dpdk.nb_fwd_lcores)) && (queue_id < nb_tx_queues)) { /* there is a hardware queue available */ - RTE_LOG(INFO, VROUTER, "\tlcore %u TX to HW queue %" PRIu16 "\n", + RTE_LOG(INFO, VROUTER, " lcore %u TX to HW queue %" PRIu16 "\n", lcore_id, queue_id); tx_queue = (*tx_queue_init_op)(lcore_id, vif, queue_id); if (tx_queue == NULL) @@ -240,7 +239,7 @@ vr_dpdk_lcore_if_schedule(struct vr_interface *vif, unsigned least_used_id, queue_id++; } else { /* no more hardware queues left, so we use rings instead */ - RTE_LOG(INFO, VROUTER, "\tlcore %u TX to SW ring\n", lcore_id); + RTE_LOG(INFO, VROUTER, " lcore %u TX to SW ring\n", lcore_id); tx_queue = vr_dpdk_ring_tx_queue_init(lcore_id, vif, least_used_id); if (tx_queue == NULL) return -EFAULT; @@ -265,7 +264,7 @@ vr_dpdk_lcore_if_schedule(struct vr_interface *vif, unsigned least_used_id, /* init hardware queue */ if (queue_id < nb_rx_queues) { /* there is a hardware queue available */ - RTE_LOG(INFO, VROUTER, "\tlcore %u RX from HW queue %" PRIu16 + RTE_LOG(INFO, VROUTER, " lcore %u RX from HW queue %" PRIu16 "\n", lcore_id, queue_id); rx_queue = (*rx_queue_init_op)(lcore_id, vif, queue_id); if (rx_queue == NULL) @@ -353,13 +352,13 @@ dpdk_lcore_rxtx_release_all(struct vr_interface *vif) lcore = vr_dpdk.lcores[lcore_id]; rx_queue_params = &lcore->lcore_rx_queue_params[vif->vif_idx]; if (rx_queue_params->qp_release_op) { - RTE_LOG(INFO, VROUTER, "\treleasing lcore %u RX queue\n", lcore_id); + RTE_LOG(INFO, VROUTER, " releasing lcore %u RX queue\n", lcore_id); rx_queue_params->qp_release_op(lcore_id, vif); } tx_queue_params = &lcore->lcore_tx_queue_params[vif->vif_idx]; if (tx_queue_params->qp_release_op) { - RTE_LOG(INFO, VROUTER, "\treleasing lcore %u TX queue\n", lcore_id); + RTE_LOG(INFO, VROUTER, " releasing lcore %u TX queue\n", lcore_id); tx_queue_params->qp_release_op(lcore_id, vif); } } @@ -709,6 +708,7 @@ dpdk_lcore_bond_tx(struct vr_dpdk_lcore *lcore) struct vr_dpdk_queue_params *tx_queue_params; unsigned int vif_idx; + /* TODO: check it is a bond interface */ SLIST_FOREACH(tx_queue, &lcore->lcore_tx_head, q_next) { /* if TX queue is an ethdev */ if (tx_queue->txq_ops.f_tx == rte_port_ethdev_writer_ops.f_tx) { diff --git a/dpdk/vr_dpdk_netlink.c b/dpdk/vr_dpdk_netlink.c index 97223f510..c4456c3ad 100644 --- a/dpdk/vr_dpdk_netlink.c +++ b/dpdk/vr_dpdk_netlink.c @@ -4,23 +4,20 @@ * Copyright (c) 2014, Juniper Networks Private Inc., * All rights reserved */ -#include -#include -#include -#include -#include - -#include -#include -#include "vr_queue.h" +#include "vr_dpdk.h" #include "vr_dpdk_usocket.h" #include "vr_message.h" -#include "vr_dpdk.h" #include "vr_genetlink.h" #include "vr_uvhost.h" #include "vr_uvhost_msg.h" +#include +#include +#include + +#include + #define HDR_LEN (NLMSG_HDRLEN + GENL_HDRLEN + sizeof(struct nlattr)) struct nlmsghdr *dpdk_nl_message_hdr(struct vr_message *); @@ -157,8 +154,8 @@ vr_netlink_uvhost_vif_del(unsigned int vif_idx) */ if (send(vr_nl_uvh_sock, (void *) &msg, sizeof(msg), 0) != sizeof(msg)) { - RTE_LOG(ERR, VROUTER, "\terror deleting vif %u from user space vhost:" - " %s (%d)\n", vif_idx, strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error deleting vif %u from user space vhost:" + " %s (%d)\n", vif_idx, rte_strerror(errno), errno); return -1; } @@ -190,8 +187,8 @@ vr_netlink_uvhost_vif_add(char *vif_name, unsigned int vif_idx, */ if (send(vr_nl_uvh_sock, (void *) &msg, sizeof(msg), 0) != sizeof(msg)) { - RTE_LOG(ERR, VROUTER, "\terror adding vif %u to user space vhost:" - " %s (%d)\n", vif_idx, strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error adding vif %u to user space vhost:" + " %s (%d)\n", vif_idx, rte_strerror(errno), errno); return -1; } @@ -221,11 +218,11 @@ vr_nl_uvhost_connect(void) s = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (s == -1) { - RTE_LOG(ERR, VROUTER, "\terror creating uvhost socket: %s (%d)\n", - strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error creating uvhost socket: %s (%d)\n", + rte_strerror(errno), errno); goto error; } - RTE_LOG(INFO, VROUTER, "\tuvhost Unix socket FD is %d\n", s); + RTE_LOG(INFO, VROUTER, " uvhost Unix socket FD is %d\n", s); memset(&nl_sun, 0, sizeof(nl_sun)); nl_sun.sun_family = AF_UNIX; @@ -235,8 +232,8 @@ vr_nl_uvhost_connect(void) unlink(nl_sun.sun_path); ret = bind(s, (struct sockaddr *) &nl_sun, sizeof(nl_sun)); if (ret == -1) { - RTE_LOG(ERR, VROUTER, "\terror binding uvhost FD %d to %s: %s (%d)\n", - s, nl_sun.sun_path, strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error binding uvhost FD %d to %s: %s (%d)\n", + s, nl_sun.sun_path, rte_strerror(errno), errno); goto error; } @@ -249,8 +246,8 @@ vr_nl_uvhost_connect(void) strncpy(uvh_sun.sun_path, VR_UVH_NL_SOCK, sizeof(uvh_sun.sun_path) - 1); ret = vr_dpdk_retry_connect(s, (struct sockaddr *) &uvh_sun, sizeof(uvh_sun)); if (ret == -1) { - RTE_LOG(ERR, VROUTER, "\terror connecting uvhost socket FD %d to %s: %s (%d)\n", - s, uvh_sun.sun_path, strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error connecting uvhost socket FD %d to %s:" + " %s (%d)\n", s, uvh_sun.sun_path, rte_strerror(errno), errno); goto error; } @@ -282,11 +279,11 @@ vr_dpdk_netlink_init(void) vr_dpdk.netlink_sock = vr_usocket(NETLINK, TCP); if (!vr_dpdk.netlink_sock) { - RTE_LOG(ERR, VROUTER, "\terror creating NetLink server socket: %s (%d)\n", - strerror(errno), errno); + RTE_LOG(ERR, VROUTER, " error creating NetLink server socket:" + " %s (%d)\n", rte_strerror(errno), errno); return -1; } - RTE_LOG(INFO, VROUTER, "\tNetLink TCP socket FD is %d\n", + RTE_LOG(INFO, VROUTER, " NetLink TCP socket FD is %d\n", ((struct vr_usocket *)vr_dpdk.netlink_sock)->usock_fd); ret = vr_nl_uvhost_connect(); @@ -294,7 +291,7 @@ vr_dpdk_netlink_init(void) vr_message_transport_unregister(&dpdk_nl_transport); vr_usocket_close(vr_dpdk.netlink_sock); - RTE_LOG(ERR, VROUTER, "\terror creating uvhost connection\n"); + RTE_LOG(ERR, VROUTER, " error creating uvhost connection\n"); return -1; } diff --git a/dpdk/vr_dpdk_netlink.h b/dpdk/vr_dpdk_netlink.h index 4c27b9495..9631e8544 100644 --- a/dpdk/vr_dpdk_netlink.h +++ b/dpdk/vr_dpdk_netlink.h @@ -4,6 +4,7 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ + #ifndef __VR_DPDK_NETLINK_H__ #define __VR_DPDK_NETLINK_H__ diff --git a/dpdk/vr_dpdk_packet.c b/dpdk/vr_dpdk_packet.c index ff935d3ba..cc7a64f16 100644 --- a/dpdk/vr_dpdk_packet.c +++ b/dpdk/vr_dpdk_packet.c @@ -4,14 +4,15 @@ * Copyright (c) 2014, Juniper Networks, Inc. * All rights reserved */ -#include -#include -#include -#include "vr_queue.h" #include "vr_dpdk.h" +#include "vr_queue.h" #include "vr_dpdk_usocket.h" +#include +#include +#include + int dpdk_packet_core_id = -1; void @@ -94,7 +95,7 @@ dpdk_packet_socket_init(void) vr_dpdk.packet_ring = rte_ring_create("pkt0_tx", VR_DPDK_TX_RING_SZ, SOCKET_ID_ANY, RING_F_SC_DEQ); if (!vr_dpdk.packet_ring) { - RTE_LOG(ERR, VROUTER, "\terror creating pkt0 ring\n"); + RTE_LOG(ERR, VROUTER, " error creating pkt0 ring\n"); goto error; } } diff --git a/dpdk/vr_dpdk_ringdev.c b/dpdk/vr_dpdk_ringdev.c index dea102e77..c002b40c3 100644 --- a/dpdk/vr_dpdk_ringdev.c +++ b/dpdk/vr_dpdk_ringdev.c @@ -13,13 +13,11 @@ * vr_dpdk_ringdev.c -- DPDK ring device * */ -#include -#include #include "vr_dpdk.h" -#include #include +#include /* Allocates a new ring */ struct rte_ring * @@ -65,7 +63,7 @@ dpdk_ring_to_push_add(unsigned lcore_id, struct rte_ring *tx_ring, rtp->rtp_tx_queue = tx_queue; rte_wmb(); lcore->lcore_nb_rings_to_push++; - RTE_LOG(INFO, VROUTER, "\tlcore %u now has %"PRIu16 + RTE_LOG(INFO, VROUTER, " lcore %u now has %" PRIu16 " ring(s) to push/route\n", lcore_id, lcore->lcore_nb_rings_to_push); RTE_VERIFY(lcore->lcore_nb_rings_to_push < VR_DPDK_MAX_RINGS); @@ -119,7 +117,7 @@ dpdk_ring_tx_queue_release(unsigned lcore_id, struct vr_interface *vif) /* flush and free the queue */ if (tx_queue->txq_ops.f_free(tx_queue->q_queue_h)) { - RTE_LOG(ERR, VROUTER, "\terror freeing lcore %u ring\n", lcore_id); + RTE_LOG(ERR, VROUTER, " error freeing lcore %u ring\n", lcore_id); } /* reset the queue */ @@ -189,7 +187,7 @@ vr_dpdk_ring_tx_queue_init(unsigned lcore_id, struct vr_interface *vif, return tx_queue; error: - RTE_LOG(ERR, VROUTER, "\terror initializing ring TX queue for device %" + RTE_LOG(ERR, VROUTER, " error initializing ring TX queue for device %" PRIu8 "\n", port_id); return NULL; } diff --git a/dpdk/vr_dpdk_usocket.c b/dpdk/vr_dpdk_usocket.c index 0b2f34d2b..32037efdf 100644 --- a/dpdk/vr_dpdk_usocket.c +++ b/dpdk/vr_dpdk_usocket.c @@ -5,29 +5,21 @@ * Copyright(c) 2014, Juniper Networks Inc. * All rights reserved */ -#include -#include + +#include "vr_dpdk.h" +#include "vr_dpdk_usocket.h" +#include "vr_message.h" + #include #include -#include - +#include +#include #include -#include -#include #include -#include #include -#include - -#include - -#include "vr_queue.h" -#include "vr_dpdk_usocket.h" -#include "vr_message.h" -#include "vr_dpdk.h" - +#include #include #include @@ -614,7 +606,7 @@ __usock_read(struct vr_usocket *usockp) rte_hexdump(stdout, "usock buffer dump:", buf + offset, ret); } else if (ret < 0) { RTE_LOG(DEBUG, USOCK, "%s[%lx]: FD %d read returned error %d: %s (%d)\n", __func__, - pthread_self(), usockp->usock_fd, ret, strerror(errno), errno); + pthread_self(), usockp->usock_fd, ret, rte_strerror(errno), errno); } #endif if (ret <= 0) { @@ -629,7 +621,7 @@ __usock_read(struct vr_usocket *usockp) return 0; RTE_LOG(ERR, USOCK, "Error reading FD %d: %s (%d)\n", - usockp->usock_fd, strerror(errno), errno); + usockp->usock_fd, rte_strerror(errno), errno); return ret; } diff --git a/dpdk/vr_dpdk_virtio.c b/dpdk/vr_dpdk_virtio.c index 0945ebd0d..bb6657565 100644 --- a/dpdk/vr_dpdk_virtio.c +++ b/dpdk/vr_dpdk_virtio.c @@ -6,17 +6,15 @@ * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ -#include -#include -#include -#include - #include "vr_dpdk.h" #include "vr_dpdk_virtio.h" -#include "qemu_uvhost.h" #include "vr_uvhost_client.h" +#include +#include + #include +#include void *vr_dpdk_vif_clients[VR_MAX_INTERFACES]; vr_dpdk_virtioq_t vr_dpdk_virtio_rxqs[VR_MAX_INTERFACES][VR_MAX_CPUS]; @@ -105,12 +103,12 @@ vr_dpdk_virtio_rx_queue_init(unsigned int lcore_id, struct vr_interface *vif, struct vr_dpdk_lcore *lcore = vr_dpdk.lcores[lcore_id]; unsigned int vif_idx = vif->vif_idx; struct vr_dpdk_queue *rx_queue = &lcore->lcore_rx_queues[vif_idx]; - char ring_name[64]; + char ring_name[RTE_RING_NAMESIZE]; struct vr_dpdk_queue_params *rx_queue_params = &lcore->lcore_rx_queue_params[vif_idx]; int ret; - RTE_LOG(INFO, VROUTER, "\tcreating lcore %u RX ring for queue %u vif %u\n", + RTE_LOG(INFO, VROUTER, " creating lcore %u RX ring for queue %u vif %u\n", lcore_id, queue_id, vif_idx); if (queue_id >= vr_dpdk_virtio_nrxqs(vif)) { @@ -160,7 +158,7 @@ vr_dpdk_virtio_rx_queue_init(unsigned int lcore_id, struct vr_interface *vif, rte_free(vr_dpdk_virtio_rxqs[vif_idx][queue_id].vdv_pring); vr_dpdk_virtio_rxqs[vif_idx][queue_id].vdv_pring = NULL; } - RTE_LOG(ERR, VROUTER, "\terror creating lcore %u RX ring for queue %u vif %u\n", + RTE_LOG(ERR, VROUTER, " error creating lcore %u RX ring for queue %u vif %u\n", lcore_id, queue_id, vif_idx); return NULL; } diff --git a/dpdk/vr_uvhost.c b/dpdk/vr_uvhost.c index c5138e82b..dc63ea494 100644 --- a/dpdk/vr_uvhost.c +++ b/dpdk/vr_uvhost.c @@ -4,24 +4,25 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "vr_dpdk.h" +#include "vr_dpdk_usocket.h" #include "vr_uvhost.h" -#include "vr_uvhost_util.h" -#include "vr_uvhost_msg.h" -#include "qemu_uvhost.h" #include "vr_uvhost_client.h" -#include "vr_dpdk_usocket.h" +#include "vr_uvhost_msg.h" +#include "vr_uvhost_util.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include /* Global variables */ vr_uvh_exit_callback_t vr_uvhost_exit_fn; @@ -90,19 +91,19 @@ vr_uvhost_start(void *arg) vr_uvhost_log("Starting uvhost server...\n"); lcore->lcore_event_fd = eventfd(0, 0); if (lcore->lcore_event_fd == -1) { - vr_uvhost_log("\terror creating event FD: %s (%d)\n", - strerror(errno), errno); + vr_uvhost_log(" error creating event FD: %s (%d)\n", + rte_strerror(errno), errno); goto error; } - vr_uvhost_log("\tserver event FD is %d\n", lcore->lcore_event_fd); + vr_uvhost_log(" server event FD is %d\n", lcore->lcore_event_fd); s = socket(AF_UNIX, SOCK_SEQPACKET, 0); if (s == -1) { - vr_uvhost_log("\terror creating server socket: %s (%d)\n", - strerror(errno), errno); + vr_uvhost_log(" error creating server socket: %s (%d)\n", + rte_strerror(errno), errno); goto error; } - vr_uvhost_log("\tserver socket FD is %d\n", s); + vr_uvhost_log(" server socket FD is %d\n", s); memset(&sun, 0, sizeof(sun)); sun.sun_family = AF_UNIX; @@ -112,25 +113,25 @@ vr_uvhost_start(void *arg) unlink(sun.sun_path); ret = bind(s, (struct sockaddr *) &sun, sizeof(sun)); if (ret == -1) { - vr_uvhost_log("\terror binding server FD %d to %s: %s (%d)\n", - s, sun.sun_path, strerror(errno), errno); + vr_uvhost_log(" error binding server FD %d to %s: %s (%d)\n", + s, sun.sun_path, rte_strerror(errno), errno); goto error; } if (listen(s, 1) == -1) { - vr_uvhost_log("\terror listening server socket FD %d: %s (%d)\n", - s, strerror(errno), errno); + vr_uvhost_log(" error listening server socket FD %d: %s (%d)\n", + s, rte_strerror(errno), errno); goto error; } vr_uvhost_fdset_init(); if (vr_uvhost_add_fd(lcore->lcore_event_fd, UVH_FD_READ, NULL, NULL)) { - vr_uvhost_log("\terror adding server event FD %d\n", lcore->lcore_event_fd); + vr_uvhost_log(" error adding server event FD %d\n", lcore->lcore_event_fd); goto error; } if (vr_uvhost_add_fd(s, UVH_FD_READ, NULL, vr_uvh_nl_listen_handler)) { - vr_uvhost_log("\terror adding server socket FD %d\n", s); + vr_uvhost_log(" error adding server socket FD %d\n", s); goto error; } @@ -140,8 +141,8 @@ vr_uvhost_start(void *arg) wfdset = vr_uvh_wfdset_p(); if (select(vr_uvh_max_fd()+1, rfdset, wfdset, NULL, NULL) == -1) { - vr_uvhost_log("\terror selecting FDs: %s (%d)\n", - strerror(errno), errno); + vr_uvhost_log(" error selecting FDs: %s (%d)\n", + rte_strerror(errno), errno); goto error; } @@ -149,7 +150,7 @@ vr_uvhost_start(void *arg) break; if (vr_uvh_call_fd_handlers()) { - vr_uvhost_log("\terror calling socket handlers\n"); + vr_uvhost_log(" error calling socket handlers\n"); goto error; } } diff --git a/dpdk/vr_uvhost.h b/dpdk/vr_uvhost.h index de852eeef..3354f64b7 100644 --- a/dpdk/vr_uvhost.h +++ b/dpdk/vr_uvhost.h @@ -4,6 +4,7 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ + #ifndef __VR_UVHOST_H__ #define __VR_UVHOST_H__ diff --git a/dpdk/vr_uvhost_client.c b/dpdk/vr_uvhost_client.c index 0f9a6eda3..93e167b06 100644 --- a/dpdk/vr_uvhost_client.c +++ b/dpdk/vr_uvhost_client.c @@ -5,17 +5,9 @@ * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ -#include -#include -#include -#include - #include "vr_dpdk.h" -#include "qemu_uvhost.h" #include "vr_uvhost_client.h" -#include - static vr_uvh_client_t vr_uvh_clients[VR_UVH_MAX_CLIENTS]; /* diff --git a/dpdk/vr_uvhost_client.h b/dpdk/vr_uvhost_client.h index 3cba9cb8e..8c55df345 100644 --- a/dpdk/vr_uvhost_client.h +++ b/dpdk/vr_uvhost_client.h @@ -9,6 +9,8 @@ #ifndef __VR_UVHOST_CLIENT_H__ #define __VR_UVHOST_CLIENT_H__ +#include "qemu_uvhost.h" + /* * VR_UVH_MAX_CLIENTS needs to be the same as VR_MAX_INTERFACES. */ diff --git a/dpdk/vr_uvhost_msg.c b/dpdk/vr_uvhost_msg.c index f51c88b6b..04abe9070 100644 --- a/dpdk/vr_uvhost_msg.c +++ b/dpdk/vr_uvhost_msg.c @@ -4,28 +4,21 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "vr_dpdk.h" -#include "vr_uvhost_util.h" -#include "vr_uvhost_msg.h" -#include "qemu_uvhost.h" -#include "vr_uvhost_client.h" #include "vr_dpdk_virtio.h" #include "vr_dpdk_usocket.h" +#include "vr_uvhost_client.h" +#include "vr_uvhost_msg.h" +#include "vr_uvhost_util.h" + +#include +#include +#include +#include +#include +#include #include typedef int (*vr_uvh_msg_handler_fn)(vr_uvh_client_t *vru_cl); @@ -122,11 +115,11 @@ vr_uvhm_set_mem_table(vr_uvh_client_t *vru_cl) vru_cl->vruc_fds_sent[i] = -1; if (region->vrucmr_mmap_addr == ((uint64_t)MAP_FAILED)) { - vr_uvhost_log("mmap for size 0x%"PRIx64" failed for FD %d" + vr_uvhost_log("mmap for size 0x%" PRIx64 " failed for FD %d" " on vhost client %s (%s)\n", size, vru_cl->vruc_fds_sent[i], - vru_cl->vruc_path, strerror(errno)); + vru_cl->vruc_path, rte_strerror(errno)); return -1; } @@ -380,7 +373,7 @@ vr_uvh_cl_call_handler(vr_uvh_client_t *vru_cl) vru_cl->vruc_path + strlen(VR_UVH_VIF_PREFIX), msg->request); if (vru_cl->vruc_num_fds_sent > 0) { for (i = 0; i < vru_cl->vruc_num_fds_sent; i++) { - vr_uvhost_log("\tmessage %d sent FD: %d\n", + vr_uvhost_log(" message %d sent FD: %d\n", msg->request, vru_cl->vruc_fds_sent[i]); } } @@ -553,7 +546,7 @@ vr_uvh_cl_msg_handler(int fd, void *arg) ret + vru_cl->vruc_msg_bytes_read); } else if (ret < 0) { RTE_LOG(DEBUG, UVHOST, "%s[%lx]: FD %d read returned error %d: %s (%d)\n", __func__, - pthread_self(), fd, ret, strerror(errno), errno); + pthread_self(), fd, ret, rte_strerror(errno), errno); } #endif if (ret < 0) { @@ -644,10 +637,10 @@ vr_uvh_cl_listen_handler(int fd, void *arg) return 0; } - vr_uvhost_log("\terror accepting client connection FD %d\n", fd); + vr_uvhost_log(" error accepting client connection FD %d\n", fd); return -1; } - vr_uvhost_log("\tFD %d accepted new client connection FD %d\n", fd, s); + vr_uvhost_log(" FD %d accepted new client connection FD %d\n", fd, s); /* We still need to listen for the original socket to support VM * shut off/restart, since we create the socket at vif --add @@ -660,7 +653,7 @@ vr_uvh_cl_listen_handler(int fd, void *arg) */ if (vr_uvhost_add_fd(s, UVH_FD_READ, vru_cl, vr_uvh_cl_msg_handler)) { - vr_uvhost_log("\terror adding client %s FD %d read handler\n", + vr_uvhost_log(" error adding client %s FD %d read handler\n", sun.sun_path, fd); goto error; } @@ -736,7 +729,7 @@ vr_uvh_nl_vif_add_handler(vrnu_vif_add_t *msg) mode_t umask_mode; if (msg == NULL) { - vr_uvhost_log("\terror adding vif %u: message is NULL\n", + vr_uvhost_log(" error adding vif %u: message is NULL\n", msg->vrnu_vif_idx); return -1; } @@ -745,11 +738,11 @@ vr_uvh_nl_vif_add_handler(vrnu_vif_add_t *msg) msg->vrnu_vif_name); s = socket(AF_UNIX, SOCK_STREAM, 0); if (s == -1) { - vr_uvhost_log("\terror creating vif %u socket: %s (%d)\n", - msg->vrnu_vif_idx, strerror(errno), errno); + vr_uvhost_log(" error creating vif %u socket: %s (%d)\n", + msg->vrnu_vif_idx, rte_strerror(errno), errno); goto error; } - vr_uvhost_log("\tvif %u socket %s FD is %d\n", + vr_uvhost_log(" vif %u socket %s FD is %d\n", msg->vrnu_vif_idx, msg->vrnu_vif_name, s); memset(&sun, 0, sizeof(sun)); @@ -770,8 +763,8 @@ vr_uvh_nl_vif_add_handler(vrnu_vif_add_t *msg) ret = bind(s, (struct sockaddr *) &sun, sizeof(sun)); if (ret == -1) { - vr_uvhost_log("\terror binding vif %u FD %d to %s: %s (%d)\n", - msg->vrnu_vif_idx, s, sun.sun_path, strerror(errno), errno); + vr_uvhost_log(" error binding vif %u FD %d to %s: %s (%d)\n", + msg->vrnu_vif_idx, s, sun.sun_path, rte_strerror(errno), errno); goto error; } @@ -785,14 +778,14 @@ vr_uvh_nl_vif_add_handler(vrnu_vif_add_t *msg) ret = listen(s, 1); if (ret == -1) { - vr_uvhost_log("\terror listening vif %u socket FD %d: %s (%d)\n", - msg->vrnu_vif_idx, s, strerror(errno), errno); + vr_uvhost_log(" error listening vif %u socket FD %d: %s (%d)\n", + msg->vrnu_vif_idx, s, rte_strerror(errno), errno); goto error; } vru_cl = vr_uvhost_new_client(s, sun.sun_path, msg->vrnu_vif_idx); if (vru_cl == NULL) { - vr_uvhost_log("\terror creating vif %u socket %s new vhost client\n", + vr_uvhost_log(" error creating vif %u socket %s new vhost client\n", msg->vrnu_vif_idx, sun.sun_path); goto error; } @@ -803,7 +796,7 @@ vr_uvh_nl_vif_add_handler(vrnu_vif_add_t *msg) ret = vr_uvhost_add_fd(s, UVH_FD_READ, vru_cl, vr_uvh_cl_listen_handler); if (ret == -1) { - vr_uvhost_log("\terror adding vif %u socket FD %d\n", + vr_uvhost_log(" error adding vif %u socket FD %d\n", msg->vrnu_vif_idx, s); goto error; } @@ -894,13 +887,13 @@ vr_uvh_nl_listen_handler(int fd, void *arg) vr_uvhost_log("Handling connection FD %d...\n", fd); s = accept(fd, (struct sockaddr *) &sun, &len); if (s < 0) { - vr_uvhost_log("\terror accepting NetLink connection FD %d\n", fd); + vr_uvhost_log(" error accepting NetLink connection FD %d\n", fd); return -1; } - vr_uvhost_log("\tFD %d accepted new NetLink connection FD %d\n", fd, s); + vr_uvhost_log(" FD %d accepted new NetLink connection FD %d\n", fd, s); if (vr_uvhost_add_fd(s, UVH_FD_READ, NULL, vr_uvh_nl_msg_handler)) { - vr_uvhost_log("\terror adding socket %s FD %d read handler\n", + vr_uvhost_log(" error adding socket %s FD %d read handler\n", sun.sun_path, fd); return -1; } diff --git a/dpdk/vr_uvhost_msg.h b/dpdk/vr_uvhost_msg.h index d3719dfd5..7d12f6f50 100644 --- a/dpdk/vr_uvhost_msg.h +++ b/dpdk/vr_uvhost_msg.h @@ -4,6 +4,7 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ + #ifndef __VR_UVHOST_MSG_H__ #define __VR_UVHOST_MSG_H__ diff --git a/dpdk/vr_uvhost_util.c b/dpdk/vr_uvhost_util.c index b9cebd4d7..5f651240d 100644 --- a/dpdk/vr_uvhost_util.c +++ b/dpdk/vr_uvhost_util.c @@ -4,14 +4,8 @@ * * Copyright (c) 2014 Juniper Networks, Inc. All rights reserved. */ -#include -#include -#include -#include -#include #include "vr_dpdk.h" -#include "vr_uvhost.h" #include "vr_uvhost_util.h" #define MAX_UVHOST_FDS 1024 @@ -37,7 +31,7 @@ vr_uvhost_log(const char *format, ...) va_list args; if (RTE_LOGTYPE_UVHOST & rte_logs.type) { - char buf[256] = "UVHOST: "; + char buf[VR_DPDK_STR_BUF_SZ] = "UVHOST: "; strncat(buf, format, sizeof(buf) - strlen(buf) - 1); buf[sizeof(buf) - 1] = '\0'; diff --git a/include/vr_dpdk.h b/include/vr_dpdk.h index e155dd5bb..6f8f59432 100644 --- a/include/vr_dpdk.h +++ b/include/vr_dpdk.h @@ -17,18 +17,13 @@ #ifndef _VR_DPDK_H_ #define _VR_DPDK_H_ -#include -#include - #include "vr_os.h" -#include "vr_packet.h" #include "vr_interface.h" +#include "vr_packet.h" + +#include #include -#include -#include -#include -#include #include /* @@ -46,8 +41,7 @@ #define RTE_LOGTYPE_USOCK RTE_LOGTYPE_USER2 #define RTE_LOGTYPE_UVHOST RTE_LOGTYPE_USER3 #define RTE_LOGTYPE_DPCORE RTE_LOGTYPE_USER4 -//#define VR_DPDK_LOGTYPE_DISABLE (0) -#define VR_DPDK_LOGTYPE_DISABLE (RTE_LOGTYPE_USOCK | RTE_LOGTYPE_UVHOST) +#define VR_DPDK_LOGTYPE_DISABLE (0) /* * Debug options: @@ -158,6 +152,8 @@ #define VR_DPDK_RETRY_CONNECT_SECS 64 /* Maximum number of KNI devices (vhost0 + monitoring) */ #define VR_DPDK_MAX_KNI_INTERFACES 5 +/* String buffer size (for logs and EAL arguments) */ +#define VR_DPDK_STR_BUF_SZ 512 /* * DPDK LCore IDs