[qca-nss-clients] Add Multicast support for pppoe netlink module
Change-Id: Ifdb34f2b1092a9fc5bc8ce88cdceb9bc28e5a704
Signed-off-by: Wayne Tan <wtan@codeaurora.org>
diff --git a/netlink/Makefile b/netlink/Makefile
index d8f4636..69affb7 100644
--- a/netlink/Makefile
+++ b/netlink/Makefile
@@ -20,6 +20,7 @@
ccflags-y += -DCONFIG_NSS_NLWIFILI=1
ccflags-y += -DCONFIG_NSS_NLLSO_RX=1
ccflags-y += -DCONFIG_NSS_NLMAP_T=1
+ccflags-y += -DCONFIG_NSS_NLPPPOE=1
qca-nss-netlink-objs := nss_nl.o
qca-nss-netlink-objs += nss_nlgre_redir_family.o
@@ -42,6 +43,7 @@
qca-nss-netlink-objs += nss_nlwifili.o
qca-nss-netlink-objs += nss_nllso_rx.o
qca-nss-netlink-objs += nss_nlmap_t.o
+qca-nss-netlink-objs += nss_nlpppoe.o
CAPWAP_ENABLED:=CONFIG_PACKAGE_kmod-qca-nss-drv-capwapmgr=y
CAPWAP_CONFIG:=$(shell grep $(CAPWAP_ENABLED) $(TOPDIR)/.config)
diff --git a/netlink/include/nss_nlcmn_if.h b/netlink/include/nss_nlcmn_if.h
index 3897b62..f923eb9 100644
--- a/netlink/include/nss_nlcmn_if.h
+++ b/netlink/include/nss_nlcmn_if.h
@@ -54,6 +54,7 @@
NSS_NLCMN_SUBSYS_LSO_RX,
NSS_NLCMN_SUBSYS_MAP_T,
NSS_NLCMN_SUBSYS_N2H,
+ NSS_NLCMN_SUBSYS_PPPOE,
NSS_NLCMN_SUBSYS_WIFILI,
NSS_NLCMN_SUBSYS_MAX
};
diff --git a/netlink/include/nss_nlpppoe_if.h b/netlink/include/nss_nlpppoe_if.h
new file mode 100644
index 0000000..73f6d46
--- /dev/null
+++ b/netlink/include/nss_nlpppoe_if.h
@@ -0,0 +1,32 @@
+/*
+ **************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ **************************************************************************
+ */
+
+/*
+ * @file nss_nlpppoe_if.h
+ * NSS Netlink pppoe headers
+ */
+#ifndef __NSS_NLPPPOE_IF_H
+#define __NSS_NLPPPOE_IF_H
+
+/**
+ * pppoe forwarding Family
+ */
+#define NSS_NLPPPOE_FAMILY "nss_nlpppoe"
+#define NSS_NLPPPOE_MCAST_GRP "nss_nlpppoe_mc"
+
+#endif /* __NSS_NLPPPOE_IF_H */
diff --git a/netlink/nss_nl.c b/netlink/nss_nl.c
index 83f350d..a751008 100644
--- a/netlink/nss_nl.c
+++ b/netlink/nss_nl.c
@@ -72,6 +72,8 @@
#include "nss_nllso_rx_if.h"
#include "nss_nlmap_t.h"
#include "nss_nlmap_t_if.h"
+#include "nss_nlpppoe.h"
+#include "nss_nlpppoe_if.h"
#if defined (CONFIG_NSS_NLCRYPTO)
#include "nss_nlcrypto_if.h"
#else
@@ -280,6 +282,15 @@
.exit = NSS_NLMAP_T_EXIT, /* exit */
.valid = CONFIG_NSS_NLMAP_T /* 1 or 0 */
},
+ {
+ /*
+ * NSS_NLPPPOE
+ */
+ .name = NSS_NLPPPOE_FAMILY, /* pppoe */
+ .entry = NSS_NLPPPOE_INIT, /* init */
+ .exit = NSS_NLPPPOE_EXIT, /* exit */
+ .valid = CONFIG_NSS_NLPPPOE /* 1 or 0 */
+ },
};
#define NSS_NL_FAMILY_HANDLER_SZ ARRAY_SIZE(family_handlers)
diff --git a/netlink/nss_nlpppoe.c b/netlink/nss_nlpppoe.c
new file mode 100644
index 0000000..fd36385
--- /dev/null
+++ b/netlink/nss_nlpppoe.c
@@ -0,0 +1,173 @@
+/*
+ **************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ **************************************************************************
+ */
+
+/*
+ * nss_nlpppoe.c
+ * NSS Netlink pppoe Handler
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#include <linux/netlink.h>
+#include <linux/version.h>
+#include <linux/vmalloc.h>
+#include <linux/notifier.h>
+
+#include <net/genetlink.h>
+#include <net/sock.h>
+
+#include <nss_api_if.h>
+#include <nss_cmn.h>
+#include <nss_nl_if.h>
+#include "nss_nl.h"
+#include "nss_nlcmn_if.h"
+#include "nss_nlpppoe_if.h"
+#include "nss_pppoe.h"
+
+/*
+ * prototypes
+ */
+static int nss_nlpppoe_ops_get_stats(struct sk_buff *skb, struct genl_info *info);
+static int nss_nlpppoe_process_notify(struct notifier_block *nb, unsigned long val, void *data);
+
+/*
+ * pppoe family definition
+ */
+static struct genl_family nss_nlpppoe_family = {
+ .id = GENL_ID_GENERATE, /* Auto generate ID */
+ .name = NSS_NLPPPOE_FAMILY, /* family name string */
+ .hdrsize = sizeof(struct nss_pppoe_stats_notification), /* NSS NETLINK pppoe stats */
+ .version = NSS_NL_VER, /* Set it to NSS_NLPPPOE version */
+ .maxattr = NSS_STATS_EVENT_MAX, /* maximum commands supported */
+ .netnsok = true,
+ .pre_doit = NULL,
+ .post_doit = NULL,
+};
+
+/*
+ * multicast group for sending message status & events
+ */
+static const struct genl_multicast_group nss_nlpppoe_mcgrp[] = {
+ {.name = NSS_NLPPPOE_MCAST_GRP},
+};
+
+/*
+ * operation table called by the generic netlink layer based on the command
+ */
+static struct genl_ops nss_nlpppoe_ops[] = {
+ {.cmd = NSS_STATS_EVENT_NOTIFY, .doit = nss_nlpppoe_ops_get_stats},
+};
+
+/*
+ * device call back handler for pppoe from NSS
+ */
+static struct notifier_block nss_pppoe_stats_notifier_nb = {
+ .notifier_call = nss_nlpppoe_process_notify,
+};
+
+/*
+ * nss_nlpppoe_ops_get_stats()
+ * get stats handler
+ */
+static int nss_nlpppoe_ops_get_stats(struct sk_buff *skb, struct genl_info *info)
+{
+ return 0;
+}
+
+/*
+ * nss_nlpppoe_process_notify()
+ * process notification messages from NSS
+ */
+static int nss_nlpppoe_process_notify(struct notifier_block *nb, unsigned long val, void *data)
+{
+ struct sk_buff *skb;
+ struct nss_pppoe_stats_notification *nss_stats, *nl_stats;
+
+ nss_stats = (struct nss_pppoe_stats_notification *)data;
+ skb = nss_nl_new_msg(&nss_nlpppoe_family, NSS_NLCMN_SUBSYS_PPPOE);
+ if (!skb) {
+ nss_nl_error("unable to allocate NSS_NLPPPOE event\n");
+ return NOTIFY_DONE;
+ }
+
+ nl_stats = nss_nl_get_data(skb);
+ memcpy(nl_stats, nss_stats, sizeof(struct nss_pppoe_stats_notification));
+ nss_nl_mcast_event(&nss_nlpppoe_family, skb);
+
+ return NOTIFY_DONE;
+}
+
+/*
+ * nss_nlpppoe_init()
+ * handler init
+ */
+bool nss_nlpppoe_init(void)
+{
+ int error,ret;
+
+ nss_nl_info_always("Init NSS netlink pppoe handler\n");
+
+ /*
+ * register NETLINK ops with the family
+ */
+ error = genl_register_family_with_ops_groups(&nss_nlpppoe_family, nss_nlpppoe_ops, nss_nlpppoe_mcgrp);
+ if (error) {
+ nss_nl_info_always("Error: unable to register pppoe family\n");
+ return false;
+ }
+
+ /*
+ * register device call back handler for pppoe from NSS
+ */
+ ret = nss_pppoe_stats_register_notifier(&nss_pppoe_stats_notifier_nb);
+ if (ret) {
+ nss_nl_info_always("Error: retreiving the NSS Context\n");
+ genl_unregister_family(&nss_nlpppoe_family);
+ return false;
+ }
+
+ return true;
+}
+
+/*
+ * nss_nlpppoe_exit()
+ * handler exit
+ */
+bool nss_nlpppoe_exit(void)
+{
+ int error;
+
+ nss_nl_info_always("Exit NSS netlink pppoe handler\n");
+
+ /*
+ * Unregister the device callback handler for pppoe
+ */
+ nss_pppoe_stats_unregister_notifier(&nss_pppoe_stats_notifier_nb);
+
+ /*
+ * unregister the ops family
+ */
+ error = genl_unregister_family(&nss_nlpppoe_family);
+ if (error) {
+ nss_nl_info_always("unable to unregister pppoe NETLINK family\n");
+ return false;
+ }
+
+ return true;
+}
diff --git a/netlink/nss_nlpppoe.h b/netlink/nss_nlpppoe.h
new file mode 100644
index 0000000..9740127
--- /dev/null
+++ b/netlink/nss_nlpppoe.h
@@ -0,0 +1,37 @@
+/*
+ **************************************************************************
+ * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ **************************************************************************
+ */
+
+/*
+ * nss_nlpppoe.h
+ * NSS Netlink pppoe API definitions
+ */
+#ifndef __NSS_NLPPPOE_H
+#define __NSS_NLPPPOE_H
+
+bool nss_nlpppoe_init(void);
+bool nss_nlpppoe_exit(void);
+
+#if defined(CONFIG_NSS_NLPPPOE)
+#define NSS_NLPPPOE_INIT nss_nlpppoe_init
+#define NSS_NLPPPOE_EXIT nss_nlpppoe_exit
+#else
+#define NSS_NLPPPOE_INIT 0
+#define NSS_NLPPPOE_EXIT 0
+#endif /* !CONFIG_NSS_NLPPPOE */
+
+#endif /* __NSS_NLPPPOE_H */