test mbuf attach
[dpdk.git] / lib / librte_ethdev / rte_ethdev.c
index 4cfc6d1..7858ad5 100644 (file)
@@ -38,9 +38,7 @@
 #include <rte_kvargs.h>
 #include <rte_class.h>
 #include <rte_ether.h>
-#ifdef RTE_LIBRTE_TELEMETRY
 #include <rte_telemetry.h>
-#endif
 
 #include "rte_ethdev_trace.h"
 #include "rte_ethdev.h"
@@ -48,8 +46,6 @@
 #include "ethdev_profile.h"
 #include "ethdev_private.h"
 
-int rte_eth_dev_logtype;
-
 static const char *MZ_RTE_ETH_DEV_DATA = "rte_eth_dev_data";
 struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];
 
@@ -164,6 +160,7 @@ static const struct {
        RTE_TX_OFFLOAD_BIT2STR(UDP_TNL_TSO),
        RTE_TX_OFFLOAD_BIT2STR(IP_TNL_TSO),
        RTE_TX_OFFLOAD_BIT2STR(OUTER_UDP_CKSUM),
+       RTE_TX_OFFLOAD_BIT2STR(SEND_ON_TIMESTAMP),
 };
 
 #undef RTE_TX_OFFLOAD_BIT2STR
@@ -281,7 +278,7 @@ end:
 
 error:
        if (ret == -ENOTSUP)
-               RTE_LOG(ERR, EAL, "Bus %s does not support iterating.\n",
+               RTE_ETHDEV_LOG(ERR, "Bus %s does not support iterating.\n",
                                iter->bus->name);
        free(devargs.args);
        free(bus_str);
@@ -1102,6 +1099,8 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
                return ETH_LINK_SPEED_56G;
        case ETH_SPEED_NUM_100G:
                return ETH_LINK_SPEED_100G;
+       case ETH_SPEED_NUM_200G:
+               return ETH_LINK_SPEED_200G;
        default:
                return 0;
        }
@@ -1822,7 +1821,7 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
        }
        mbp_buf_size = rte_pktmbuf_data_room_size(mp);
 
-       if ((mbp_buf_size - RTE_PKTMBUF_HEADROOM) < dev_info.min_rx_bufsize) {
+       if (mbp_buf_size < dev_info.min_rx_bufsize + RTE_PKTMBUF_HEADROOM) {
                RTE_ETHDEV_LOG(ERR,
                        "%s mbuf_data_room_size %d < %d (RTE_PKTMBUF_HEADROOM=%d + min_rx_bufsize(dev)=%d)\n",
                        mp->name, (int)mbp_buf_size,
@@ -3260,12 +3259,14 @@ rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
 int
 rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
+       struct rte_eth_dev_info dev_info;
        struct rte_eth_dev *dev;
        int ret = 0;
        int mask = 0;
        int cur, org = 0;
        uint64_t orig_offloads;
        uint64_t dev_offloads;
+       uint64_t new_offloads;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
@@ -3319,6 +3320,22 @@ rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
        if (mask == 0)
                return ret;
 
+       ret = rte_eth_dev_info_get(port_id, &dev_info);
+       if (ret != 0)
+               return ret;
+
+       /* Rx VLAN offloading must be within its device capabilities */
+       if ((dev_offloads & dev_info.rx_offload_capa) != dev_offloads) {
+               new_offloads = dev_offloads & ~orig_offloads;
+               RTE_ETHDEV_LOG(ERR,
+                       "Ethdev port_id=%u requested new added VLAN offloads "
+                       "0x%" PRIx64 " must be within Rx offloads capabilities "
+                       "0x%" PRIx64 " in %s()\n",
+                       port_id, new_offloads, dev_info.rx_offload_capa,
+                       __func__);
+               return -EINVAL;
+       }
+
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_offload_set, -ENOTSUP);
        dev->data->dev_conf.rxmode.offloads = dev_offloads;
        ret = (*dev->dev_ops->vlan_offload_set)(dev, mask);
@@ -4184,6 +4201,14 @@ rte_eth_dev_rx_intr_ctl_q_get_fd(uint16_t port_id, uint16_t queue_id)
        return fd;
 }
 
+static inline int
+eth_dma_mzone_name(char *name, size_t len, uint16_t port_id, uint16_t queue_id,
+               const char *ring_name)
+{
+       return snprintf(name, len, "eth_p%d_q%d_%s",
+                       port_id, queue_id, ring_name);
+}
+
 const struct rte_memzone *
 rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
                         uint16_t queue_id, size_t size, unsigned align,
@@ -4193,8 +4218,8 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
        const struct rte_memzone *mz;
        int rc;
 
-       rc = snprintf(z_name, sizeof(z_name), "eth_p%d_q%d_%s",
-                     dev->data->port_id, queue_id, ring_name);
+       rc = eth_dma_mzone_name(z_name, sizeof(z_name), dev->data->port_id,
+                       queue_id, ring_name);
        if (rc >= RTE_MEMZONE_NAMESIZE) {
                RTE_ETHDEV_LOG(ERR, "ring name too long\n");
                rte_errno = ENAMETOOLONG;
@@ -4202,13 +4227,47 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
        }
 
        mz = rte_memzone_lookup(z_name);
-       if (mz)
+       if (mz) {
+               if ((socket_id != SOCKET_ID_ANY && socket_id != mz->socket_id) ||
+                               size > mz->len ||
+                               ((uintptr_t)mz->addr & (align - 1)) != 0) {
+                       RTE_ETHDEV_LOG(ERR,
+                               "memzone %s does not justify the requested attributes\n",
+                               mz->name);
+                       return NULL;
+               }
+
                return mz;
+       }
 
        return rte_memzone_reserve_aligned(z_name, size, socket_id,
                        RTE_MEMZONE_IOVA_CONTIG, align);
 }
 
