-/*-
- * BSD LICENSE
- *
- * Copyright 2017 6WIND S.A.
- * Copyright 2017 Mellanox.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of 6WIND S.A. nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2017 6WIND S.A.
+ * Copyright 2017 Mellanox Technologies, Ltd
*/
#include <inttypes.h>
* Additional info to identify the QDISC (handle and parent).
*
* @return
- * 0 on success, -1 otherwise.
+ * 0 on success, -1 otherwise with errno set.
*/
static int
qdisc_del(int nlsk_fd, uint16_t ifindex, struct qdisc *qinfo)
msg.t.tcm_parent = qinfo->parent;
/* if no netlink socket is provided, create one */
if (!nlsk_fd) {
- fd = nl_init(0);
+ fd = tap_nl_init(0);
if (fd < 0) {
RTE_LOG(ERR, PMD,
"Could not delete QDISC: null netlink socket\n");
} else {
fd = nlsk_fd;
}
- if (nl_send(fd, &msg.nh) < 0)
- return -1;
- if (nl_recv_ack(fd) < 0)
- return -1;
+ if (tap_nl_send(fd, &msg.nh) < 0)
+ goto error;
+ if (tap_nl_recv_ack(fd) < 0)
+ goto error;
if (!nlsk_fd)
- return nl_final(fd);
+ return tap_nl_final(fd);
return 0;
+error:
+ if (!nlsk_fd)
+ tap_nl_final(fd);
+ return -1;
}
/**
* The netdevice ifindex where to add the multiqueue QDISC.
*
* @return
- * -1 if the qdisc cannot be added, and 0 otherwise.
+ * 0 on success, -1 otherwise with errno set.
*/
int
qdisc_add_multiq(int nlsk_fd, uint16_t ifindex)
NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE);
msg.t.tcm_handle = TC_H_MAKE(MULTIQ_MAJOR_HANDLE, 0);
msg.t.tcm_parent = TC_H_ROOT;
- nlattr_add(&msg.nh, TCA_KIND, sizeof("multiq"), "multiq");
- nlattr_add(&msg.nh, TCA_OPTIONS, sizeof(opt), &opt);
- if (nl_send(nlsk_fd, &msg.nh) < 0)
+ tap_nlattr_add(&msg.nh, TCA_KIND, sizeof("multiq"), "multiq");
+ tap_nlattr_add(&msg.nh, TCA_OPTIONS, sizeof(opt), &opt);
+ if (tap_nl_send(nlsk_fd, &msg.nh) < 0)
return -1;
- if (nl_recv_ack(nlsk_fd) < 0)
+ if (tap_nl_recv_ack(nlsk_fd) < 0)
return -1;
return 0;
}
* The netdevice ifindex where the QDISC will be added.
*
* @return
- * -1 if the qdisc cannot be added, and 0 otherwise.
+ * 0 on success, -1 otherwise with errno set.
*/
int
qdisc_add_ingress(int nlsk_fd, uint16_t ifindex)
NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE);
msg.t.tcm_handle = TC_H_MAKE(TC_H_INGRESS, 0);
msg.t.tcm_parent = TC_H_INGRESS;
- nlattr_add(&msg.nh, TCA_KIND, sizeof("ingress"), "ingress");
- if (nl_send(nlsk_fd, &msg.nh) < 0)
+ tap_nlattr_add(&msg.nh, TCA_KIND, sizeof("ingress"), "ingress");
+ if (tap_nl_send(nlsk_fd, &msg.nh) < 0)
return -1;
- if (nl_recv_ack(nlsk_fd) < 0)
+ if (tap_nl_recv_ack(nlsk_fd) < 0)
return -1;
return 0;
}
-/**
- * Callback function to check for QDISC existence.
- * If the QDISC is found to exist, increment "exists" in the custom arg.
- *
- * @param[in] nh
- * The netlink message to parse, received from the kernel.
- * @param[in, out] arg
- * Custom arguments for the callback.
- *
- * @return
- * 0.
- */
-static int
-qdisc_exist_cb(struct nlmsghdr *nh, void *arg)
-{
- struct list_args *args = (struct list_args *)arg;
- struct qdisc_custom_arg *custom = args->custom_arg;
- struct tcmsg *t = NLMSG_DATA(nh);
-
- /* filter by request iface */
- if (args->ifindex != (unsigned int)t->tcm_ifindex)
- return 0;
- if (t->tcm_handle != custom->handle || t->tcm_parent != custom->parent)
- return 0;
- custom->exists++;
- return 0;
-}
-
/**
* Callback function to delete a QDISC.
*
* Custom arguments for the callback.
*
* @return
- * 0.
+ * 0 on success, -1 otherwise with errno set.
*/
static int
qdisc_del_cb(struct nlmsghdr *nh, void *arg)
* The arguments to provide the callback function with.
*
* @return
- * -1 if either sending the netlink message failed, or if receiving the answer
- * failed, or finally if the callback returned a negative value for that
- * answer.
- * 0 is returned otherwise.
+ * 0 on success, -1 otherwise with errno set.
*/
static int
qdisc_iterate(int nlsk_fd, uint16_t ifindex,
};
tc_init_msg(&msg, ifindex, RTM_GETQDISC, NLM_F_REQUEST | NLM_F_DUMP);
- if (nl_send(nlsk_fd, &msg.nh) < 0)
+ if (tap_nl_send(nlsk_fd, &msg.nh) < 0)
return -1;
- if (nl_recv(nlsk_fd, callback, &args) < 0)
+ if (tap_nl_recv(nlsk_fd, callback, &args) < 0)
return -1;
return 0;
}
-/**
- * Check whether a given QDISC already exists for the netdevice.
- *
- * @param[in] nlsk_fd
- * The netlink socket file descriptor used for communication.
- * @param[in] ifindex
- * The netdevice ifindex to check QDISC existence for.
- * @param[in] callback
- * The function to call for each QDISC.
- * @param[in, out] arg
- * The arguments to provide the callback function with.
- *
- * @return
- * 1 if the qdisc exists, 0 otherwise.
- */
-int
-qdisc_exists(int nlsk_fd, uint16_t ifindex, uint32_t handle, uint32_t parent)
-{
- struct qdisc_custom_arg arg = {
- .handle = handle,
- .parent = parent,
- .exists = 0,
- };
-
- qdisc_iterate(nlsk_fd, ifindex, qdisc_exist_cb, &arg);
- if (arg.exists)
- return 1;
- return 0;
-}
-
/**
* Delete all QDISCs for a given netdevice.
*
* The netdevice ifindex where to find QDISCs.
*
* @return
- * -1 if the lookup failed, 0 otherwise.
+ * 0 on success, -1 otherwise with errno set.
*/
int
qdisc_flush(int nlsk_fd, uint16_t ifindex)
int
qdisc_create_multiq(int nlsk_fd, uint16_t ifindex)
{
- if (!qdisc_exists(nlsk_fd, ifindex,
- TC_H_MAKE(MULTIQ_MAJOR_HANDLE, 0), TC_H_ROOT)) {
- if (qdisc_add_multiq(nlsk_fd, ifindex) < 0) {
- RTE_LOG(ERR, PMD, "Could not add multiq qdisc\n");
- return -1;
- }
+ int err = 0;
+
+ err = qdisc_add_multiq(nlsk_fd, ifindex);
+ if (err < 0 && errno != -EEXIST) {
+ RTE_LOG(ERR, PMD, "Could not add multiq qdisc (%d): %s\n",
+ errno, strerror(errno));
+ return -1;
}
return 0;
}
int
qdisc_create_ingress(int nlsk_fd, uint16_t ifindex)
{
- if (!qdisc_exists(nlsk_fd, ifindex,
- TC_H_MAKE(TC_H_INGRESS, 0), TC_H_INGRESS)) {
- if (qdisc_add_ingress(nlsk_fd, ifindex) < 0) {
- RTE_LOG(ERR, PMD, "Could not add ingress qdisc\n");
- return -1;
- }
+ int err = 0;
+
+ err = qdisc_add_ingress(nlsk_fd, ifindex);
+ if (err < 0 && errno != -EEXIST) {
+ RTE_LOG(ERR, PMD, "Could not add ingress qdisc (%d): %s\n",
+ errno, strerror(errno));
+ return -1;
}
return 0;
}