get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/7747/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 7747,
    "url": "https://patches.dpdk.org/api/patches/7747/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1445268976-27491-4-git-send-email-ehkinzie@gmail.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1445268976-27491-4-git-send-email-ehkinzie@gmail.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1445268976-27491-4-git-send-email-ehkinzie@gmail.com",
    "date": "2015-10-19T15:36:15",
    "name": "[dpdk-dev,v6,3/4] bond mode 4: allow external state machine",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "9cef2ed9cdc591ff5b4c428f06bc3e1e97cafaff",
    "submitter": {
        "id": 208,
        "url": "https://patches.dpdk.org/api/people/208/?format=api",
        "name": "Eric Kinzie",
        "email": "ehkinzie@gmail.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1445268976-27491-4-git-send-email-ehkinzie@gmail.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7747/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7747/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 9DF868E90;\n\tMon, 19 Oct 2015 17:37:04 +0200 (CEST)",
            "from mail-pa0-f42.google.com (mail-pa0-f42.google.com\n\t[209.85.220.42]) by dpdk.org (Postfix) with ESMTP id 2D6868E85\n\tfor <dev@dpdk.org>; Mon, 19 Oct 2015 17:37:03 +0200 (CEST)",
            "by pacfv9 with SMTP id fv9so98785718pac.3\n\tfor <dev@dpdk.org>; Mon, 19 Oct 2015 08:37:02 -0700 (PDT)",
            "from buildhost2.vyatta.com. ([144.49.132.22])\n\tby smtp.gmail.com with ESMTPSA id\n\tez2sm37002362pbb.5.2015.10.19.08.37.00\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tMon, 19 Oct 2015 08:37:01 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=MJBRQQT79BG4CtwXAILKfFuZFcI6aOW3HBXrzDUiH8U=;\n\tb=Cu9xbhyxilwUda4POW4U1vE+jTZDpOZEow2/jlXNg5Pha4AW/v3ACjQMI1LKuUy6UQ\n\tS8k2gfBJyPKZup8zzlacKnbiWP/nqoCDu/ElFrppUkpcsjcAN5fL1EDbaYEnjd1tCeYt\n\tXVa6qOyesKWk6m2LYnxmBJ9dQjQGM3S6x5ASby/b2tFYNEbqlrjaXsoLw+0VZj/ipNOQ\n\t6Q87Z49/Y98OfwnINnN+nkRUgfFQ2VjGVbhBfddGrJ4EB0mdO3nDdXhrSb24bDfmcSpC\n\tXQmtZjD7kX4Z5d24/qhByjHmHCqmyIw3uTY5PE/Z9RGy7UQrgnb0CfKMhjN+a3aruGCx\n\t//qw==",
        "X-Received": "by 10.68.57.238 with SMTP id l14mr35560057pbq.150.1445269022353; \n\tMon, 19 Oct 2015 08:37:02 -0700 (PDT)",
        "From": "Eric Kinzie <ehkinzie@gmail.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 19 Oct 2015 08:36:15 -0700",
        "Message-Id": "<1445268976-27491-4-git-send-email-ehkinzie@gmail.com>",
        "X-Mailer": "git-send-email 1.7.10.4",
        "In-Reply-To": "<1445268976-27491-1-git-send-email-ehkinzie@gmail.com>",
        "References": "<1445268976-27491-1-git-send-email-ehkinzie@gmail.com>",
        "Cc": "Eric Kinzie <ekinzie@brocade.com>",
        "Subject": "[dpdk-dev] [PATCH v6 3/4] bond mode 4: allow external state machine",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Eric Kinzie <ekinzie@brocade.com>\n\n  Provide functions to allow an external 802.3ad state machine to transmit\n  and recieve LACPDUs and to set the collection/distribution flags on\n  slave interfaces.\n\n  Size of struct rte_eth_bond_8023ad_conf changed.  Increment LIBABIVER\n  and version bond_mode_8023ad_setup and bond_mode_8023ad_conf_get\n  functions.\n\nSigned-off-by: Eric Kinzie <ehkinzie@gmail.com>\n---\n drivers/net/bonding/Makefile                      |    2 +-\n drivers/net/bonding/rte_eth_bond_8023ad.c         |  240 ++++++++++++++++++++-\n drivers/net/bonding/rte_eth_bond_8023ad.h         |   44 ++++\n drivers/net/bonding/rte_eth_bond_8023ad_private.h |   28 +++\n drivers/net/bonding/rte_eth_bond_version.map      |   10 +\n 5 files changed, 321 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/net/bonding/Makefile b/drivers/net/bonding/Makefile\nindex dee0875..8b892ca 100644\n--- a/drivers/net/bonding/Makefile\n+++ b/drivers/net/bonding/Makefile\n@@ -41,7 +41,7 @@ CFLAGS += $(WERROR_FLAGS)\n \n EXPORT_MAP := rte_eth_bond_version.map\n \n-LIBABIVER := 1\n+LIBABIVER := 2\n \n #\n # all source are stored in SRCS-y\ndiff --git a/drivers/net/bonding/rte_eth_bond_8023ad.c b/drivers/net/bonding/rte_eth_bond_8023ad.c\nindex 08f679f..0461fb5 100644\n--- a/drivers/net/bonding/rte_eth_bond_8023ad.c\n+++ b/drivers/net/bonding/rte_eth_bond_8023ad.c\n@@ -39,9 +39,12 @@\n #include <rte_malloc.h>\n #include <rte_errno.h>\n #include <rte_cycles.h>\n+#include <rte_compat.h>\n \n #include \"rte_eth_bond_private.h\"\n \n+static void bond_mode_8023ad_ext_periodic_cb(void *arg);\n+\n #ifdef RTE_LIBRTE_BOND_DEBUG_8023AD\n #define MODE4_DEBUG(fmt, ...) RTE_LOG(DEBUG, PMD, \"%6u [Port %u: %s] \" fmt, \\\n \t\t\tbond_dbg_get_time_diff_ms(), slave_id, \\\n@@ -999,7 +1002,28 @@ bond_mode_8023ad_mac_address_update(struct rte_eth_dev *bond_dev)\n }\n \n void\n-bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,\n+bond_mode_8023ad_conf_get_v20(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf)\n+{\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\tstruct mode8023ad_private *mode4 = &internals->mode4;\n+\tuint64_t ms_ticks = rte_get_tsc_hz() / 1000;\n+\n+\tconf->fast_periodic_ms = mode4->fast_periodic_timeout / ms_ticks;\n+\tconf->slow_periodic_ms = mode4->slow_periodic_timeout / ms_ticks;\n+\tconf->short_timeout_ms = mode4->short_timeout / ms_ticks;\n+\tconf->long_timeout_ms = mode4->long_timeout / ms_ticks;\n+\tconf->aggregate_wait_timeout_ms = mode4->aggregate_wait_timeout / ms_ticks;\n+\tconf->tx_period_ms = mode4->tx_period_timeout / ms_ticks;\n+\tconf->update_timeout_ms = mode4->update_timeout_us / 1000;\n+\tconf->rx_marker_period_ms = mode4->rx_marker_timeout / ms_ticks;\n+\tconf->slowrx_cb = mode4->slowrx_cb;\n+}\n+\n+VERSION_SYMBOL(bond_mode_8023ad_conf_get, _v20, 2.0);\n+\n+void\n+bond_mode_8023ad_conf_get_v22(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_bond_8023ad_conf *conf)\n {\n \tstruct bond_dev_private *internals = dev->data->dev_private;\n@@ -1014,10 +1038,15 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,\n \tconf->tx_period_ms = mode4->tx_period_timeout / ms_ticks;\n \tconf->update_timeout_ms = mode4->update_timeout_us / 1000;\n \tconf->rx_marker_period_ms = mode4->rx_marker_timeout / ms_ticks;\n+\tconf->slowrx_cb = mode4->slowrx_cb;\n }\n \n+BIND_DEFAULT_SYMBOL(bond_mode_8023ad_conf_get, _v22, 2.2);\n+MAP_STATIC_SYMBOL(void bond_mode_8023ad_conf_get(struct rte_eth_dev *dev, struct rte_eth_bond_8023ad_conf *conf), \\\n+\t\t  bond_mode_8023ad_conf_get_v22);\n+\n void\n-bond_mode_8023ad_setup(struct rte_eth_dev *dev,\n+bond_mode_8023ad_setup_v20(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_bond_8023ad_conf *conf)\n {\n \tstruct rte_eth_bond_8023ad_conf def_conf;\n@@ -1047,6 +1076,50 @@ bond_mode_8023ad_setup(struct rte_eth_dev *dev,\n \tmode4->update_timeout_us = conf->update_timeout_ms * 1000;\n }\n \n+VERSION_SYMBOL(bond_mode_8023ad_setup, _v20, 2.0);\n+\n+void\n+bond_mode_8023ad_setup_v22(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf)\n+{\n+\tstruct rte_eth_bond_8023ad_conf def_conf;\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\tstruct mode8023ad_private *mode4 = &internals->mode4;\n+\tuint64_t ms_ticks = rte_get_tsc_hz() / 1000;\n+\n+\tif (conf == NULL) {\n+\t\tconf = &def_conf;\n+\t\tconf->fast_periodic_ms = BOND_8023AD_FAST_PERIODIC_MS;\n+\t\tconf->slow_periodic_ms = BOND_8023AD_SLOW_PERIODIC_MS;\n+\t\tconf->short_timeout_ms = BOND_8023AD_SHORT_TIMEOUT_MS;\n+\t\tconf->long_timeout_ms = BOND_8023AD_LONG_TIMEOUT_MS;\n+\t\tconf->aggregate_wait_timeout_ms = BOND_8023AD_AGGREGATE_WAIT_TIMEOUT_MS;\n+\t\tconf->tx_period_ms = BOND_8023AD_TX_MACHINE_PERIOD_MS;\n+\t\tconf->rx_marker_period_ms = BOND_8023AD_RX_MARKER_PERIOD_MS;\n+\t\tconf->update_timeout_ms = BOND_MODE_8023AX_UPDATE_TIMEOUT_MS;\n+\t\tconf->slowrx_cb = NULL;\n+\t}\n+\n+\tbond_mode_8023ad_stop(dev);\n+\n+\tmode4->fast_periodic_timeout = conf->fast_periodic_ms * ms_ticks;\n+\tmode4->slow_periodic_timeout = conf->slow_periodic_ms * ms_ticks;\n+\tmode4->short_timeout = conf->short_timeout_ms * ms_ticks;\n+\tmode4->long_timeout = conf->long_timeout_ms * ms_ticks;\n+\tmode4->aggregate_wait_timeout = conf->aggregate_wait_timeout_ms * ms_ticks;\n+\tmode4->tx_period_timeout = conf->tx_period_ms * ms_ticks;\n+\tmode4->rx_marker_timeout = conf->rx_marker_period_ms * ms_ticks;\n+\tmode4->update_timeout_us = conf->update_timeout_ms * 1000;\n+\tmode4->slowrx_cb = conf->slowrx_cb;\n+\n+\tif (dev->data->dev_started)\n+\t\tbond_mode_8023ad_start(dev);\n+}\n+\n+BIND_DEFAULT_SYMBOL(bond_mode_8023ad_setup, _v22, 2.2);\n+MAP_STATIC_SYMBOL(void bond_mode_8023ad_setup(struct rte_eth_dev *dev, struct rte_eth_bond_8023ad_conf *conf), \\\n+\t\t  bond_mode_8023ad_setup_v22);\n+\n int\n bond_mode_8023ad_enable(struct rte_eth_dev *bond_dev)\n {\n@@ -1062,6 +1135,13 @@ bond_mode_8023ad_enable(struct rte_eth_dev *bond_dev)\n int\n bond_mode_8023ad_start(struct rte_eth_dev *bond_dev)\n {\n+\tstruct bond_dev_private *internals = bond_dev->data->dev_private;\n+\tstruct mode8023ad_private *mode4 = &internals->mode4;\n+\n+\tif (mode4->slowrx_cb)\n+\t\treturn rte_eal_alarm_set(BOND_MODE_8023AX_UPDATE_TIMEOUT_MS * 1000,\n+\t\t\t&bond_mode_8023ad_ext_periodic_cb, bond_dev);\n+\n \treturn rte_eal_alarm_set(BOND_MODE_8023AX_UPDATE_TIMEOUT_MS * 1000,\n \t\t\t&bond_mode_8023ad_periodic_cb, bond_dev);\n }\n@@ -1069,6 +1149,13 @@ bond_mode_8023ad_start(struct rte_eth_dev *bond_dev)\n void\n bond_mode_8023ad_stop(struct rte_eth_dev *bond_dev)\n {\n+\tstruct bond_dev_private *internals = bond_dev->data->dev_private;\n+\tstruct mode8023ad_private *mode4 = &internals->mode4;\n+\n+\tif (mode4->slowrx_cb) {\n+\t\trte_eal_alarm_cancel(&bond_mode_8023ad_ext_periodic_cb, bond_dev);\n+\t\treturn;\n+\t}\n \trte_eal_alarm_cancel(&bond_mode_8023ad_periodic_cb, bond_dev);\n }\n \n@@ -1215,3 +1302,152 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,\n \tinfo->agg_port_id = port->aggregator_port_id;\n \treturn 0;\n }\n+\n+int\n+rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled)\n+{\n+\tstruct rte_eth_dev *bond_dev;\n+\tstruct bond_dev_private *internals;\n+\tstruct mode8023ad_private *mode4;\n+\tstruct port *port;\n+\n+\tif (rte_eth_bond_mode_get(port_id) != BONDING_MODE_8023AD)\n+\t\treturn -EINVAL;\n+\n+\tbond_dev = &rte_eth_devices[port_id];\n+\n+\tif (!bond_dev->data->dev_started)\n+\t\treturn -EINVAL;\n+\n+\tinternals = bond_dev->data->dev_private;\n+\tif (find_slave_by_id(internals->active_slaves,\n+\t\t\tinternals->active_slave_count, slave_id) ==\n+\t\t\t\tinternals->active_slave_count)\n+\t\treturn -EINVAL;\n+\n+\tmode4 = &internals->mode4;\n+\tif (mode4->slowrx_cb == NULL)\n+\t\treturn -EINVAL;\n+\n+\tport = &mode_8023ad_ports[slave_id];\n+\n+\tif (enabled)\n+\t\tACTOR_STATE_SET(port, COLLECTING);\n+\telse\n+\t\tACTOR_STATE_CLR(port, COLLECTING);\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled)\n+{\n+\tstruct rte_eth_dev *bond_dev;\n+\tstruct bond_dev_private *internals;\n+\tstruct mode8023ad_private *mode4;\n+\tstruct port *port;\n+\n+\tif (rte_eth_bond_mode_get(port_id) != BONDING_MODE_8023AD)\n+\t\treturn -EINVAL;\n+\n+\tbond_dev = &rte_eth_devices[port_id];\n+\n+\tif (!bond_dev->data->dev_started)\n+\t\treturn -EINVAL;\n+\n+\tinternals = bond_dev->data->dev_private;\n+\tif (find_slave_by_id(internals->active_slaves,\n+\t\t\tinternals->active_slave_count, slave_id) ==\n+\t\t\t\tinternals->active_slave_count)\n+\t\treturn -EINVAL;\n+\n+\tmode4 = &internals->mode4;\n+\tif (mode4->slowrx_cb == NULL)\n+\t\treturn -EINVAL;\n+\n+\tport = &mode_8023ad_ports[slave_id];\n+\n+\tif (enabled)\n+\t\tACTOR_STATE_SET(port, DISTRIBUTING);\n+\telse\n+\t\tACTOR_STATE_CLR(port, DISTRIBUTING);\n+\n+\treturn 0;\n+}\n+\n+int\n+rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,\n+\t\tstruct rte_mbuf *lacp_pkt)\n+{\n+\tstruct rte_eth_dev *bond_dev;\n+\tstruct bond_dev_private *internals;\n+\tstruct mode8023ad_private *mode4;\n+\tstruct port *port;\n+\n+\tif (rte_eth_bond_mode_get(port_id) != BONDING_MODE_8023AD)\n+\t\treturn -EINVAL;\n+\n+\tbond_dev = &rte_eth_devices[port_id];\n+\n+\tif (!bond_dev->data->dev_started)\n+\t\treturn -EINVAL;\n+\n+\tinternals = bond_dev->data->dev_private;\n+\tif (find_slave_by_id(internals->active_slaves,\n+\t\t\tinternals->active_slave_count, slave_id) ==\n+\t\t\t\tinternals->active_slave_count)\n+\t\treturn -EINVAL;\n+\n+\tmode4 = &internals->mode4;\n+\tif (mode4->slowrx_cb == NULL)\n+\t\treturn -EINVAL;\n+\n+\tport = &mode_8023ad_ports[slave_id];\n+\n+\tif (rte_pktmbuf_pkt_len(lacp_pkt) < sizeof(struct lacpdu_header))\n+\t\treturn -EINVAL;\n+\n+\tstruct lacpdu_header *lacp;\n+\n+\t/* only enqueue LACPDUs */\n+\tlacp = rte_pktmbuf_mtod(lacp_pkt, struct lacpdu_header *);\n+\tif (lacp->lacpdu.subtype != SLOW_SUBTYPE_LACP)\n+\t\treturn -EINVAL;\n+\n+\tMODE4_DEBUG(\"sending LACP frame\\n\");\n+\n+\treturn rte_ring_enqueue(port->tx_ring, lacp_pkt);\n+}\n+\n+static void\n+bond_mode_8023ad_ext_periodic_cb(void *arg)\n+{\n+\tstruct rte_eth_dev *bond_dev = arg;\n+\tstruct bond_dev_private *internals = bond_dev->data->dev_private;\n+\tstruct mode8023ad_private *mode4 = &internals->mode4;\n+\tstruct port *port;\n+\tvoid *pkt = NULL;\n+\tuint16_t i, slave_id;\n+\n+\tfor (i = 0; i < internals->active_slave_count; i++) {\n+\t\tslave_id = internals->active_slaves[i];\n+\t\tport = &mode_8023ad_ports[slave_id];\n+\n+\t\tif (rte_ring_dequeue(port->rx_ring, &pkt) == 0) {\n+\t\t\tstruct rte_mbuf *lacp_pkt = pkt;\n+\t\t\tstruct lacpdu_header *lacp;\n+\n+\t\t\tlacp = rte_pktmbuf_mtod(lacp_pkt,\n+\t\t\t\t\t\tstruct lacpdu_header *);\n+\t\t\tRTE_VERIFY(lacp->lacpdu.subtype == SLOW_SUBTYPE_LACP);\n+\n+\t\t\t/* This is LACP frame so pass it to rx callback.\n+\t\t\t * Callback is responsible for freeing mbuf.\n+\t\t\t */\n+\t\t\tmode4->slowrx_cb(slave_id, lacp_pkt);\n+\t\t}\n+\t}\n+\n+\trte_eal_alarm_set(internals->mode4.update_timeout_us,\n+\t\t\tbond_mode_8023ad_ext_periodic_cb, arg);\n+}\ndiff --git a/drivers/net/bonding/rte_eth_bond_8023ad.h b/drivers/net/bonding/rte_eth_bond_8023ad.h\nindex ebd0e93..8cfa3d3 100644\n--- a/drivers/net/bonding/rte_eth_bond_8023ad.h\n+++ b/drivers/net/bonding/rte_eth_bond_8023ad.h\n@@ -64,6 +64,8 @@ extern \"C\" {\n #define MARKER_TLV_TYPE_INFO                0x01\n #define MARKER_TLV_TYPE_RESP                0x02\n \n+typedef void (*rte_eth_bond_8023ad_ext_slowrx_fn)(uint8_t slave_id, struct rte_mbuf *lacp_pkt);\n+\n enum rte_bond_8023ad_selection {\n \tUNSELECTED,\n \tSTANDBY,\n@@ -157,6 +159,7 @@ struct rte_eth_bond_8023ad_conf {\n \tuint32_t tx_period_ms;\n \tuint32_t rx_marker_period_ms;\n \tuint32_t update_timeout_ms;\n+\trte_eth_bond_8023ad_ext_slowrx_fn slowrx_cb;\n };\n \n struct rte_eth_bond_8023ad_slave_info {\n@@ -219,4 +222,45 @@ rte_eth_bond_8023ad_slave_info(uint8_t port_id, uint8_t slave_id,\n }\n #endif\n \n+/**\n+ * Configure a slave port to start collecting.\n+ *\n+ * @param port_id\tBonding device id\n+ * @param slave_id\tPort id of valid slave.\n+ * @param enabled\tNon-zero when collection enabled.\n+ * @return\n+ *   0 - if ok\n+ *   -EINVAL if slave is not valid.\n+ */\n+int\n+rte_eth_bond_8023ad_ext_collect(uint8_t port_id, uint8_t slave_id, int enabled);\n+\n+/**\n+ * Configure a slave port to start distributing.\n+ *\n+ * @param port_id\tBonding device id\n+ * @param slave_id\tPort id of valid slave.\n+ * @param enabled\tNon-zero when distribution enabled.\n+ * @return\n+ *   0 - if ok\n+ *   -EINVAL if slave is not valid.\n+ */\n+int\n+rte_eth_bond_8023ad_ext_distrib(uint8_t port_id, uint8_t slave_id, int enabled);\n+\n+/**\n+ * LACPDU transmit path for external 802.3ad state machine.  Caller retains\n+ * ownership of the packet on failure.\n+ *\n+ * @param port_id\tBonding device id\n+ * @param slave_id\tPort ID of valid slave device.\n+ * @param lacp_pkt\tmbuf containing LACPDU.\n+ *\n+ * @return\n+ *   0 on success, negative value otherwise.\n+ */\n+int\n+rte_eth_bond_8023ad_ext_slowtx(uint8_t port_id, uint8_t slave_id,\n+\t\tstruct rte_mbuf *lacp_pkt);\n+\n #endif /* RTE_ETH_BOND_8023AD_H_ */\ndiff --git a/drivers/net/bonding/rte_eth_bond_8023ad_private.h b/drivers/net/bonding/rte_eth_bond_8023ad_private.h\nindex 8adee70..965ab93 100644\n--- a/drivers/net/bonding/rte_eth_bond_8023ad_private.h\n+++ b/drivers/net/bonding/rte_eth_bond_8023ad_private.h\n@@ -39,6 +39,7 @@\n #include <rte_ether.h>\n #include <rte_byteorder.h>\n #include <rte_atomic.h>\n+#include <rte_compat.h>\n \n #include \"rte_eth_bond_8023ad.h\"\n \n@@ -173,6 +174,8 @@ struct mode8023ad_private {\n \tuint64_t tx_period_timeout;\n \tuint64_t rx_marker_timeout;\n \tuint64_t update_timeout_us;\n+\trte_eth_bond_8023ad_ext_slowrx_fn slowrx_cb;\n+\tuint8_t external_sm;\n };\n \n /**\n@@ -211,6 +214,31 @@ bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,\n void\n bond_mode_8023ad_setup(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_bond_8023ad_conf *conf);\n+void __vsym\n+bond_mode_8023ad_setup_v20(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf);\n+void __vsym\n+bond_mode_8023ad_setup_v22(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf);\n+\n+/**\n+ * @internal\n+ *\n+ * Retreive mode 4 configuration of bonded interface.\n+ *\n+ * @param dev Bonded interface\n+ * @param conf Bonded interface configuration\n+ */\n+void\n+bond_mode_8023ad_conf_get(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf);\n+void __vsym\n+bond_mode_8023ad_conf_get_v20(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf);\n+void __vsym\n+bond_mode_8023ad_conf_get_v22(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_bond_8023ad_conf *conf);\n+\n \n /**\n  * @internal\ndiff --git a/drivers/net/bonding/rte_eth_bond_version.map b/drivers/net/bonding/rte_eth_bond_version.map\nindex 22bd920..7f78717 100644\n--- a/drivers/net/bonding/rte_eth_bond_version.map\n+++ b/drivers/net/bonding/rte_eth_bond_version.map\n@@ -17,6 +17,9 @@ DPDK_2.0 {\n \trte_eth_bond_slaves_get;\n \trte_eth_bond_xmit_policy_get;\n \trte_eth_bond_xmit_policy_set;\n+\trte_eth_bond_8023ad_ext_collect;\n+\trte_eth_bond_8023ad_ext_distrib;\n+\trte_eth_bond_8023ad_ext_slowtx;\n \n \tlocal: *;\n };\n@@ -27,3 +30,10 @@ DPDK_2.1 {\n \trte_eth_bond_free;\n \n } DPDK_2.0;\n+\n+DPDK_2.2 {\n+\tlocal:\n+\n+\tbond_mode_8023ad_conf_get;\n+\tbond_mode_8023ad_setup;\n+} DPDK_2.1;\n",
    "prefixes": [
        "dpdk-dev",
        "v6",
        "3/4"
    ]
}