From patchwork Sat Feb 17 12:47:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Sharp X-Patchwork-Id: 874745 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="fkRH8e34"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zk8ty4CtMz9s0x for ; Sat, 17 Feb 2018 23:48:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751056AbeBQMsI (ORCPT ); Sat, 17 Feb 2018 07:48:08 -0500 Received: from mail-qt0-f195.google.com ([209.85.216.195]:43868 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751021AbeBQMsG (ORCPT ); Sat, 17 Feb 2018 07:48:06 -0500 Received: by mail-qt0-f195.google.com with SMTP id d26so7033386qtk.10 for ; Sat, 17 Feb 2018 04:48:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:subject:date:message-id; bh=LVqSrfdDOc+f4IG7kttwnDspa/J24T8z7t8ku7whPAY=; b=fkRH8e34EoahnJD2Yi2wGQxKQpxw9kGJlm5tNOIIg91u2/MEXFBQoCs3f/jRNpWcC8 HtAtn3LSxOA8lion01VcuNEdj/TYivlTpPzYegr24mgrrMglRNkvO5U6MgZsHND4HStu MNYUifuRAR9iZfN+VRJlpqw3ySmpl/Mv6U7JM= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=LVqSrfdDOc+f4IG7kttwnDspa/J24T8z7t8ku7whPAY=; b=cpF1WxNXHGcYsgJ6l6LaH3QdJ/UoS5YtAd2rDqayvb1plS9RNK9Yo+4F6BDzOPzrhA vSE+wVXEwwvM8Bp76CT8MLQjd6KMBhl2sAXvj7Y96/qp5c68O+zay4ivCgIfp4NXHekr kdVg02L12phrpxztyFWa+hXrY5urngMxh+ZKwEVGWWnWl9wh8QlJCi86SToQ4OQ136gJ m+3Z52bbQ7qINo1peWQh1EOtC5Oo9iKKlV661Q3EnLWQvWv8Y7Md99qZLzR2asl91sNV IrOz/El4beaZBkjMdwUj/QKnt05sq3J1AadNZ2c0FA9ETzWOIpvdqTXAJ7riKVnPw+Cc CNLg== X-Gm-Message-State: APf1xPBFeOckej0mWUHecvQakRPolDPGNsncryyGQARSdm3BloL7gSqH xZ/4KuUkXMFZRNz3HWpz16UDlWUj X-Google-Smtp-Source: AH8x226aI9+pnQMl5HiMSeHsvLzxbSpuiWuVZ3HNeqtMzPhOS1n1sqqg5DkX8uDyh0rhecaVIONzkg== X-Received: by 10.200.16.11 with SMTP id z11mr14440300qti.292.1518871685649; Sat, 17 Feb 2018 04:48:05 -0800 (PST) Received: from robot.nc.rr.com (cpe-2606-A000-111D-803E-4980-482B-47BB-96B9.dyn6.twc.com. [2606:a000:111d:803e:4980:482b:47bb:96b9]) by smtp.googlemail.com with ESMTPSA id v1sm1450827qtg.43.2018.02.17.04.48.03 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 17 Feb 2018 04:48:04 -0800 (PST) From: Donald Sharp To: netdev@vger.kernel.org Subject: [PATCH 1/3] ip: Use the `struct fib_rule_hdr` for rules Date: Sat, 17 Feb 2018 07:47:51 -0500 Message-Id: <20180217124753.2879-2-sharpd@cumulusnetworks.com> X-Mailer: git-send-email 2.14.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org The iprule.c code was using `struct rtmsg` as the data type to pass into the kernel for the netlink message. While 'struct rtmsg' and `struct fib_rule_hdr` are the same size and mostly the same, we should use the correct data structure. This commit translates the data structures to have iprule.c use the correct one. Additionally copy over the modified fib_rules.h file Signed-off-by: Donald Sharp --- include/linux/fib_rules.h | 2 +- ip/iprule.c | 105 ++++++++++++++++++++++++---------------------- 2 files changed, 56 insertions(+), 51 deletions(-) diff --git a/include/linux/fib_rules.h b/include/linux/fib_rules.h index bbf02a63..21f1fbf3 100644 --- a/include/linux/fib_rules.h +++ b/include/linux/fib_rules.h @@ -22,8 +22,8 @@ struct fib_rule_hdr { __u8 tos; __u8 table; + __u8 proto; /* reserved */ __u8 res1; /* reserved */ - __u8 res2; /* reserved */ __u8 action; __u32 flags; diff --git a/ip/iprule.c b/ip/iprule.c index 854a3d8e..82e22fee 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -50,7 +50,7 @@ static void usage(void) int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) { FILE *fp = (FILE*)arg; - struct rtmsg *r = NLMSG_DATA(n); + struct fib_rule_hdr *frh = NLMSG_DATA(n); int len = n->nlmsg_len; int host_len = -1; __u32 table; @@ -61,13 +61,13 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (n->nlmsg_type != RTM_NEWRULE && n->nlmsg_type != RTM_DELRULE) return 0; - len -= NLMSG_LENGTH(sizeof(*r)); + len -= NLMSG_LENGTH(sizeof(*frh)); if (len < 0) return -1; - parse_rtattr(tb, FRA_MAX, RTM_RTA(r), len); + parse_rtattr(tb, FRA_MAX, RTM_RTA(frh), len); - host_len = af_bit_len(r->rtm_family); + host_len = af_bit_len(frh->family); if (n->nlmsg_type == RTM_DELRULE) fprintf(fp, "Deleted "); @@ -77,51 +77,51 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) else fprintf(fp, "0:\t"); - if (r->rtm_flags & FIB_RULE_INVERT) + if (frh->flags & FIB_RULE_INVERT) fprintf(fp, "not "); if (tb[FRA_SRC]) { - if (r->rtm_src_len != host_len) { - fprintf(fp, "from %s/%u ", rt_addr_n2a(r->rtm_family, + if (frh->src_len != host_len) { + fprintf(fp, "from %s/%u ", rt_addr_n2a(frh->family, RTA_PAYLOAD(tb[FRA_SRC]), RTA_DATA(tb[FRA_SRC]), abuf, sizeof(abuf)), - r->rtm_src_len + frh->src_len ); } else { - fprintf(fp, "from %s ", format_host(r->rtm_family, + fprintf(fp, "from %s ", format_host(frh->family, RTA_PAYLOAD(tb[FRA_SRC]), RTA_DATA(tb[FRA_SRC]), abuf, sizeof(abuf)) ); } - } else if (r->rtm_src_len) { - fprintf(fp, "from 0/%d ", r->rtm_src_len); + } else if (frh->src_len) { + fprintf(fp, "from 0/%d ", frh->src_len); } else { fprintf(fp, "from all "); } if (tb[FRA_DST]) { - if (r->rtm_dst_len != host_len) { - fprintf(fp, "to %s/%u ", rt_addr_n2a(r->rtm_family, + if (frh->dst_len != host_len) { + fprintf(fp, "to %s/%u ", rt_addr_n2a(frh->family, RTA_PAYLOAD(tb[FRA_DST]), RTA_DATA(tb[FRA_DST]), abuf, sizeof(abuf)), - r->rtm_dst_len + frh->dst_len ); } else { - fprintf(fp, "to %s ", format_host(r->rtm_family, + fprintf(fp, "to %s ", format_host(frh->family, RTA_PAYLOAD(tb[FRA_DST]), RTA_DATA(tb[FRA_DST]), abuf, sizeof(abuf))); } - } else if (r->rtm_dst_len) { - fprintf(fp, "to 0/%d ", r->rtm_dst_len); + } else if (frh->dst_len) { + fprintf(fp, "to 0/%d ", frh->dst_len); } - if (r->rtm_tos) { + if (frh->tos) { SPRINT_BUF(b1); - fprintf(fp, "tos %s ", rtnl_dsfield_n2a(r->rtm_tos, b1, sizeof(b1))); + fprintf(fp, "tos %s ", rtnl_dsfield_n2a(frh->tos, b1, sizeof(b1))); } if (tb[FRA_FWMARK] || tb[FRA_FWMASK]) { @@ -139,13 +139,13 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) if (tb[FRA_IFNAME]) { fprintf(fp, "iif %s ", rta_getattr_str(tb[FRA_IFNAME])); - if (r->rtm_flags & FIB_RULE_IIF_DETACHED) + if (frh->flags & FIB_RULE_IIF_DETACHED) fprintf(fp, "[detached] "); } if (tb[FRA_OIFNAME]) { fprintf(fp, "oif %s ", rta_getattr_str(tb[FRA_OIFNAME])); - if (r->rtm_flags & FIB_RULE_OIF_DETACHED) + if (frh->flags & FIB_RULE_OIF_DETACHED) fprintf(fp, "[detached] "); } @@ -154,7 +154,13 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) fprintf(fp, "lookup [l3mdev-table] "); } - table = rtm_get_table(r, tb); + /* + * struct fib_rule_hdr and struct rtmsg + * were intentionally the same. Since + * the table is the rtm_table, just call + * it. + */ + table = rtm_get_table((struct rtmsg *)frh, tb); if (table) { fprintf(fp, "lookup %s ", rtnl_rttable_n2a(table, b1, sizeof(b1))); @@ -185,27 +191,27 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) rtnl_rtrealm_n2a(to, b1, sizeof(b1))); } - if (r->rtm_type == RTN_NAT) { + if (frh->action == RTN_NAT) { if (tb[RTA_GATEWAY]) { fprintf(fp, "map-to %s ", - format_host(r->rtm_family, + format_host(frh->family, RTA_PAYLOAD(tb[RTA_GATEWAY]), RTA_DATA(tb[RTA_GATEWAY]), abuf, sizeof(abuf))); } else fprintf(fp, "masquerade"); - } else if (r->rtm_type == FR_ACT_GOTO) { + } else if (frh->action == FR_ACT_GOTO) { fprintf(fp, "goto "); if (tb[FRA_GOTO]) fprintf(fp, "%u", rta_getattr_u32(tb[FRA_GOTO])); else fprintf(fp, "none"); - if (r->rtm_flags & FIB_RULE_UNRESOLVED) + if (frh->flags & FIB_RULE_UNRESOLVED) fprintf(fp, " [unresolved]"); - } else if (r->rtm_type == FR_ACT_NOP) + } else if (frh->action == FR_ACT_NOP) fprintf(fp, "nop"); - else if (r->rtm_type != RTN_UNICAST) - fprintf(fp, "%s", rtnl_rtntype_n2a(r->rtm_type, b1, sizeof(b1))); + else if (frh->action != RTN_UNICAST) + fprintf(fp, "%s", rtnl_rtntype_n2a(frh->action, b1, sizeof(b1))); fprintf(fp, "\n"); fflush(fp); @@ -245,7 +251,7 @@ static int iprule_modify(int cmd, int argc, char **argv) __u32 tid = 0; struct { struct nlmsghdr n; - struct rtmsg r; + struct fib_rule_hdr frh; char buf[1024]; } req; @@ -254,32 +260,31 @@ static int iprule_modify(int cmd, int argc, char **argv) req.n.nlmsg_type = cmd; req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg)); req.n.nlmsg_flags = NLM_F_REQUEST; - req.r.rtm_family = preferred_family; - req.r.rtm_protocol = RTPROT_BOOT; - req.r.rtm_scope = RT_SCOPE_UNIVERSE; - req.r.rtm_table = 0; - req.r.rtm_type = RTN_UNSPEC; - req.r.rtm_flags = 0; + req.frh.family = preferred_family; + req.frh.proto = RTPROT_BOOT; + req.frh.table = 0; + req.frh.action = RTN_UNSPEC; + req.frh.flags = 0; if (cmd == RTM_NEWRULE) { req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL; - req.r.rtm_type = RTN_UNICAST; + req.frh.action = RTN_UNICAST; } while (argc > 0) { if (strcmp(*argv, "not") == 0) { - req.r.rtm_flags |= FIB_RULE_INVERT; + req.frh.flags |= FIB_RULE_INVERT; } else if (strcmp(*argv, "from") == 0) { inet_prefix dst; NEXT_ARG(); - get_prefix(&dst, *argv, req.r.rtm_family); - req.r.rtm_src_len = dst.bitlen; + get_prefix(&dst, *argv, req.frh.family); + req.frh.src_len = dst.bitlen; addattr_l(&req.n, sizeof(req), FRA_SRC, &dst.data, dst.bytelen); } else if (strcmp(*argv, "to") == 0) { inet_prefix dst; NEXT_ARG(); - get_prefix(&dst, *argv, req.r.rtm_family); - req.r.rtm_dst_len = dst.bitlen; + get_prefix(&dst, *argv, req.frh.family); + req.frh.dst_len = dst.bitlen; addattr_l(&req.n, sizeof(req), FRA_DST, &dst.data, dst.bytelen); } else if (matches(*argv, "preference") == 0 || matches(*argv, "order") == 0 || @@ -295,7 +300,7 @@ static int iprule_modify(int cmd, int argc, char **argv) NEXT_ARG(); if (rtnl_dsfield_a2n(&tos, *argv)) invarg("TOS value is invalid\n", *argv); - req.r.rtm_tos = tos; + req.frh.tos = tos; } else if (strcmp(*argv, "fwmark") == 0) { char *slash; __u32 fwmark, fwmask; @@ -322,9 +327,9 @@ static int iprule_modify(int cmd, int argc, char **argv) if (rtnl_rttable_a2n(&tid, *argv)) invarg("invalid table ID\n", *argv); if (tid < 256) - req.r.rtm_table = tid; + req.frh.table = tid; else { - req.r.rtm_table = RT_TABLE_UNSPEC; + req.frh.table = RT_TABLE_UNSPEC; addattr32(&req.n, sizeof(req), FRA_TABLE, tid); } table_ok = 1; @@ -358,7 +363,7 @@ static int iprule_modify(int cmd, int argc, char **argv) NEXT_ARG(); fprintf(stderr, "Warning: route NAT is deprecated\n"); addattr32(&req.n, sizeof(req), RTA_GATEWAY, get_addr32(*argv)); - req.r.rtm_type = RTN_NAT; + req.frh.action = RTN_NAT; } else { int type; @@ -378,7 +383,7 @@ static int iprule_modify(int cmd, int argc, char **argv) type = FR_ACT_NOP; else if (rtnl_rtntype_a2n(&type, *argv)) invarg("Failed to parse rule type", *argv); - req.r.rtm_type = type; + req.frh.action = type; table_ok = 1; } argc--; @@ -391,11 +396,11 @@ static int iprule_modify(int cmd, int argc, char **argv) return -EINVAL; } - if (req.r.rtm_family == AF_UNSPEC) - req.r.rtm_family = AF_INET; + if (req.frh.family == AF_UNSPEC) + req.frh.family = AF_INET; if (!table_ok && cmd == RTM_NEWRULE) - req.r.rtm_table = RT_TABLE_MAIN; + req.frh.table = RT_TABLE_MAIN; if (rtnl_talk(&rth, &req.n, NULL, 0) < 0) return -2; From patchwork Sat Feb 17 12:47:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Sharp X-Patchwork-Id: 874746 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="SKaCp1Vb"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zk8v146vCz9sWG for ; Sat, 17 Feb 2018 23:48:13 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751107AbeBQMsM (ORCPT ); Sat, 17 Feb 2018 07:48:12 -0500 Received: from mail-qt0-f195.google.com ([209.85.216.195]:35941 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751033AbeBQMsK (ORCPT ); Sat, 17 Feb 2018 07:48:10 -0500 Received: by mail-qt0-f195.google.com with SMTP id q18so7070025qtl.3 for ; Sat, 17 Feb 2018 04:48:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:subject:date:message-id; bh=gPe/zSQO6IjSfaEABoTVeVmr5/prnMU5RRp5LtmbFdE=; b=SKaCp1VbMfLc426wVKoIMx12K1tndSs3+k1n5g1A8NYuM7wlohxmuhAI/tdQSurM+q 2OAGC15MbRTNgbdZY4+iT20C5r7eNNzwJiWEPpTTNkxBGRdKKXqAyrMYR+Rz1qc9HKQ9 vSLp8apZgBmYomp+VvG1sBMNPmZXoaeWTcO1A= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=gPe/zSQO6IjSfaEABoTVeVmr5/prnMU5RRp5LtmbFdE=; b=AdPvAq3dJFD48IU1BpNcZyYbedsK/WNOxnV7H4Lgk/dqvf0ZnrhiQG6Ss6qucxFRZu hfNHRV6qtjuze1eAQoL+KhFZRllBKLGMQkRDYzUNble2+sO+3A9HsRiDMGdlBJPsOhu2 4YIQfHR0+ruWgMLvxYI8LCO2wCTssU5yOSIpgajGjT7g3ouP5jTcSuUDEanyP+m3ic4r v9bq0gz7Q5b+zBBN55LugR4EJdb4TW9Y7JS8WkMoX4a6QvYDmJT3jdxROJjhbYxLBJaA +wrux/mmHoZX8ZweOhMLX2rtlwfgnWDmni0hUrBH4LeLVZC8viGcISxlIpM0nl6x3Kct SmMQ== X-Gm-Message-State: APf1xPD+DthFKLWKacnemQh7keqadbRnHYHz4CGmByrHU6nHgjEZCvoW Mma0pDXHd7wRWYMXbmVfCr9K3g5h X-Google-Smtp-Source: AH8x227EHymNAMBPYyz+3gxjJjgye+mrZnFc2cKuvhZDBLhUVeJOLa4CpV9ft/4eJnrbbgZZuW4PcQ== X-Received: by 10.200.8.102 with SMTP id x35mr14377455qth.240.1518871689081; Sat, 17 Feb 2018 04:48:09 -0800 (PST) Received: from robot.nc.rr.com (cpe-2606-A000-111D-803E-4980-482B-47BB-96B9.dyn6.twc.com. [2606:a000:111d:803e:4980:482b:47bb:96b9]) by smtp.googlemail.com with ESMTPSA id v1sm1450827qtg.43.2018.02.17.04.48.06 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 17 Feb 2018 04:48:08 -0800 (PST) From: Donald Sharp To: netdev@vger.kernel.org Subject: [PATCH 2/3] ip: Display ip rule protocol used Date: Sat, 17 Feb 2018 07:47:52 -0500 Message-Id: <20180217124753.2879-3-sharpd@cumulusnetworks.com> X-Mailer: git-send-email 2.14.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Newer kernels are now accepting a protocol from the installing program for who installed the rule. This change allows us to see this change if it is being specified by the installing program. Signed-off-by: Donald Sharp --- ip/iprule.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ip/iprule.c b/ip/iprule.c index 82e22fee..5703d6e4 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -213,6 +213,9 @@ int print_rule(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) else if (frh->action != RTN_UNICAST) fprintf(fp, "%s", rtnl_rtntype_n2a(frh->action, b1, sizeof(b1))); + if (frh->proto != RTPROT_UNSPEC) + fprintf(fp, " proto %s ", + rtnl_rtprot_n2a(frh->proto, b1, sizeof(b1))); fprintf(fp, "\n"); fflush(fp); return 0; From patchwork Sat Feb 17 12:47:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donald Sharp X-Patchwork-Id: 874747 X-Patchwork-Delegate: dsahern@gmail.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="K0bIec6O"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zk8v64jjwz9s0v for ; Sat, 17 Feb 2018 23:48:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751150AbeBQMsQ (ORCPT ); Sat, 17 Feb 2018 07:48:16 -0500 Received: from mail-qt0-f196.google.com ([209.85.216.196]:35457 "EHLO mail-qt0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751090AbeBQMsO (ORCPT ); Sat, 17 Feb 2018 07:48:14 -0500 Received: by mail-qt0-f196.google.com with SMTP id g14so7070399qti.2 for ; Sat, 17 Feb 2018 04:48:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:subject:date:message-id; bh=Vikj4y3wVQoDvAq12sea68Aq6QuwL8OeouN2weqar4I=; b=K0bIec6OvNFVGIQTV5sC2ZF2/Wp9Gbphq5mO8lfGR3Ilemtp6RxTi/Qynq5x9nBuGG sAKgsSB3WL1vm9ItTBCCOkaW/rSDYQrYq9862gXVmW8BsPKm3hiYLV/QGfjOLec1evzP PoB+xk2mdRxWXGBHJIVt2y0uWrdmW2PDs+uv8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=Vikj4y3wVQoDvAq12sea68Aq6QuwL8OeouN2weqar4I=; b=eJDrqC7hAaBFdGZCC4tRUl38YEbu5JY/edrqDKkmzvtBvVj6YvlK0s3K4++kiaMKO6 moiLfK12KBGP4bLIN7ZCbjc145COxmeLOCnV/n1IcyPcQVz3Pxd+6I3S2MxqHJxzViDq cTj+N8Uz4KFnpBihieQrAWgnxjEfQEe9uwZmlmeR7cA1SCf62CxdatPh6211dL/BO4JG ibAnwadbz6+r0Kg3Xf3+jTpPrzsrh7koT7pwSbhTs4d7jHo7qLtPfbhtn446rvauWB2a oM2VmC4SzQAh1jdbFNxFGZvtp0V3hNwbU8XtrCVaRZaUK/yOFpzOrqnCkcvhqTEDAzUR 9tGA== X-Gm-Message-State: APf1xPBg3KisknwP15ymwIoq329FvjkwzPObkb+0XFDXjeAW1ej1Yncf zCUGR/yhi51WpFI4hIf9FjcsHkAa X-Google-Smtp-Source: AH8x225pY6yquaG+TZ3r0I7nR87QT2GZJIURHPDQeUFT/8JGTEyMHJI34psnhjSpYLFuhNEUK/rllQ== X-Received: by 10.237.58.133 with SMTP id o5mr14731370qte.307.1518871693644; Sat, 17 Feb 2018 04:48:13 -0800 (PST) Received: from robot.nc.rr.com (cpe-2606-A000-111D-803E-4980-482B-47BB-96B9.dyn6.twc.com. [2606:a000:111d:803e:4980:482b:47bb:96b9]) by smtp.googlemail.com with ESMTPSA id v1sm1450827qtg.43.2018.02.17.04.48.12 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 17 Feb 2018 04:48:12 -0800 (PST) From: Donald Sharp To: netdev@vger.kernel.org Subject: [PATCH 3/3] ip: Allow rules to accept a specified protocol Date: Sat, 17 Feb 2018 07:47:53 -0500 Message-Id: <20180217124753.2879-4-sharpd@cumulusnetworks.com> X-Mailer: git-send-email 2.14.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Allow the specification of a protocol when the user adds/modifies/deletes a rule. Signed-off-by: Donald Sharp --- ip/iprule.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ip/iprule.c b/ip/iprule.c index 5703d6e4..8fc6ac48 100644 --- a/ip/iprule.c +++ b/ip/iprule.c @@ -324,6 +324,12 @@ static int iprule_modify(int cmd, int argc, char **argv) if (get_rt_realms(&realm, *argv)) invarg("invalid realms\n", *argv); addattr32(&req.n, sizeof(req), FRA_FLOW, realm); + } else if (matches(*argv, "protocol") == 0) { + __u32 proto; + NEXT_ARG(); + if (rtnl_rtprot_a2n(&proto, *argv)) + invarg("\"protocol\" value is invalid\n", *argv); + req.frh.proto = proto; } else if (matches(*argv, "table") == 0 || strcmp(*argv, "lookup") == 0) { NEXT_ARG();