From patchwork Thu Nov 15 13:49:50 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Stevens X-Patchwork-Id: 199285 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 E82462C0382 for ; Fri, 16 Nov 2012 00:52:29 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1767919Ab2KONwJ (ORCPT ); Thu, 15 Nov 2012 08:52:09 -0500 Received: from e3.ny.us.ibm.com ([32.97.182.143]:48518 "EHLO e3.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1767845Ab2KONwH (ORCPT ); Thu, 15 Nov 2012 08:52:07 -0500 Received: from /spool/local by e3.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 15 Nov 2012 08:52:06 -0500 Received: from d01dlp03.pok.ibm.com (9.56.250.168) by e3.ny.us.ibm.com (192.168.1.103) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 15 Nov 2012 08:52:04 -0500 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by d01dlp03.pok.ibm.com (Postfix) with ESMTP id 3A66CC90044 for ; Thu, 15 Nov 2012 08:52:04 -0500 (EST) Received: from d01av03.pok.ibm.com (d01av03.pok.ibm.com [9.56.224.217]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id qAFDq4xK285546 for ; Thu, 15 Nov 2012 08:52:04 -0500 Received: from d01av03.pok.ibm.com (loopback [127.0.0.1]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id qAFDq3xS030881 for ; Thu, 15 Nov 2012 11:52:03 -0200 Received: from lab1.dls (sig-9-77-156-253.mts.ibm.com [9.77.156.253]) by d01av03.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id qAFDq2d8030706 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 15 Nov 2012 11:52:03 -0200 Received: from lab1.dls (lab1.dls [127.0.0.1]) by lab1.dls (8.14.5/8.14.5) with ESMTP id qAFDnoh6023176; Thu, 15 Nov 2012 08:51:10 -0500 Message-Id: <201211151351.qAFDnoh6023176@lab1.dls> To: David Miller , Stephen Hemminger cc: netdev@vger.kernel.org Subject: [PATCHv2 iproute2] add DOVE extensions for iproute2 Date: Thu, 15 Nov 2012 08:49:50 -0500 From: David L Stevens X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12111513-8974-0000-0000-0000112F4352 X-IBM-ISS-SpamDetectors: X-IBM-ISS-DetailInfo: BY=3.00000295; HX=3.00000198; KW=3.00000007; PH=3.00000001; SC=3.00000008; SDB=6.00191530; UDB=6.00043366; UTC=2012-11-15 13:52:06 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch adds a new flag to iproute2 for vxlan devices to enable DOVE features. It also adds support for L2 and L3 switch lookup miss netlink messages to "ip monitor". Changes since v1: - split "dove" flag into separate feature flags: - "proxy" for ARP reduction - "rsc" for route short circuiting - "l2miss" for L2 switch miss notifications - "l3miss" for L3 switch miss notifications Signed-off-by: David L Stevens --- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/include/linux/if_link.h b/include/linux/if_link.h index 012d95a..a163702 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h @@ -283,6 +283,10 @@ enum { IFLA_VXLAN_AGEING, IFLA_VXLAN_LIMIT, IFLA_VXLAN_PORT_RANGE, + IFLA_VXLAN_PROXY, + IFLA_VXLAN_RSC, + IFLA_VXLAN_L2MISS, + IFLA_VXLAN_L3MISS, __IFLA_VXLAN_MAX }; #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) diff --git a/ip/iplink_vxlan.c b/ip/iplink_vxlan.c index ba5c4ab..f2e6bef 100644 --- a/ip/iplink_vxlan.c +++ b/ip/iplink_vxlan.c @@ -26,6 +26,8 @@ static void explain(void) fprintf(stderr, "Usage: ... vxlan id VNI [ group ADDR ] [ local ADDR ]\n"); fprintf(stderr, " [ ttl TTL ] [ tos TOS ] [ dev PHYS_DEV ]\n"); fprintf(stderr, " [ port MIN MAX ] [ [no]learning ]\n"); + fprintf(stderr, " [ [no]proxy ] [ [no]rsc ]\n"); + fprintf(stderr, " [ [no]l2miss ] [ [no]l3miss ]\n"); fprintf(stderr, "\n"); fprintf(stderr, "Where: VNI := 0-16777215\n"); fprintf(stderr, " ADDR := { IP_ADDRESS | any }\n"); @@ -44,6 +46,10 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv, __u8 tos = 0; __u8 ttl = 0; __u8 learning = 1; + __u8 proxy = 0; + __u8 rsc = 0; + __u8 l2miss = 0; + __u8 l3miss = 0; __u8 noage = 0; __u32 age = 0; __u32 maxaddr = 0; @@ -123,6 +129,22 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv, learning = 0; } else if (!matches(*argv, "learning")) { learning = 1; + } else if (!matches(*argv, "noproxy")) { + proxy = 0; + } else if (!matches(*argv, "proxy")) { + proxy = 1; + } else if (!matches(*argv, "norsc")) { + rsc = 0; + } else if (!matches(*argv, "rsc")) { + rsc = 1; + } else if (!matches(*argv, "nol2miss")) { + l2miss = 0; + } else if (!matches(*argv, "l2miss")) { + l2miss = 1; + } else if (!matches(*argv, "nol3miss")) { + l3miss = 0; + } else if (!matches(*argv, "l3miss")) { + l3miss = 1; } else if (matches(*argv, "help") == 0) { explain(); return -1; @@ -148,6 +170,10 @@ static int vxlan_parse_opt(struct link_util *lu, int argc, char **argv, addattr8(n, 1024, IFLA_VXLAN_TTL, ttl); addattr8(n, 1024, IFLA_VXLAN_TOS, tos); addattr8(n, 1024, IFLA_VXLAN_LEARNING, learning); + addattr8(n, 1024, IFLA_VXLAN_PROXY, proxy); + addattr8(n, 1024, IFLA_VXLAN_RSC, rsc); + addattr8(n, 1024, IFLA_VXLAN_L2MISS, l2miss); + addattr8(n, 1024, IFLA_VXLAN_L3MISS, l3miss); if (noage) addattr32(n, 1024, IFLA_VXLAN_AGEING, 0); else if (age) @@ -213,6 +239,18 @@ static void vxlan_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) if (tb[IFLA_VXLAN_LEARNING] && !rta_getattr_u8(tb[IFLA_VXLAN_LEARNING])) fputs("nolearning ", f); + + if (tb[IFLA_VXLAN_PROXY] && rta_getattr_u8(tb[IFLA_VXLAN_PROXY])) + fputs("proxy ", f); + + if (tb[IFLA_VXLAN_RSC] && rta_getattr_u8(tb[IFLA_VXLAN_RSC])) + fputs("rsc ", f); + + if (tb[IFLA_VXLAN_L2MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L2MISS])) + fputs("l2miss ", f); + + if (tb[IFLA_VXLAN_L3MISS] && rta_getattr_u8(tb[IFLA_VXLAN_L3MISS])) + fputs("l3miss ", f); if (tb[IFLA_VXLAN_TOS] && (tos = rta_getattr_u8(tb[IFLA_VXLAN_TOS]))) { diff --git a/ip/ipmonitor.c b/ip/ipmonitor.c index 4b1d469..7a7cc88 100644 --- a/ip/ipmonitor.c +++ b/ip/ipmonitor.c @@ -67,7 +67,8 @@ int accept_msg(const struct sockaddr_nl *who, print_addrlabel(who, n, arg); return 0; } - if (n->nlmsg_type == RTM_NEWNEIGH || n->nlmsg_type == RTM_DELNEIGH) { + if (n->nlmsg_type == RTM_NEWNEIGH || n->nlmsg_type == RTM_DELNEIGH || + n->nlmsg_type == RTM_GETNEIGH) { if (prefix_banner) fprintf(fp, "[NEIGH]"); print_neigh(who, n, arg); diff --git a/ip/ipneigh.c b/ip/ipneigh.c index 56e56b2..1b7600b 100644 --- a/ip/ipneigh.c +++ b/ip/ipneigh.c @@ -189,7 +189,8 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) struct rtattr * tb[NDA_MAX+1]; char abuf[256]; - if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH) { + if (n->nlmsg_type != RTM_NEWNEIGH && n->nlmsg_type != RTM_DELNEIGH && + n->nlmsg_type != RTM_GETNEIGH) { fprintf(stderr, "Not RTM_NEWNEIGH: %08x %08x %08x\n", n->nlmsg_len, n->nlmsg_type, n->nlmsg_flags); @@ -251,6 +252,8 @@ int print_neigh(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (n->nlmsg_type == RTM_DELNEIGH) fprintf(fp, "delete "); + else if (n->nlmsg_type == RTM_GETNEIGH) + fprintf(fp, "miss "); if (tb[NDA_DST]) { fprintf(fp, "%s ", format_host(r->ndm_family,