From patchwork Mon Dec 11 20:38:37 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 847217 X-Patchwork-Delegate: davem@davemloft.net 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 (2048-bit key; unprotected) header.d=quantonium-net.20150623.gappssmtp.com header.i=@quantonium-net.20150623.gappssmtp.com header.b="k1qt0Isc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3ywZZL1KyRz9t2M for ; Tue, 12 Dec 2017 07:39:38 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752068AbdLKUjf (ORCPT ); Mon, 11 Dec 2017 15:39:35 -0500 Received: from mail-pf0-f196.google.com ([209.85.192.196]:40185 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752572AbdLKUjW (ORCPT ); Mon, 11 Dec 2017 15:39:22 -0500 Received: by mail-pf0-f196.google.com with SMTP id v26so12434419pfl.7 for ; Mon, 11 Dec 2017 12:39:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quantonium-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DUAtsytQJxmhKDnbrsuQsKyhFpHcBUbdTzANyJConOQ=; b=k1qt0IscE6Ozb5xCyvozGYRYD7miEMnjRflhuEKJqyNN1zNl34U/1PnXSN0VK4XHii fsyxr9IqwtimDgQB1HOf+F3TygGWABWYTKMxUcrQNLCFZ0/xRo8tLnqnubmJHmDVSmne Mdex0Gpc+W7qQ8hnJrwxkXdZ8iGUAMexBDS+sYS8DhqCRzq20iSmwTha84PZRCNwIuro oGpYE3hHz9XfVv8OQS3Nf61guQeG07afbG1oQGP10Z/ZqgTqYN7GS8mqSC1h/oPNClNx ns2+XW2jPECN7QViNroNcTW2rdvRmRzSid4f6VJdqNKq4lrkzhs5q+EsJfNSeYob18Gh xv7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DUAtsytQJxmhKDnbrsuQsKyhFpHcBUbdTzANyJConOQ=; b=gWS1koAD4Zx6szmVKFqDger7n6SQPvDjuSaz7okxp7TTVU8rKGdHceyRJ482rb1VtO UiCci8YmuF6aEP0Jo/HKhzukzDfyBmdjjk0B4hAiWvNH+AEPsYKyyqOmVFKX6u+q1qbo qHxF6nhpPRPDRjD8Hpg/rjAwUTjjRWMceAE42Yr3oCy9a8PMuewXHbjNCBTarnOYgAsC KMxU7Z9rJpcqnInMSSrX30K4Q0ndSgWCROO5GDX5v1ZHVtTcopyDNrIeR3ViZex9oilQ Yn5ImCyEBLlw5GdnYayW0cKuydAK4c2nY6VAJXcqk4hghAg+Rxqn3O2nOWXbJ9PFEeur tBCg== X-Gm-Message-State: AKGB3mJGVi/uOw89aUY957sSVzHrirCzRuabtTYHYZ0q3l0hGj2dwsxb bsLERMlmw8B3X+0RHBqLjuSDiCdm X-Google-Smtp-Source: ACJfBosYqheK3ZOSlYRWYchXoskM8XLIwmoEfQGaiz9EXSEjUvf08AAuOBNUSGEUga8x1IIg9iaXmg== X-Received: by 10.84.236.7 with SMTP id q7mr1489585plk.401.1513024762247; Mon, 11 Dec 2017 12:39:22 -0800 (PST) Received: from localhost.localdomain (67-207-98-108.static.wiline.com. [67.207.98.108]) by smtp.gmail.com with ESMTPSA id t6sm26426790pfl.76.2017.12.11.12.39.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 11 Dec 2017 12:39:21 -0800 (PST) From: Tom Herbert To: davem@davemloft.net Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com, rohit@quantonium.net, Tom Herbert Subject: [PATCH v3 net-next 9/9] ila: add netlink control ILA resolver Date: Mon, 11 Dec 2017 12:38:37 -0800 Message-Id: <20171211203837.2540-10-tom@quantonium.net> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171211203837.2540-1-tom@quantonium.net> References: <20171211203837.2540-1-tom@quantonium.net> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a netlink family to processe netlinkf for the ILA resolver. This calls the net resolver netlink functions. Signed-off-by: Tom Herbert --- include/uapi/linux/ila.h | 11 ++++++++ net/ipv6/ila/ila.h | 8 ++++++ net/ipv6/ila/ila_main.c | 26 ++++++++++++++++++ net/ipv6/ila/ila_resolver.c | 67 ++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 111 insertions(+), 1 deletion(-) diff --git a/include/uapi/linux/ila.h b/include/uapi/linux/ila.h index 66557265bf5b..2481dab25d57 100644 --- a/include/uapi/linux/ila.h +++ b/include/uapi/linux/ila.h @@ -19,6 +19,8 @@ enum { ILA_ATTR_CSUM_MODE, /* u8 */ ILA_ATTR_IDENT_TYPE, /* u8 */ ILA_ATTR_HOOK_TYPE, /* u8 */ + ILA_RSLV_ATTR_DST, /* IPv6 address */ + ILA_RSLV_ATTR_TIMEOUT, /* u32 */ __ILA_ATTR_MAX, }; @@ -31,6 +33,10 @@ enum { ILA_CMD_DEL, ILA_CMD_GET, ILA_CMD_FLUSH, + ILA_RSLV_CMD_ADD, + ILA_RSLV_CMD_DEL, + ILA_RSLV_CMD_GET, + ILA_RSLV_CMD_FLUSH, __ILA_CMD_MAX, }; @@ -68,10 +74,15 @@ enum { enum { ILA_NOTIFY_ATTR_UNSPEC, ILA_NOTIFY_ATTR_TIMEOUT, /* u32 */ + ILA_NOTIFY_ATTR_DST, /* Binary address */ __ILA_NOTIFY_ATTR_MAX, }; #define ILA_NOTIFY_ATTR_MAX (__ILA_NOTIFY_ATTR_MAX - 1) +/* NETLINK_GENERIC related info */ +#define ILA_RSLV_GENL_NAME "ila-rslv" +#define ILA_RSLV_GENL_VERSION 0x1 + #endif /* _UAPI_LINUX_ILA_H */ diff --git a/net/ipv6/ila/ila.h b/net/ipv6/ila/ila.h index 02a800c71796..0aa99e359a38 100644 --- a/net/ipv6/ila/ila.h +++ b/net/ipv6/ila/ila.h @@ -137,6 +137,14 @@ int ila_xlat_nl_dump_start(struct netlink_callback *cb); int ila_xlat_nl_dump_done(struct netlink_callback *cb); int ila_xlat_nl_dump(struct sk_buff *skb, struct netlink_callback *cb); +int ila_rslv_nl_cmd_add(struct sk_buff *skb, struct genl_info *info); +int ila_rslv_nl_cmd_del(struct sk_buff *skb, struct genl_info *info); +int ila_rslv_nl_cmd_get(struct sk_buff *skb, struct genl_info *info); +int ila_rslv_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info); +int ila_rslv_nl_dump_start(struct netlink_callback *cb); +int ila_rslv_nl_dump_done(struct netlink_callback *cb); +int ila_rslv_nl_dump(struct sk_buff *skb, struct netlink_callback *cb); + extern unsigned int ila_net_id; extern struct genl_family ila_nl_family; diff --git a/net/ipv6/ila/ila_main.c b/net/ipv6/ila/ila_main.c index 411d3d112157..8589d422568b 100644 --- a/net/ipv6/ila/ila_main.c +++ b/net/ipv6/ila/ila_main.c @@ -40,6 +40,32 @@ static const struct genl_ops ila_nl_ops[] = { .done = ila_xlat_nl_dump_done, .policy = ila_nl_policy, }, + { + .cmd = ILA_RSLV_CMD_ADD, + .doit = ila_rslv_nl_cmd_add, + .policy = ila_nl_policy, + .flags = GENL_ADMIN_PERM, + }, + { + .cmd = ILA_RSLV_CMD_DEL, + .doit = ila_rslv_nl_cmd_del, + .policy = ila_nl_policy, + .flags = GENL_ADMIN_PERM, + }, + { + .cmd = ILA_RSLV_CMD_FLUSH, + .doit = ila_rslv_nl_cmd_flush, + .policy = ila_nl_policy, + .flags = GENL_ADMIN_PERM, + }, + { + .cmd = ILA_RSLV_CMD_GET, + .doit = ila_rslv_nl_cmd_get, + .start = ila_rslv_nl_dump_start, + .dumpit = ila_rslv_nl_dump, + .done = ila_rslv_nl_dump_done, + .policy = ila_nl_policy, + }, }; unsigned int ila_net_id; diff --git a/net/ipv6/ila/ila_resolver.c b/net/ipv6/ila/ila_resolver.c index 2aebc0526221..3278e93bb799 100644 --- a/net/ipv6/ila/ila_resolver.c +++ b/net/ipv6/ila/ila_resolver.c @@ -209,6 +209,13 @@ static const struct lwtunnel_encap_ops ila_rslv_ops = { #define ILA_MAX_SIZE 8192 +static struct net_rslv_netlink_map ila_netlink_map = { + .dst_attr = ILA_RSLV_ATTR_DST, + .timo_attr = ILA_RSLV_ATTR_TIMEOUT, + .get_cmd = ILA_RSLV_CMD_GET, + .genl_family = &ila_nl_family, +}; + int ila_rslv_init_net(struct net *net) { struct ila_net *ilan = net_generic(net, ila_net_id); @@ -216,7 +223,7 @@ int ila_rslv_init_net(struct net *net) nrslv = net_rslv_create(sizeof(struct ila_addr), sizeof(struct ila_addr), ILA_MAX_SIZE, NULL, - NULL); + &ila_netlink_map); if (IS_ERR(nrslv)) return PTR_ERR(nrslv); @@ -234,6 +241,64 @@ void ila_rslv_exit_net(struct net *net) net_rslv_destroy(ilan->rslv.nrslv); } +/* Netlink access */ + +int ila_rslv_nl_cmd_add(struct sk_buff *skb, struct genl_info *info) +{ + struct net *net = sock_net(skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_cmd_add(ilan->rslv.nrslv, skb, info); +} + +int ila_rslv_nl_cmd_del(struct sk_buff *skb, struct genl_info *info) +{ + struct net *net = sock_net(skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_cmd_del(ilan->rslv.nrslv, skb, info); +} + +int ila_rslv_nl_cmd_get(struct sk_buff *skb, struct genl_info *info) +{ + struct net *net = sock_net(skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_cmd_get(ilan->rslv.nrslv, skb, info); +} + +int ila_rslv_nl_cmd_flush(struct sk_buff *skb, struct genl_info *info) +{ + struct net *net = sock_net(skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_cmd_flush(ilan->rslv.nrslv, skb, info); +} + +int ila_rslv_nl_dump_start(struct netlink_callback *cb) +{ + struct net *net = sock_net(cb->skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_dump_start(ilan->rslv.nrslv, cb); +} + +int ila_rslv_nl_dump_done(struct netlink_callback *cb) +{ + struct net *net = sock_net(cb->skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_dump_done(ilan->rslv.nrslv, cb); +} + +int ila_rslv_nl_dump(struct sk_buff *skb, struct netlink_callback *cb) +{ + struct net *net = sock_net(cb->skb->sk); + struct ila_net *ilan = net_generic(net, ila_net_id); + + return net_rslv_nl_dump(ilan->rslv.nrslv, skb, cb); +} + int ila_rslv_init(void) { return lwtunnel_encap_add_ops(&ila_rslv_ops, LWTUNNEL_ENCAP_ILA_NOTIFY);