X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_pdump%2Frte_pdump.c;h=e6182d35c5aa57411322786adfa6e06c8c1a3319;hb=455da5453987;hp=c921f5176664cc7f25deddd2391ddf9b6c00323f;hpb=278f945402c55497c614de3f46b1a7660782eaf9;p=dpdk.git diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index c921f51766..e6182d35c5 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -46,12 +46,13 @@ #include #include #include -#include #include "rte_pdump.h" -#define SOCKET_PATH_VAR_RUN "/var/run/pdump_sockets" -#define SOCKET_PATH_HOME "HOME/pdump_sockets" +#define SOCKET_PATH_VAR_RUN "/var/run" +#define SOCKET_PATH_HOME "HOME" +#define DPDK_DIR "/.dpdk" +#define SOCKET_DIR "/pdump_sockets" #define SERVER_SOCKET "%s/pdump_server_socket" #define CLIENT_SOCKET "%s/pdump_client_socket_%d_%u" #define DEVICE_ID_SIZE 64 @@ -195,7 +196,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) dup_bufs[d_pkts++] = p; } - ring_enq = rte_ring_enqueue_burst(ring, (void *)dup_bufs, d_pkts); + ring_enq = rte_ring_enqueue_burst(ring, (void *)dup_bufs, d_pkts, NULL); if (unlikely(ring_enq < d_pkts)) { RTE_LOG(DEBUG, PDUMP, "only %d of packets enqueued to ring\n", ring_enq); @@ -206,7 +207,7 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) } static uint16_t -pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused, +pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused, struct rte_mbuf **pkts, uint16_t nb_pkts, uint16_t max_pkts __rte_unused, void *user_params) @@ -216,7 +217,7 @@ pdump_rx(uint8_t port __rte_unused, uint16_t qidx __rte_unused, } static uint16_t -pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused, +pdump_tx(uint16_t port __rte_unused, uint16_t qidx __rte_unused, struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) { pdump_copy(pkts, nb_pkts, user_params); @@ -224,30 +225,7 @@ pdump_tx(uint8_t port __rte_unused, uint16_t qidx __rte_unused, } static int -pdump_get_dombdf(char *device_id, char *domBDF, size_t len) -{ - int ret; - struct rte_pci_addr dev_addr = {0}; - - /* identify if device_id is pci address or name */ - ret = eal_parse_pci_DomBDF(device_id, &dev_addr); - if (ret < 0) - return -1; - - if (dev_addr.domain) - ret = snprintf(domBDF, len, "%u:%u:%u.%u", dev_addr.domain, - dev_addr.bus, dev_addr.devid, - dev_addr.function); - else - ret = snprintf(domBDF, len, "%u:%u.%u", dev_addr.bus, - dev_addr.devid, - dev_addr.function); - - return ret; -} - -static int -pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, +pdump_regitser_rx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue, struct rte_ring *ring, struct rte_mempool *mp, uint16_t operation) { @@ -290,7 +268,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, if (ret < 0) { RTE_LOG(ERR, PDUMP, "failed to remove rx callback, errno=%d\n", - rte_errno); + -ret); return ret; } cbs->cb = NULL; @@ -301,7 +279,7 @@ pdump_regitser_rx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, } static int -pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, +pdump_regitser_tx_callbacks(uint16_t end_q, uint16_t port, uint16_t queue, struct rte_ring *ring, struct rte_mempool *mp, uint16_t operation) { @@ -345,7 +323,7 @@ pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, if (ret < 0) { RTE_LOG(ERR, PDUMP, "failed to remove tx callback, errno=%d\n", - rte_errno); + -ret); return ret; } cbs->cb = NULL; @@ -358,8 +336,8 @@ pdump_regitser_tx_callbacks(uint16_t end_q, uint8_t port, uint16_t queue, static int set_pdump_rxtx_cbs(struct pdump_request *p) { - uint16_t nb_rx_q, nb_tx_q = 0, end_q, queue; - uint8_t port; + uint16_t nb_rx_q = 0, nb_tx_q = 0, end_q, queue; + uint16_t port; int ret = 0; uint32_t flags; uint16_t operation; @@ -441,28 +419,56 @@ set_pdump_rxtx_cbs(struct pdump_request *p) } /* get socket path (/var/run if root, $HOME otherwise) */ -static void +static int pdump_get_socket_path(char *buffer, int bufsz, enum rte_pdump_socktype type) { - const char *dir = NULL; + char dpdk_dir[PATH_MAX] = {0}; + char dir[PATH_MAX] = {0}; + char *dir_home = NULL; + int ret = 0; if (type == RTE_PDUMP_SOCKET_SERVER && server_socket_dir[0] != 0) - dir = server_socket_dir; + snprintf(dir, sizeof(dir), "%s", server_socket_dir); else if (type == RTE_PDUMP_SOCKET_CLIENT && client_socket_dir[0] != 0) - dir = client_socket_dir; + snprintf(dir, sizeof(dir), "%s", client_socket_dir); else { - if (getuid() != 0) - dir = getenv(SOCKET_PATH_HOME); - else - dir = SOCKET_PATH_VAR_RUN; + if (getuid() != 0) { + dir_home = getenv(SOCKET_PATH_HOME); + if (!dir_home) { + RTE_LOG(ERR, PDUMP, + "Failed to get environment variable" + " value for %s, %s:%d\n", + SOCKET_PATH_HOME, __func__, __LINE__); + return -1; + } + snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", + dir_home, DPDK_DIR); + } else + snprintf(dpdk_dir, sizeof(dpdk_dir), "%s%s", + SOCKET_PATH_VAR_RUN, DPDK_DIR); + + mkdir(dpdk_dir, 0700); + snprintf(dir, sizeof(dir), "%s%s", + dpdk_dir, SOCKET_DIR); + } + + ret = mkdir(dir, 0700); + /* if user passed socket path is invalid, return immediately */ + if (ret < 0 && errno != EEXIST) { + RTE_LOG(ERR, PDUMP, + "Failed to create dir:%s:%s\n", dir, + strerror(errno)); + rte_errno = errno; + return -1; } - mkdir(dir, 700); if (type == RTE_PDUMP_SOCKET_SERVER) snprintf(buffer, bufsz, SERVER_SOCKET, dir); else snprintf(buffer, bufsz, CLIENT_SOCKET, dir, getpid(), rte_sys_gettid()); + + return 0; } static int @@ -472,8 +478,14 @@ pdump_create_server_socket(void) struct sockaddr_un addr; socklen_t addr_len; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } addr.sun_family = AF_UNIX; /* remove if file already exists */ @@ -604,8 +616,14 @@ rte_pdump_uninit(void) struct sockaddr_un addr; - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + return -1; + } ret = unlink(addr.sun_path); if (ret != 0) { RTE_LOG(ERR, PDUMP, @@ -635,12 +653,19 @@ pdump_create_client_socket(struct pdump_request *p) "client socket(): %s:pid(%d):tid(%u), %s:%d\n", strerror(errno), pid, rte_sys_gettid(), __func__, __LINE__); - ret = errno; - return ret; + rte_errno = errno; + return -1; } - pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), + ret = pdump_get_socket_path(addr.sun_path, sizeof(addr.sun_path), RTE_PDUMP_SOCKET_CLIENT); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get client socket path: %s:%d\n", + __func__, __LINE__); + rte_errno = errno; + goto exit; + } addr.sun_family = AF_UNIX; addr_len = sizeof(struct sockaddr_un); @@ -650,15 +675,22 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "client bind(): %s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; break; } serv_len = sizeof(struct sockaddr_un); memset(&serv_addr, 0, sizeof(serv_addr)); - pdump_get_socket_path(serv_addr.sun_path, + ret = pdump_get_socket_path(serv_addr.sun_path, sizeof(serv_addr.sun_path), RTE_PDUMP_SOCKET_SERVER); + if (ret != 0) { + RTE_LOG(ERR, PDUMP, + "Failed to get server socket path: %s:%d\n", + __func__, __LINE__); + rte_errno = errno; + break; + } serv_addr.sun_family = AF_UNIX; n = sendto(socket_fd, p, sizeof(struct pdump_request), 0, @@ -667,7 +699,8 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "failed to send to server:%s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; + ret = -1; break; } @@ -678,12 +711,14 @@ pdump_create_client_socket(struct pdump_request *p) RTE_LOG(ERR, PDUMP, "failed to recv from server:%s, %s:%d\n", strerror(errno), __func__, __LINE__); - ret = errno; + rte_errno = errno; + ret = -1; break; } ret = server_resp.err_value; } while (0); +exit: close(socket_fd); unlink(addr.sun_path); return ret; @@ -704,7 +739,7 @@ pdump_validate_ring_mp(struct rte_ring *ring, struct rte_mempool *mp) rte_errno = EINVAL; return -1; } - if (ring->prod.sp_enqueue || ring->cons.sc_dequeue) { + if (ring->prod.single || ring->cons.single) { RTE_LOG(ERR, PDUMP, "ring with either SP or SC settings" " is not valid for pdump, should have MP and MC settings\n"); rte_errno = EINVAL; @@ -729,7 +764,7 @@ pdump_validate_flags(uint32_t flags) } static int -pdump_validate_port(uint8_t port, char *name) +pdump_validate_port(uint16_t port, char *name) { int ret = 0; @@ -766,13 +801,15 @@ pdump_prepare_client_request(char *device, uint16_t queue, req.flags = flags; req.op = operation; if ((operation & ENABLE) != 0) { - strncpy(req.data.en_v1.device, device, strlen(device)); + snprintf(req.data.en_v1.device, sizeof(req.data.en_v1.device), + "%s", device); req.data.en_v1.queue = queue; req.data.en_v1.ring = ring; req.data.en_v1.mp = mp; req.data.en_v1.filter = filter; } else { - strncpy(req.data.dis_v1.device, device, strlen(device)); + snprintf(req.data.dis_v1.device, sizeof(req.data.dis_v1.device), + "%s", device); req.data.dis_v1.queue = queue; req.data.dis_v1.ring = NULL; req.data.dis_v1.mp = NULL; @@ -791,7 +828,7 @@ pdump_prepare_client_request(char *device, uint16_t queue, } int -rte_pdump_enable(uint8_t port, uint16_t queue, uint32_t flags, +rte_pdump_enable(uint16_t port, uint16_t queue, uint32_t flags, struct rte_ring *ring, struct rte_mempool *mp, void *filter) @@ -824,7 +861,6 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue, void *filter) { int ret = 0; - char domBDF[DEVICE_ID_SIZE]; ret = pdump_validate_ring_mp(ring, mp); if (ret < 0) @@ -833,18 +869,14 @@ rte_pdump_enable_by_deviceid(char *device_id, uint16_t queue, if (ret < 0) return ret; - if (pdump_get_dombdf(device_id, domBDF, sizeof(domBDF)) > 0) - ret = pdump_prepare_client_request(domBDF, queue, flags, - ENABLE, ring, mp, filter); - else - ret = pdump_prepare_client_request(device_id, queue, flags, + ret = pdump_prepare_client_request(device_id, queue, flags, ENABLE, ring, mp, filter); return ret; } int -rte_pdump_disable(uint8_t port, uint16_t queue, uint32_t flags) +rte_pdump_disable(uint16_t port, uint16_t queue, uint32_t flags) { int ret = 0; char name[DEVICE_ID_SIZE]; @@ -867,17 +899,12 @@ rte_pdump_disable_by_deviceid(char *device_id, uint16_t queue, uint32_t flags) { int ret = 0; - char domBDF[DEVICE_ID_SIZE]; ret = pdump_validate_flags(flags); if (ret < 0) return ret; - if (pdump_get_dombdf(device_id, domBDF, sizeof(domBDF)) > 0) - ret = pdump_prepare_client_request(domBDF, queue, flags, - DISABLE, NULL, NULL, NULL); - else - ret = pdump_prepare_client_request(device_id, queue, flags, + ret = pdump_prepare_client_request(device_id, queue, flags, DISABLE, NULL, NULL, NULL); return ret;