X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Ftap%2Ftap_tcmsgs.c;h=b478b5951e0114fd5fae8c0c4db634668d669cd4;hb=4710e16a4a7b53c9f2cf38e6f6af945e9af59c26;hp=af1c9aec0d220b2c1e147c810c9dc92a92e55321;hpb=c0bddd3a057f1ef34d2d5aa69e7338caa82de2bf;p=dpdk.git diff --git a/drivers/net/tap/tap_tcmsgs.c b/drivers/net/tap/tap_tcmsgs.c index af1c9aec0d..b478b5951e 100644 --- a/drivers/net/tap/tap_tcmsgs.c +++ b/drivers/net/tap/tap_tcmsgs.c @@ -1,34 +1,6 @@ -/*- - * 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 @@ -38,6 +10,7 @@ #include #include +#include "tap_log.h" struct qdisc { uint32_t handle; @@ -94,7 +67,7 @@ tc_init_msg(struct nlmsg *msg, uint16_t ifindex, uint16_t type, uint16_t flags) * 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) @@ -107,22 +80,26 @@ 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"); + TAP_LOG(ERR, + "Could not delete QDISC: null netlink socket"); return -1; } } 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; } /** @@ -134,23 +111,23 @@ qdisc_del(int nlsk_fd, uint16_t ifindex, struct qdisc *qinfo) * 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) { - struct tc_multiq_qopt opt; + struct tc_multiq_qopt opt = {0}; struct nlmsg msg; tc_init_msg(&msg, ifindex, RTM_NEWQDISC, 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; } @@ -164,7 +141,7 @@ qdisc_add_multiq(int nlsk_fd, uint16_t ifindex) * 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) @@ -175,42 +152,14 @@ 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. * @@ -220,7 +169,7 @@ qdisc_exist_cb(struct nlmsghdr *nh, void *arg) * 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) @@ -256,10 +205,7 @@ 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, @@ -273,43 +219,13 @@ 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. * @@ -319,7 +235,7 @@ qdisc_exists(int nlsk_fd, uint16_t ifindex, uint32_t handle, uint32_t parent) * 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) @@ -342,12 +258,13 @@ 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) { + TAP_LOG(ERR, "Could not add multiq qdisc (%d): %s", + errno, strerror(errno)); + return -1; } return 0; } @@ -367,12 +284,13 @@ qdisc_create_multiq(int nlsk_fd, uint16_t ifindex) 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) { + TAP_LOG(ERR, "Could not add ingress qdisc (%d): %s", + errno, strerror(errno)); + return -1; } return 0; }