be2net: Provide an alternate way to read pf_num for BEx chips
[cascardo/linux.git] / net / batman-adv / netlink.c
index 14360ec..64cb6ac 100644 (file)
@@ -18,6 +18,8 @@
 #include "netlink.h"
 #include "main.h"
 
+#include <linux/atomic.h>
+#include <linux/byteorder/generic.h>
 #include <linux/errno.h>
 #include <linux/fs.h>
 #include <linux/genetlink.h>
 #include <uapi/linux/batman_adv.h>
 
 #include "bat_algo.h"
+#include "bridge_loop_avoidance.h"
+#include "gateway_client.h"
 #include "hard-interface.h"
+#include "originator.h"
+#include "packet.h"
 #include "soft-interface.h"
 #include "tp_meter.h"
 #include "translation-table.h"
@@ -48,6 +54,7 @@ struct genl_family batadv_netlink_family = {
        .name = BATADV_NL_NAME,
        .version = 1,
        .maxattr = BATADV_ATTR_MAX,
+       .netnsok = true,
 };
 
 /* multicast groups */
@@ -55,11 +62,11 @@ enum batadv_netlink_multicast_groups {
        BATADV_NL_MCGRP_TPMETER,
 };
 
-static struct genl_multicast_group batadv_netlink_mcgrps[] = {
+static const struct genl_multicast_group batadv_netlink_mcgrps[] = {
        [BATADV_NL_MCGRP_TPMETER] = { .name = BATADV_NL_MCAST_GROUP_TPMETER },
 };
 
-static struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
+static const struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
        [BATADV_ATTR_VERSION]           = { .type = NLA_STRING },
        [BATADV_ATTR_ALGO_NAME]         = { .type = NLA_STRING },
        [BATADV_ATTR_MESH_IFINDEX]      = { .type = NLA_U32 },
@@ -82,6 +89,17 @@ static struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
        [BATADV_ATTR_TT_FLAGS]          = { .type = NLA_U32 },
        [BATADV_ATTR_FLAG_BEST]         = { .type = NLA_FLAG },
        [BATADV_ATTR_LAST_SEEN_MSECS]   = { .type = NLA_U32 },
+       [BATADV_ATTR_NEIGH_ADDRESS]     = { .len = ETH_ALEN },
+       [BATADV_ATTR_TQ]                = { .type = NLA_U8 },
+       [BATADV_ATTR_THROUGHPUT]        = { .type = NLA_U32 },
+       [BATADV_ATTR_BANDWIDTH_UP]      = { .type = NLA_U32 },
+       [BATADV_ATTR_BANDWIDTH_DOWN]    = { .type = NLA_U32 },
+       [BATADV_ATTR_ROUTER]            = { .len = ETH_ALEN },
+       [BATADV_ATTR_BLA_OWN]           = { .type = NLA_FLAG },
+       [BATADV_ATTR_BLA_ADDRESS]       = { .len = ETH_ALEN },
+       [BATADV_ATTR_BLA_VID]           = { .type = NLA_U16 },
+       [BATADV_ATTR_BLA_BACKBONE]      = { .len = ETH_ALEN },
+       [BATADV_ATTR_BLA_CRC]           = { .type = NLA_U16 },
 };
 
 /**
@@ -121,9 +139,17 @@ batadv_netlink_mesh_info_put(struct sk_buff *msg, struct net_device *soft_iface)
            nla_put_u32(msg, BATADV_ATTR_MESH_IFINDEX, soft_iface->ifindex) ||
            nla_put_string(msg, BATADV_ATTR_MESH_IFNAME, soft_iface->name) ||
            nla_put(msg, BATADV_ATTR_MESH_ADDRESS, ETH_ALEN,
-                   soft_iface->dev_addr))
+                   soft_iface->dev_addr) ||
+           nla_put_u8(msg, BATADV_ATTR_TT_TTVN,
+                      (u8)atomic_read(&bat_priv->tt.vn)))
                goto out;
 
+#ifdef CONFIG_BATMAN_ADV_BLA
+       if (nla_put_u16(msg, BATADV_ATTR_BLA_CRC,
+                       ntohs(bat_priv->bla.claim_dest.group)))
+               goto out;
+#endif
+
        primary_if = batadv_primary_if_get_selected(bat_priv);
        if (primary_if && primary_if->if_status == BATADV_IF_ACTIVE) {
                hard_iface = primary_if->net_dev;
@@ -551,6 +577,37 @@ static struct genl_ops batadv_netlink_ops[] = {
                .policy = batadv_netlink_policy,
                .dumpit = batadv_tt_global_dump,
        },
+       {
+               .cmd = BATADV_CMD_GET_ORIGINATORS,
+               .flags = GENL_ADMIN_PERM,
+               .policy = batadv_netlink_policy,
+               .dumpit = batadv_orig_dump,
+       },
+       {
+               .cmd = BATADV_CMD_GET_NEIGHBORS,
+               .flags = GENL_ADMIN_PERM,
+               .policy = batadv_netlink_policy,
+               .dumpit = batadv_hardif_neigh_dump,
+       },
+       {
+               .cmd = BATADV_CMD_GET_GATEWAYS,
+               .flags = GENL_ADMIN_PERM,
+               .policy = batadv_netlink_policy,
+               .dumpit = batadv_gw_dump,
+       },
+       {
+               .cmd = BATADV_CMD_GET_BLA_CLAIM,
+               .flags = GENL_ADMIN_PERM,
+               .policy = batadv_netlink_policy,
+               .dumpit = batadv_bla_claim_dump,
+       },
+       {
+               .cmd = BATADV_CMD_GET_BLA_BACKBONE,
+               .flags = GENL_ADMIN_PERM,
+               .policy = batadv_netlink_policy,
+               .dumpit = batadv_bla_backbone_dump,
+       },
+
 };
 
 /**