+int
+rte_eth_dma_zone_free(const struct rte_eth_dev *dev, const char *ring_name,
+               uint16_t queue_id)
+{
+       char z_name[RTE_MEMZONE_NAMESIZE];
+       const struct rte_memzone *mz;
+       int rc = 0;
+
+       rc = eth_dma_mzone_name(z_name, sizeof(z_name), dev->data->port_id,
+                       queue_id, ring_name);
+       if (rc >= RTE_MEMZONE_NAMESIZE) {
+               RTE_ETHDEV_LOG(ERR, "ring name too long\n");
+               return -ENAMETOOLONG;
+       }
+
+       mz = rte_memzone_lookup(z_name);
+       if (mz)
+               rc = rte_memzone_free(mz);
+       else
+               rc = -ENOENT;
+
+       return rc;
+}
+
 int
 rte_eth_dev_create(struct rte_device *device, const char *name,
        size_t priv_data_size,
@@ -4232,7 +4291,8 @@ rte_eth_dev_create(struct rte_device *device, const char *name,
                                device->numa_node);
 
                        if (!ethdev->data->dev_private) {
-                               RTE_LOG(ERR, EAL, "failed to allocate private data");
+                               RTE_ETHDEV_LOG(ERR,
+                                       "failed to allocate private data\n");
                                retval = -ENOMEM;
                                goto probe_failed;
                        }
@@ -4240,8 +4300,8 @@ rte_eth_dev_create(struct rte_device *device, const char *name,
        } else {
                ethdev = rte_eth_dev_attach_secondary(name);
                if (!ethdev) {
-                       RTE_LOG(ERR, EAL, "secondary process attach failed, "
-                               "ethdev doesn't exist");
+                       RTE_ETHDEV_LOG(ERR,
+                               "secondary process attach failed, ethdev doesn't exist\n");
                        return  -ENODEV;
                }
        }
@@ -4251,15 +4311,15 @@ rte_eth_dev_create(struct rte_device *device, const char *name,
        if (ethdev_bus_specific_init) {
                retval = ethdev_bus_specific_init(ethdev, bus_init_params);
                if (retval) {
-                       RTE_LOG(ERR, EAL,
-                               "ethdev bus specific initialisation failed");
+                       RTE_ETHDEV_LOG(ERR,
+                               "ethdev bus specific initialisation failed\n");
                        goto probe_failed;
                }
        }
 
        retval = ethdev_init(ethdev, init_params);
        if (retval) {
-               RTE_LOG(ERR, EAL, "ethdev initialisation failed");
+               RTE_ETHDEV_LOG(ERR, "ethdev initialisation failed\n");
                goto probe_failed;
        }
 
@@ -5202,7 +5262,6 @@ parse_cleanup:
        return result;
 }
 
-#ifdef RTE_LIBRTE_TELEMETRY
 static int
 handle_port_list(const char *cmd __rte_unused,
                const char *params __rte_unused,
@@ -5295,14 +5354,11 @@ handle_port_link_status(const char *cmd __rte_unused,
                                "full-duplex" : "half-duplex");
        return 0;
 }
-#endif
 
-RTE_INIT(ethdev_init_log)
+RTE_LOG_REGISTER(rte_eth_dev_logtype, lib.ethdev, INFO);
+
+RTE_INIT(ethdev_init_telemetry)
 {
-       rte_eth_dev_logtype = rte_log_register("lib.ethdev");
-       if (rte_eth_dev_logtype >= 0)
-               rte_log_set_level(rte_eth_dev_logtype, RTE_LOG_INFO);
-#ifdef RTE_LIBRTE_TELEMETRY
        rte_telemetry_register_cmd("/ethdev/list", handle_port_list,
                        "Returns list of available ethdev ports. Takes no parameters");
        rte_telemetry_register_cmd("/ethdev/xstats", handle_port_xstats,
@@ -5310,5 +5366,4 @@ RTE_INIT(ethdev_init_log)
        rte_telemetry_register_cmd("/ethdev/link_status",
                        handle_port_link_status,
                        "Returns the link status for a port. Parameters: int port_id");
-#endif
 }