From patchwork Thu Aug 22 17:23:54 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 269124 X-Patchwork-Delegate: shemminger@vyatta.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id B56CC2C00AF for ; Fri, 23 Aug 2013 03:24:05 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753803Ab3HVRYB (ORCPT ); Thu, 22 Aug 2013 13:24:01 -0400 Received: from mail-pd0-f178.google.com ([209.85.192.178]:51491 "EHLO mail-pd0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753429Ab3HVRX7 (ORCPT ); Thu, 22 Aug 2013 13:23:59 -0400 Received: by mail-pd0-f178.google.com with SMTP id w10so2141549pde.23 for ; Thu, 22 Aug 2013 10:23:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:date:from:to:subject:message-id:mime-version :content-type:content-transfer-encoding; bh=Ff7LH8/WwCBl9zbJdPb1v3SSINb15XEh3U5G90ChbYc=; b=hGeQQVyFMdaAXhKrn/ToR/vPmBlHVyJkhMZxr92dbLklzKYhwIyYoleG2/bXoeYxPD Af7Lfcoo3iFxQD+GADn4oCtxjvNUA8RCIeL48Rd8FBNVo8kBmOvWvDxpuly/0SX9GN0u znv6DlXW962e1o6HSfSyZUtms4Sccn6pHpU3Po/7YFFi4VCFGrIKrOXe1YHfSBSg1fwo JKkciGNOqZ/GIn1u+4lgG5BEB0rlDzmiX/GJIVoYgIu59PQi0Z6IOozPbaLffWdcbSny 1uiDYSwsZXxeBF/l7iQxhlibzByMzxjPRNu3dX0i6PeNGcMGVmC9koIepEduae7p4bhW hT7Q== X-Gm-Message-State: ALoCoQmqADcfP7iizasoMaafFP6htFwQvXcMzx7cy3Acvs86WoJME4qILam9AGEFSIFl798dFZij X-Received: by 10.66.248.130 with SMTP id ym2mr4270452pac.177.1377192239387; Thu, 22 Aug 2013 10:23:59 -0700 (PDT) Received: from samsung-9 (173-12-175-222-oregon.hfc.comcastbusiness.net. [173.12.175.222]) by mx.google.com with ESMTPSA id wr9sm16121310pbc.7.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 22 Aug 2013 10:23:58 -0700 (PDT) Date: Thu, 22 Aug 2013 10:23:54 -0700 From: Stephen Hemminger To: netdev@vger.kernel.org Subject: [RFC] iproute2: display devconf info Message-ID: <20130822102354.31b0161d@samsung-9> X-Mailer: Claws Mail 3.8.1 (GTK+ 2.24.10; x86_64-pc-linux-gnu) Mime-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Would this be useful, it allows displaying devconf information with ip command. Open to suggestions about format, and how to condense the display. $ ip -d addr show dev wlan0 3: wlan0: mtu 1500 qdisc mq state UP qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff ipv4 conf: forwarding:1 accept redirects:1 secure redirects:1 send redirects:1 shared media:1 accept source route:1 ipv6 conf: hoplimit:64 mtu6:1500 accept ra:2 accept redirects:1 autoconf:1 dad transmits:1 rtr solicits:3 rtr solicit interval:4000 rtr solicit delay:1000 use tempaddr:2 temp valid lft:604800 temp prefered lft:86400 regen max retry:3 max desync factor:600 max addresses:16 accept ra defrtr:1 accept ra pinfo:1 accept ra rtr pref:1 rtr probe interval:60000 accept dad:1 inet 192.168.1.189/24 brd 192.168.1.255 scope global wlan0 valid_lft forever preferred_lft forever inet6 fe80::c685:8ff:feca:841f/64 scope link valid_lft forever preferred_lft forever --- ip/ipaddress.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/ip/ipaddress.c b/ip/ipaddress.c index 1c3e4da..f49e246 100644 --- a/ip/ipaddress.c +++ b/ip/ipaddress.c @@ -386,6 +386,126 @@ static void print_link_stats(FILE *fp, const struct rtnl_link_stats *s) } } +static const char *ipv4_devconf[] = { + "forwarding", + "mc forwarding", + "proxy arp", + "accept redirects", + "secure redirects", + "send redirects", + "shared media", + "rp filter", + "accept source route", + "bootp relay", + "log martians", + "tag", + "arpfilter", + "medium id", + "noxfrm", + "nopolicy", + "force igmp version", + "arp announce", + "arp ignore", + "promote secondaries", + "arp accept", + "arp notify", + "accept local", + "src vmark", + "proxy arp pvlan", + "route localnet", +}; + +static void print_inet_conf(FILE *fp, struct rtattr *ininfo) +{ + struct rtattr *rta, *tb[IFLA_INET_MAX+1]; + + parse_rtattr_nested(tb, IFLA_INET_MAX, ininfo); + + if ((rta = tb[IFLA_INET_CONF])) { + const __u32 *conf = (__u32 *)RTA_DATA(rta); + unsigned i; + + fprintf(fp, "\n ipv4 conf:"); + for (i = 0; i < rta->rta_len && i < ARRAY_SIZE(ipv4_devconf); i++) { + if (conf[i] != 0) + fprintf(fp, "\n %s:%u", + ipv4_devconf[i], conf[i]); + } + } +} + +static const char *ipv6_devconf[] = { + "forwarding", + "hoplimit", + "mtu6", + "accept ra", + "accept redirects", + "autoconf", + "dad transmits", + "rtr solicits", + "rtr solicit interval", + "rtr solicit delay", + "use tempaddr", + "temp valid lft", + "temp prefered lft", + "regen max retry", + "max desync factor", + "max addresses", + "force mld version", + "accept ra defrtr", + "accept ra pinfo", + "accept ra rtr pref", + "rtr probe interval", + "accept ra rt info max plen", + "proxy ndp", + "optimistic dad", + "accept source route", + "mc forwarding", + "disable ipv6", + "accept dad", + "force tllao", + "ndisc notify", +}; + +static void print_inet6_conf(FILE *fp, struct rtattr *in6info) +{ + struct rtattr *rta, *tb[IFLA_INET6_MAX+1]; + + parse_rtattr_nested(tb, IFLA_INET6_MAX, in6info); + + if ((rta = tb[IFLA_INET6_CONF])) { + const __u32 *conf = (__u32 *)RTA_DATA(rta); + unsigned i; + + fprintf(fp, "\n ipv6 conf:"); + for (i = 0; i < rta->rta_len && i < ARRAY_SIZE(ipv6_devconf); i++) { + if (conf[i] != 0) + fprintf(fp, "\n %s:%u", + ipv6_devconf[i], conf[i]); + } + } +} + +static void print_afinfo(FILE *fp, struct rtattr *afinfo) +{ + struct rtattr *tb[AF_MAX+1]; + + if (afinfo->rta_type != IFLA_AF_SPEC) { + fprintf(stderr, "BUG: rta type is %d\n", afinfo->rta_type); + return; + } + + parse_rtattr_nested(tb, AF_MAX, afinfo); + + if (tb[AF_INET] && + (!filter.family || filter.family == AF_INET)) + print_inet_conf(fp, tb[AF_INET]); + + if (tb[AF_INET6] && + (!filter.family || filter.family == AF_INET)) + print_inet6_conf(fp, tb[AF_INET6]); +} + int print_linkinfo(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { @@ -509,6 +629,9 @@ int print_linkinfo(const struct sockaddr_nl *who, print_link_stats(fp, RTA_DATA(tb[IFLA_STATS])); } + if (show_details && tb[IFLA_AF_SPEC]) + print_afinfo(fp, tb[IFLA_AF_SPEC]); + if (do_link && tb[IFLA_VFINFO_LIST] && tb[IFLA_NUM_VF]) { struct rtattr *i, *vflist = tb[IFLA_VFINFO_LIST]; int rem = RTA_PAYLOAD(vflist);