From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiri Pirko Subject: Re: [PATCH net-next iproute2] iproute2: allow to change slave options via type_slave Date: Wed, 3 Sep 2014 17:02:15 +0200 Message-ID: <20140903150215.GA1843@nanopsycho.lan> References: <1409755408-13929-1-git-send-email-nikolay@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev@vger.kernel.org, stephen@networkplumber.org, davem@davemloft.net To: Nikolay Aleksandrov Return-path: Received: from mail-we0-f178.google.com ([74.125.82.178]:50065 "EHLO mail-we0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932096AbaICPCS (ORCPT ); Wed, 3 Sep 2014 11:02:18 -0400 Received: by mail-we0-f178.google.com with SMTP id u57so8790318wes.9 for ; Wed, 03 Sep 2014 08:02:17 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1409755408-13929-1-git-send-email-nikolay@redhat.com> Sender: netdev-owner@vger.kernel.org List-ID: Wed, Sep 03, 2014 at 04:43:28PM CEST, nikolay@redhat.com wrote: >This patch adds the necessary changes to allow altering a slave device's >options via ip link set type _slave specific-option. >It also adds support to set the bonding slaves' queue_id. > >Example: > ip link set eth0 type bond_slave queue_id 10 > >Signed-off-by: Nikolay Aleksandrov >--- > ip/iplink.c | 22 +++++++++++++++++++--- > ip/iplink_bond_slave.c | 19 +++++++++++++++++++ > 2 files changed, 38 insertions(+), 3 deletions(-) > >diff --git a/ip/iplink.c b/ip/iplink.c >index 1a907d998a87..5f2db92c981e 100644 >--- a/ip/iplink.c >+++ b/ip/iplink.c >@@ -88,7 +88,8 @@ void iplink_usage(void) > fprintf(stderr, "\n"); > fprintf(stderr, "TYPE := { vlan | veth | vcan | dummy | ifb | macvlan | macvtap |\n"); > fprintf(stderr, " bridge | bond | ipoib | ip6tnl | ipip | sit | vxlan |\n"); >- fprintf(stderr, " gre | gretap | ip6gre | ip6gretap | vti | nlmon }\n"); >+ fprintf(stderr, " gre | gretap | ip6gre | ip6gretap | vti | nlmon |\n"); >+ fprintf(stderr, " _slave }\n"); I think you can put "bond_slave" here. Once any other slave type implements parse_opt, it would be added here as well. > } > exit(-1); > } >@@ -697,14 +698,29 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv) > > if (type) { > struct rtattr *linkinfo = NLMSG_TAIL(&req.n); >+ char slavebuf[128], *ulinep = strchr(type, '_'); >+ int iflatype; >+ > addattr_l(&req.n, sizeof(req), IFLA_LINKINFO, NULL, 0); > addattr_l(&req.n, sizeof(req), IFLA_INFO_KIND, type, > strlen(type)); > >- lu = get_link_kind(type); >+ if (ulinep && !strcmp(ulinep, "_slave")) { >+ strncpy(slavebuf, type, sizeof(slavebuf)); >+ slavebuf[sizeof(slavebuf) - 1] = '\0'; >+ ulinep = strchr(slavebuf, '_'); >+ /* check in case it was after sizeof(slavebuf) - 1*/ >+ if (ulinep) >+ *ulinep = '\0'; >+ lu = get_link_slave_kind(slavebuf); >+ iflatype = IFLA_INFO_SLAVE_DATA; >+ } else { >+ lu = get_link_kind(type); >+ iflatype = IFLA_INFO_DATA; >+ } > if (lu && argc) { > struct rtattr * data = NLMSG_TAIL(&req.n); >- addattr_l(&req.n, sizeof(req), IFLA_INFO_DATA, NULL, 0); >+ addattr_l(&req.n, sizeof(req), iflatype, NULL, 0); > > if (lu->parse_opt && > lu->parse_opt(lu, argc, argv, &req.n)) >diff --git a/ip/iplink_bond_slave.c b/ip/iplink_bond_slave.c >index 8f3fc6cec6fa..aacba14aef9c 100644 >--- a/ip/iplink_bond_slave.c >+++ b/ip/iplink_bond_slave.c >@@ -80,10 +80,29 @@ static void bond_slave_print_opt(struct link_util *lu, FILE *f, struct rtattr *t > rta_getattr_u16(tb[IFLA_BOND_SLAVE_AD_AGGREGATOR_ID])); > } > >+static int bond_slave_parse_opt(struct link_util *lu, int argc, char **argv, >+ struct nlmsghdr *n) >+{ >+ __u16 queue_id; >+ >+ while (argc > 0) { >+ if (matches(*argv, "queue_id") == 0) { >+ NEXT_ARG(); >+ if (get_u16(&queue_id, *argv, 0)) >+ invarg("queue_id is invalid", *argv); >+ addattr16(n, 1024, IFLA_BOND_SLAVE_QUEUE_ID, queue_id); >+ } >+ argc--, argv++; >+ } >+ >+ return 0; >+} >+ > struct link_util bond_slave_link_util = { > .id = "bond", > .maxattr = IFLA_BOND_SLAVE_MAX, > .print_opt = bond_slave_print_opt, >+ .parse_opt = bond_slave_parse_opt, > .slave = true, > }; > >-- >1.9.3 >