mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 15:03:53 +02:00
This cleanup patchset includes the following patches:
- bump version strings, by Simon Wunderlich - Reorder includes for distributed-arp-table.c, by Sven Eckelmann - Fix translation table change handling, by Remi Pommarel (2 patches) - Map VID 0 to untagged TT VLAN, by Sven Eckelmann - Update MAINTAINERS/mailmap e-mail addresses, by the respective authors (4 patches) - netlink: reduce duplicate code by returning interfaces, by Linus Lüssing -----BEGIN PGP SIGNATURE----- iQJKBAABCgA0FiEE1ilQI7G+y+fdhnrfoSvjmEKSnqEFAmeKTuUWHHN3QHNpbW9u d3VuZGVybGljaC5kZQAKCRChK+OYQpKeoREQEACKKLbl6IGJ9xXTlaRhtUwr55KD JmvJT+y25IOmJBlRpZ6zHEjDxlsF/W+Se63k4tWrQSEscqBLXL9K0nY171cU+sJ0 Nx6AF2F6GobfVuzJGoJWjOZ3eCk4+stiCsBPz0ZJmu5cN24nZRkQZWpOJCSl1KtY huRG+bum58hw4kvaK5IU+9iLxtN5ec3STVZjEe0GKVqB6vo19+XGnPJqNSlVDDiQ iJSl+6VjaYYG2zclyQDefo4CuILVTAxGi5vaVFhoLVkUj2QPo41BEpkfQxZ8P1HR bFXfnOITuhCeDgzF2uwocaeW0P06kyKa+cyH4PO5BvQOp5up667aDdXtgKPBvKzV 5Fn+WN0A/SsM+tLdGkVdbU1ceNgsNYLyROJgorDNkiGUmRvrFOmhXVzhJMlcppkR O+qh7K7Kpoyuz3a2ZiktvG5sSG0aFhQ3GRJyZlqKGV5bLzJ8e2Z+0aCFKtVw0RlZ 3lg2/iEb5//+aJKZToHH97U3PG2ahO76WPSiaTPVVfvGYS2gE7fihHWtI9Uf9FzB AHFhiOP5oPet5jSjH0jrybOEHcSvuxsOi+vIC0hCiPV4O/fN7tjeEj4XM3uPF5LQ FI26vvS5izhZxOWVIUPnz5pSWzTmfiRPNbckcESHt8CHjlSTUw3TPlC0jua0iXMF shhpONEPSjZvExybLg== =cv/9 -----END PGP SIGNATURE----- Merge tag 'batadv-next-pullrequest-20250117' of git://git.open-mesh.org/linux-merge Simon Wunderlich says: ==================== This cleanup patchset includes the following patches: - bump version strings, by Simon Wunderlich - Reorder includes for distributed-arp-table.c, by Sven Eckelmann - Fix translation table change handling, by Remi Pommarel (2 patches) - Map VID 0 to untagged TT VLAN, by Sven Eckelmann - Update MAINTAINERS/mailmap e-mail addresses, by the respective authors (4 patches) - netlink: reduce duplicate code by returning interfaces, by Linus Lüssing * tag 'batadv-next-pullrequest-20250117' of git://git.open-mesh.org/linux-merge: batman-adv: netlink: reduce duplicate code by returning interfaces MAINTAINERS: mailmap: add entries for Antonio Quartulli mailmap: add entries for Sven Eckelmann mailmap: add entries for Simon Wunderlich MAINTAINERS: update email address of Marek Linder batman-adv: Map VID 0 to untagged TT VLAN batman-adv: Don't keep redundant TT change events batman-adv: Remove atomic usage for tt.local_changes batman-adv: Reorder includes for distributed-arp-table.c batman-adv: Start new development cycle ==================== Link: https://patch.msgid.link/20250117123910.219278-1-sw@simonwunderlich.de Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
59372af69d
19
.mailmap
19
.mailmap
|
@ -83,6 +83,13 @@ Anirudh Ghayal <quic_aghayal@quicinc.com> <aghayal@codeaurora.org>
|
|||
Antoine Tenart <atenart@kernel.org> <antoine.tenart@bootlin.com>
|
||||
Antoine Tenart <atenart@kernel.org> <antoine.tenart@free-electrons.com>
|
||||
Antonio Ospite <ao2@ao2.it> <ao2@amarulasolutions.com>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <antonio@meshcoding.com>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <antonio@open-mesh.com>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <antonio.quartulli@open-mesh.com>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <ordex@autistici.org>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <ordex@ritirata.org>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <antonio@openvpn.net>
|
||||
Antonio Quartulli <antonio@mandelbit.com> <a@unstable.cc>
|
||||
Anup Patel <anup@brainfault.org> <anup.patel@wdc.com>
|
||||
Archit Taneja <archit@ti.com>
|
||||
Ard Biesheuvel <ardb@kernel.org> <ard.biesheuvel@linaro.org>
|
||||
|
@ -429,6 +436,8 @@ Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
|
|||
Marc Zyngier <maz@kernel.org> <marc.zyngier@arm.com>
|
||||
Marek Behún <kabel@kernel.org> <marek.behun@nic.cz>
|
||||
Marek Behún <kabel@kernel.org> Marek Behun <marek.behun@nic.cz>
|
||||
Marek Lindner <marek.lindner@mailbox.org> <lindner_marek@yahoo.de>
|
||||
Marek Lindner <marek.lindner@mailbox.org> <mareklindner@neomailbox.ch>
|
||||
Mark Brown <broonie@sirena.org.uk>
|
||||
Mark Starovoytov <mstarovo@pm.me> <mstarovoitov@marvell.com>
|
||||
Markus Schneider-Pargmann <msp@baylibre.com> <mpa@pengutronix.de>
|
||||
|
@ -644,6 +653,11 @@ Simona Vetter <simona.vetter@ffwll.ch> <daniel@biene.ffwll.ch>
|
|||
Simon Horman <horms@kernel.org> <simon.horman@corigine.com>
|
||||
Simon Horman <horms@kernel.org> <simon.horman@netronome.com>
|
||||
Simon Kelley <simon@thekelleys.org.uk>
|
||||
Simon Wunderlich <sw@simonwunderlich.de> <simon.wunderlich@open-mesh.com>
|
||||
Simon Wunderlich <sw@simonwunderlich.de> <simon.wunderlich@s2003.tu-chemnitz.de>
|
||||
Simon Wunderlich <sw@simonwunderlich.de> <simon.wunderlich@saxnet.de>
|
||||
Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com>
|
||||
Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de>
|
||||
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
|
||||
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
|
||||
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
|
||||
|
@ -664,6 +678,11 @@ Sudarshan Rajagopalan <quic_sudaraja@quicinc.com> <sudaraja@codeaurora.org>
|
|||
Sudeep Holla <sudeep.holla@arm.com> Sudeep KarkadaNagesha <sudeep.karkadanagesha@arm.com>
|
||||
Sumit Semwal <sumit.semwal@ti.com>
|
||||
Surabhi Vishnoi <quic_svishnoi@quicinc.com> <svishnoi@codeaurora.org>
|
||||
Sven Eckelmann <sven@narfation.org> <seckelmann@datto.com>
|
||||
Sven Eckelmann <sven@narfation.org> <sven.eckelmann@gmx.de>
|
||||
Sven Eckelmann <sven@narfation.org> <sven.eckelmann@open-mesh.com>
|
||||
Sven Eckelmann <sven@narfation.org> <sven.eckelmann@openmesh.com>
|
||||
Sven Eckelmann <sven@narfation.org> <sven@open-mesh.com>
|
||||
Takashi YOSHII <takashi.yoshii.zj@renesas.com>
|
||||
Tamizh Chelvam Raja <quic_tamizhr@quicinc.com> <tamizhr@codeaurora.org>
|
||||
Taniya Das <quic_tdas@quicinc.com> <tdas@codeaurora.org>
|
||||
|
|
|
@ -164,5 +164,5 @@ Mailing-list:
|
|||
|
||||
You can also contact the Authors:
|
||||
|
||||
* Marek Lindner <mareklindner@neomailbox.ch>
|
||||
* Marek Lindner <marek.lindner@mailbox.org>
|
||||
* Simon Wunderlich <sw@simonwunderlich.de>
|
||||
|
|
|
@ -3874,9 +3874,9 @@ S: Maintained
|
|||
F: drivers/platform/x86/barco-p50-gpio.c
|
||||
|
||||
BATMAN ADVANCED
|
||||
M: Marek Lindner <mareklindner@neomailbox.ch>
|
||||
M: Marek Lindner <marek.lindner@mailbox.org>
|
||||
M: Simon Wunderlich <sw@simonwunderlich.de>
|
||||
M: Antonio Quartulli <a@unstable.cc>
|
||||
M: Antonio Quartulli <antonio@mandelbit.com>
|
||||
M: Sven Eckelmann <sven@narfation.org>
|
||||
L: b.a.t.m.a.n@lists.open-mesh.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/crc16.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -38,7 +39,6 @@
|
|||
#include <net/arp.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
|
@ -47,7 +47,6 @@
|
|||
#include "log.h"
|
||||
#include "netlink.h"
|
||||
#include "originator.h"
|
||||
#include "soft-interface.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
static const u8 batadv_announce_mac[4] = {0x43, 0x05, 0x43, 0x05};
|
||||
|
@ -2233,25 +2232,16 @@ int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
|||
{
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_hashtable *hash;
|
||||
struct batadv_priv *bat_priv;
|
||||
int bucket = cb->args[0];
|
||||
int idx = cb->args[1];
|
||||
int ifindex;
|
||||
int ret = 0;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
hash = bat_priv->bla.claim_hash;
|
||||
|
@ -2403,25 +2393,16 @@ int batadv_bla_backbone_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
|||
{
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_hashtable *hash;
|
||||
struct batadv_priv *bat_priv;
|
||||
int bucket = cb->args[0];
|
||||
int idx = cb->args[1];
|
||||
int ifindex;
|
||||
int ret = 0;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
hash = bat_priv->bla.backbone_hash;
|
||||
|
|
|
@ -7,11 +7,11 @@
|
|||
#include "distributed-arp-table.h"
|
||||
#include "main.h"
|
||||
|
||||
#include <linux/unaligned.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -32,11 +32,11 @@
|
|||
#include <linux/stddef.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/udp.h>
|
||||
#include <linux/unaligned.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/arp.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
#include "bridge_loop_avoidance.h"
|
||||
|
@ -46,7 +46,6 @@
|
|||
#include "netlink.h"
|
||||
#include "originator.h"
|
||||
#include "send.h"
|
||||
#include "soft-interface.h"
|
||||
#include "translation-table.h"
|
||||
#include "tvlv.h"
|
||||
|
||||
|
@ -937,25 +936,16 @@ int batadv_dat_cache_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
|||
{
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_hashtable *hash;
|
||||
struct batadv_priv *bat_priv;
|
||||
int bucket = cb->args[0];
|
||||
int idx = cb->args[1];
|
||||
int ifindex;
|
||||
int ret = 0;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
hash = bat_priv->dat.hash;
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/atomic.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -31,7 +32,6 @@
|
|||
#include <linux/sprintf.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/udp.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
|
@ -40,7 +40,6 @@
|
|||
#include "netlink.h"
|
||||
#include "originator.h"
|
||||
#include "routing.h"
|
||||
#include "soft-interface.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
/* These are the offsets of the "hw type" and "hw address length" in the dhcp
|
||||
|
@ -502,22 +501,13 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv)
|
|||
int batadv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
int ifindex;
|
||||
int ret;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
|
|
|
@ -637,6 +637,13 @@ unsigned short batadv_get_vid(struct sk_buff *skb, size_t header_len)
|
|||
|
||||
vhdr = (struct vlan_ethhdr *)(skb->data + header_len);
|
||||
vid = ntohs(vhdr->h_vlan_TCI) & VLAN_VID_MASK;
|
||||
|
||||
/* VID 0 is only used to indicate "priority tag" frames which only
|
||||
* contain priority information and no VID.
|
||||
*/
|
||||
if (vid == 0)
|
||||
return BATADV_NO_FLAGS;
|
||||
|
||||
vid |= BATADV_VLAN_HAS_TAG;
|
||||
|
||||
return vid;
|
||||
|
|
|
@ -7,13 +7,13 @@
|
|||
#ifndef _NET_BATMAN_ADV_MAIN_H_
|
||||
#define _NET_BATMAN_ADV_MAIN_H_
|
||||
|
||||
#define BATADV_DRIVER_AUTHOR "Marek Lindner <mareklindner@neomailbox.ch>, " \
|
||||
#define BATADV_DRIVER_AUTHOR "Marek Lindner <marek.lindner@mailbox.org>, " \
|
||||
"Simon Wunderlich <sw@simonwunderlich.de>"
|
||||
#define BATADV_DRIVER_DESC "B.A.T.M.A.N. advanced"
|
||||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||
|
||||
#ifndef BATADV_SOURCE_VERSION
|
||||
#define BATADV_SOURCE_VERSION "2024.3"
|
||||
#define BATADV_SOURCE_VERSION "2025.0"
|
||||
#endif
|
||||
|
||||
/* B.A.T.M.A.N. parameters */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/bug.h>
|
||||
#include <linux/byteorder/generic.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -46,7 +47,6 @@
|
|||
#include <net/ip.h>
|
||||
#include <net/ipv6.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
|
@ -56,7 +56,6 @@
|
|||
#include "log.h"
|
||||
#include "netlink.h"
|
||||
#include "send.h"
|
||||
#include "soft-interface.h"
|
||||
#include "translation-table.h"
|
||||
#include "tvlv.h"
|
||||
|
||||
|
@ -2104,21 +2103,13 @@ batadv_mcast_netlink_get_primary(struct netlink_callback *cb,
|
|||
struct batadv_hard_iface **primary_if)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface = NULL;
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
int ifindex;
|
||||
int ret = 0;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
|
|
|
@ -158,8 +158,7 @@ static const struct nla_policy batadv_netlink_policy[NUM_BATADV_ATTR] = {
|
|||
*
|
||||
* Return: interface index, or 0.
|
||||
*/
|
||||
int
|
||||
batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype)
|
||||
static int batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype)
|
||||
{
|
||||
struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype);
|
||||
|
||||
|
@ -881,14 +880,14 @@ static int batadv_netlink_notify_hardif(struct batadv_priv *bat_priv,
|
|||
}
|
||||
|
||||
/**
|
||||
* batadv_netlink_get_hardif() - Get hardif attributes
|
||||
* batadv_netlink_cmd_get_hardif() - Get hardif attributes
|
||||
* @skb: Netlink message with request data
|
||||
* @info: receiver information
|
||||
*
|
||||
* Return: 0 on success or negative error number in case of failure
|
||||
*/
|
||||
static int batadv_netlink_get_hardif(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
static int batadv_netlink_cmd_get_hardif(struct sk_buff *skb,
|
||||
struct genl_info *info)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface = info->user_ptr[1];
|
||||
struct batadv_priv *bat_priv = info->user_ptr[0];
|
||||
|
@ -964,28 +963,16 @@ static int batadv_netlink_set_hardif(struct sk_buff *skb,
|
|||
static int
|
||||
batadv_netlink_dump_hardif(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
int ifindex;
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
int skip = cb->args[0];
|
||||
int i = 0;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface)
|
||||
return -ENODEV;
|
||||
|
||||
if (!batadv_softif_is_valid(soft_iface)) {
|
||||
dev_put(soft_iface);
|
||||
return -ENODEV;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
|
@ -1150,23 +1137,17 @@ static int batadv_netlink_set_vlan(struct sk_buff *skb, struct genl_info *info)
|
|||
}
|
||||
|
||||
/**
|
||||
* batadv_get_softif_from_info() - Retrieve soft interface from genl attributes
|
||||
* batadv_netlink_get_softif_from_ifindex() - Get soft-iface from ifindex
|
||||
* @net: the applicable net namespace
|
||||
* @info: receiver information
|
||||
* @ifindex: index of the soft interface
|
||||
*
|
||||
* Return: Pointer to soft interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
static struct net_device *
|
||||
batadv_get_softif_from_info(struct net *net, struct genl_info *info)
|
||||
batadv_netlink_get_softif_from_ifindex(struct net *net, int ifindex)
|
||||
{
|
||||
struct net_device *soft_iface;
|
||||
int ifindex;
|
||||
|
||||
if (!info->attrs[BATADV_ATTR_MESH_IFINDEX])
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
ifindex = nla_get_u32(info->attrs[BATADV_ATTR_MESH_IFINDEX]);
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface)
|
||||
|
@ -1184,28 +1165,61 @@ err_put_softif:
|
|||
}
|
||||
|
||||
/**
|
||||
* batadv_get_hardif_from_info() - Retrieve hardif from genl attributes
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* batadv_netlink_get_softif_from_info() - Get soft-iface from genl attributes
|
||||
* @net: the applicable net namespace
|
||||
* @info: receiver information
|
||||
*
|
||||
* Return: Pointer to soft interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
static struct net_device *
|
||||
batadv_netlink_get_softif_from_info(struct net *net, struct genl_info *info)
|
||||
{
|
||||
int ifindex;
|
||||
|
||||
if (!info->attrs[BATADV_ATTR_MESH_IFINDEX])
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
ifindex = nla_get_u32(info->attrs[BATADV_ATTR_MESH_IFINDEX]);
|
||||
|
||||
return batadv_netlink_get_softif_from_ifindex(net, ifindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_netlink_get_softif() - Retrieve soft interface from netlink callback
|
||||
* @cb: callback structure containing arguments
|
||||
*
|
||||
* Return: Pointer to soft interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
struct net_device *batadv_netlink_get_softif(struct netlink_callback *cb)
|
||||
{
|
||||
int ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return ERR_PTR(-ENONET);
|
||||
|
||||
return batadv_netlink_get_softif_from_ifindex(sock_net(cb->skb->sk),
|
||||
ifindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_netlink_get_hardif_from_ifindex() - Get hard-iface from ifindex
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @net: the applicable net namespace
|
||||
* @ifindex: index of the hard interface
|
||||
*
|
||||
* Return: Pointer to hard interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
static struct batadv_hard_iface *
|
||||
batadv_get_hardif_from_info(struct batadv_priv *bat_priv, struct net *net,
|
||||
struct genl_info *info)
|
||||
batadv_netlink_get_hardif_from_ifindex(struct batadv_priv *bat_priv,
|
||||
struct net *net, int ifindex)
|
||||
{
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
struct net_device *hard_dev;
|
||||
unsigned int hardif_index;
|
||||
|
||||
if (!info->attrs[BATADV_ATTR_HARD_IFINDEX])
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
hardif_index = nla_get_u32(info->attrs[BATADV_ATTR_HARD_IFINDEX]);
|
||||
|
||||
hard_dev = dev_get_by_index(net, hardif_index);
|
||||
hard_dev = dev_get_by_index(net, ifindex);
|
||||
if (!hard_dev)
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
|
@ -1229,6 +1243,51 @@ err_put_harddev:
|
|||
return ERR_PTR(-EINVAL);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_netlink_get_hardif_from_info() - Get hard-iface from genl attributes
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @net: the applicable net namespace
|
||||
* @info: receiver information
|
||||
*
|
||||
* Return: Pointer to hard interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
static struct batadv_hard_iface *
|
||||
batadv_netlink_get_hardif_from_info(struct batadv_priv *bat_priv,
|
||||
struct net *net, struct genl_info *info)
|
||||
{
|
||||
int ifindex;
|
||||
|
||||
if (!info->attrs[BATADV_ATTR_HARD_IFINDEX])
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
ifindex = nla_get_u32(info->attrs[BATADV_ATTR_HARD_IFINDEX]);
|
||||
|
||||
return batadv_netlink_get_hardif_from_ifindex(bat_priv, net, ifindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_netlink_get_hardif() - Retrieve hard interface from netlink callback
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @cb: callback structure containing arguments
|
||||
*
|
||||
* Return: Pointer to hard interface (with increased refcnt) on success, error
|
||||
* pointer on error
|
||||
*/
|
||||
struct batadv_hard_iface *
|
||||
batadv_netlink_get_hardif(struct batadv_priv *bat_priv,
|
||||
struct netlink_callback *cb)
|
||||
{
|
||||
int ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_HARD_IFINDEX);
|
||||
if (!ifindex)
|
||||
return ERR_PTR(-ENONET);
|
||||
|
||||
return batadv_netlink_get_hardif_from_ifindex(bat_priv,
|
||||
sock_net(cb->skb->sk),
|
||||
ifindex);
|
||||
}
|
||||
|
||||
/**
|
||||
* batadv_get_vlan_from_info() - Retrieve vlan from genl attributes
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
|
@ -1288,7 +1347,7 @@ static int batadv_pre_doit(const struct genl_split_ops *ops,
|
|||
return -EINVAL;
|
||||
|
||||
if (ops->internal_flags & BATADV_FLAG_NEED_MESH) {
|
||||
soft_iface = batadv_get_softif_from_info(net, info);
|
||||
soft_iface = batadv_netlink_get_softif_from_info(net, info);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
|
@ -1297,7 +1356,8 @@ static int batadv_pre_doit(const struct genl_split_ops *ops,
|
|||
}
|
||||
|
||||
if (ops->internal_flags & BATADV_FLAG_NEED_HARDIF) {
|
||||
hard_iface = batadv_get_hardif_from_info(bat_priv, net, info);
|
||||
hard_iface = batadv_netlink_get_hardif_from_info(bat_priv, net,
|
||||
info);
|
||||
if (IS_ERR(hard_iface)) {
|
||||
ret = PTR_ERR(hard_iface);
|
||||
goto err_put_softif;
|
||||
|
@ -1390,7 +1450,7 @@ static const struct genl_small_ops batadv_netlink_ops[] = {
|
|||
.validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
|
||||
/* can be retrieved by unprivileged users */
|
||||
.dumpit = batadv_netlink_dump_hardif,
|
||||
.doit = batadv_netlink_get_hardif,
|
||||
.doit = batadv_netlink_cmd_get_hardif,
|
||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||
BATADV_FLAG_NEED_HARDIF,
|
||||
},
|
||||
|
|
|
@ -15,7 +15,10 @@
|
|||
|
||||
void batadv_netlink_register(void);
|
||||
void batadv_netlink_unregister(void);
|
||||
int batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype);
|
||||
struct net_device *batadv_netlink_get_softif(struct netlink_callback *cb);
|
||||
struct batadv_hard_iface *
|
||||
batadv_netlink_get_hardif(struct batadv_priv *bat_priv,
|
||||
struct netlink_callback *cb);
|
||||
|
||||
int batadv_netlink_tpmeter_notify(struct batadv_priv *bat_priv, const u8 *dst,
|
||||
u8 result, u32 test_time, u64 total_bytes,
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -26,9 +27,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
#include "bat_algo.h"
|
||||
#include "distributed-arp-table.h"
|
||||
|
@ -41,7 +40,6 @@
|
|||
#include "netlink.h"
|
||||
#include "network-coding.h"
|
||||
#include "routing.h"
|
||||
#include "soft-interface.h"
|
||||
#include "translation-table.h"
|
||||
|
||||
/* hash class keys */
|
||||
|
@ -755,64 +753,48 @@ batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
|
|||
*/
|
||||
int batadv_hardif_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct batadv_hard_iface *primary_if, *hard_iface;
|
||||
struct net_device *soft_iface;
|
||||
struct net_device *hard_iface = NULL;
|
||||
struct batadv_hard_iface *hardif = BATADV_IF_DEFAULT;
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
int ret;
|
||||
int ifindex, hard_ifindex;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
goto out_put_soft_iface;
|
||||
}
|
||||
|
||||
hard_ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_HARD_IFINDEX);
|
||||
if (hard_ifindex) {
|
||||
hard_iface = dev_get_by_index(net, hard_ifindex);
|
||||
if (hard_iface)
|
||||
hardif = batadv_hardif_get_by_netdev(hard_iface);
|
||||
|
||||
if (!hardif) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (hardif->soft_iface != soft_iface) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
hard_iface = batadv_netlink_get_hardif(bat_priv, cb);
|
||||
if (IS_ERR(hard_iface) && PTR_ERR(hard_iface) != -ENONET) {
|
||||
ret = PTR_ERR(hard_iface);
|
||||
goto out_put_primary_if;
|
||||
} else if (IS_ERR(hard_iface)) {
|
||||
/* => PTR_ERR(hard_iface) == -ENONET
|
||||
* => no hard-iface given, ok
|
||||
*/
|
||||
hard_iface = BATADV_IF_DEFAULT;
|
||||
}
|
||||
|
||||
if (!bat_priv->algo_ops->neigh.dump) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
goto out_put_hard_iface;
|
||||
}
|
||||
|
||||
bat_priv->algo_ops->neigh.dump(msg, cb, bat_priv, hardif);
|
||||
bat_priv->algo_ops->neigh.dump(msg, cb, bat_priv, hard_iface);
|
||||
|
||||
ret = msg->len;
|
||||
|
||||
out:
|
||||
batadv_hardif_put(hardif);
|
||||
dev_put(hard_iface);
|
||||
out_put_hard_iface:
|
||||
batadv_hardif_put(hard_iface);
|
||||
out_put_primary_if:
|
||||
batadv_hardif_put(primary_if);
|
||||
out_put_soft_iface:
|
||||
dev_put(soft_iface);
|
||||
|
||||
return ret;
|
||||
|
@ -1342,64 +1324,48 @@ static void batadv_purge_orig(struct work_struct *work)
|
|||
*/
|
||||
int batadv_orig_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct batadv_hard_iface *primary_if, *hard_iface;
|
||||
struct net_device *soft_iface;
|
||||
struct net_device *hard_iface = NULL;
|
||||
struct batadv_hard_iface *hardif = BATADV_IF_DEFAULT;
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
int ret;
|
||||
int ifindex, hard_ifindex;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
primary_if = batadv_primary_if_get_selected(bat_priv);
|
||||
if (!primary_if || primary_if->if_status != BATADV_IF_ACTIVE) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
goto out_put_soft_iface;
|
||||
}
|
||||
|
||||
hard_ifindex = batadv_netlink_get_ifindex(cb->nlh,
|
||||
BATADV_ATTR_HARD_IFINDEX);
|
||||
if (hard_ifindex) {
|
||||
hard_iface = dev_get_by_index(net, hard_ifindex);
|
||||
if (hard_iface)
|
||||
hardif = batadv_hardif_get_by_netdev(hard_iface);
|
||||
|
||||
if (!hardif) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (hardif->soft_iface != soft_iface) {
|
||||
ret = -ENOENT;
|
||||
goto out;
|
||||
}
|
||||
hard_iface = batadv_netlink_get_hardif(bat_priv, cb);
|
||||
if (IS_ERR(hard_iface) && PTR_ERR(hard_iface) != -ENONET) {
|
||||
ret = PTR_ERR(hard_iface);
|
||||
goto out_put_primary_if;
|
||||
} else if (IS_ERR(hard_iface)) {
|
||||
/* => PTR_ERR(hard_iface) == -ENONET
|
||||
* => no hard-iface given, ok
|
||||
*/
|
||||
hard_iface = BATADV_IF_DEFAULT;
|
||||
}
|
||||
|
||||
if (!bat_priv->algo_ops->orig.dump) {
|
||||
ret = -EOPNOTSUPP;
|
||||
goto out;
|
||||
goto out_put_hard_iface;
|
||||
}
|
||||
|
||||
bat_priv->algo_ops->orig.dump(msg, cb, bat_priv, hardif);
|
||||
bat_priv->algo_ops->orig.dump(msg, cb, bat_priv, hard_iface);
|
||||
|
||||
ret = msg->len;
|
||||
|
||||
out:
|
||||
batadv_hardif_put(hardif);
|
||||
dev_put(hard_iface);
|
||||
out_put_hard_iface:
|
||||
batadv_hardif_put(hard_iface);
|
||||
out_put_primary_if:
|
||||
batadv_hardif_put(primary_if);
|
||||
out_put_soft_iface:
|
||||
dev_put(soft_iface);
|
||||
|
||||
return ret;
|
||||
|
|
|
@ -637,6 +637,14 @@ static int batadv_interface_add_vid(struct net_device *dev, __be16 proto,
|
|||
if (proto != htons(ETH_P_8021Q))
|
||||
return -EINVAL;
|
||||
|
||||
/* VID 0 is only used to indicate "priority tag" frames which only
|
||||
* contain priority information and no VID. No management structures
|
||||
* should be created for this VID and it should be handled like an
|
||||
* untagged frame.
|
||||
*/
|
||||
if (vid == 0)
|
||||
return 0;
|
||||
|
||||
vid |= BATADV_VLAN_HAS_TAG;
|
||||
|
||||
/* if a new vlan is getting created and it already exists, it means that
|
||||
|
@ -684,6 +692,12 @@ static int batadv_interface_kill_vid(struct net_device *dev, __be16 proto,
|
|||
if (proto != htons(ETH_P_8021Q))
|
||||
return -EINVAL;
|
||||
|
||||
/* "priority tag" frames are handled like "untagged" frames
|
||||
* and no softif_vlan needs to be destroyed
|
||||
*/
|
||||
if (vid == 0)
|
||||
return 0;
|
||||
|
||||
vlan = batadv_softif_vlan_get(bat_priv, vid | BATADV_VLAN_HAS_TAG);
|
||||
if (!vlan)
|
||||
return -ENOENT;
|
||||
|
@ -783,13 +797,13 @@ static int batadv_softif_init_late(struct net_device *dev)
|
|||
atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
|
||||
atomic_set(&bat_priv->bcast_seqno, 1);
|
||||
atomic_set(&bat_priv->tt.vn, 0);
|
||||
atomic_set(&bat_priv->tt.local_changes, 0);
|
||||
atomic_set(&bat_priv->tt.ogm_append_cnt, 0);
|
||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||
atomic_set(&bat_priv->bla.num_requests, 0);
|
||||
#endif
|
||||
atomic_set(&bat_priv->tp_num, 0);
|
||||
|
||||
WRITE_ONCE(bat_priv->tt.local_changes, 0);
|
||||
bat_priv->tt.last_changeset = NULL;
|
||||
bat_priv->tt.last_changeset_len = 0;
|
||||
bat_priv->isolation_mark = 0;
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <linux/container_of.h>
|
||||
#include <linux/crc32c.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/gfp.h>
|
||||
|
@ -39,7 +40,6 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <net/genetlink.h>
|
||||
#include <net/netlink.h>
|
||||
#include <net/sock.h>
|
||||
#include <uapi/linux/batadv_packet.h>
|
||||
#include <uapi/linux/batman_adv.h>
|
||||
|
||||
|
@ -423,8 +423,8 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
|
|||
struct batadv_tt_change_node *tt_change_node, *entry, *safe;
|
||||
struct batadv_tt_common_entry *common = &tt_local_entry->common;
|
||||
u8 flags = common->flags | event_flags;
|
||||
bool event_removed = false;
|
||||
bool del_op_requested, del_op_entry;
|
||||
size_t changes;
|
||||
|
||||
tt_change_node = kmem_cache_alloc(batadv_tt_change_cache, GFP_ATOMIC);
|
||||
if (!tt_change_node)
|
||||
|
@ -438,51 +438,45 @@ static void batadv_tt_local_event(struct batadv_priv *bat_priv,
|
|||
|
||||
del_op_requested = flags & BATADV_TT_CLIENT_DEL;
|
||||
|
||||
/* check for ADD+DEL or DEL+ADD events */
|
||||
/* check for ADD+DEL, DEL+ADD, ADD+ADD or DEL+DEL events */
|
||||
spin_lock_bh(&bat_priv->tt.changes_list_lock);
|
||||
changes = READ_ONCE(bat_priv->tt.local_changes);
|
||||
list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
|
||||
list) {
|
||||
if (!batadv_compare_eth(entry->change.addr, common->addr))
|
||||
continue;
|
||||
|
||||
/* DEL+ADD in the same orig interval have no effect and can be
|
||||
* removed to avoid silly behaviour on the receiver side. The
|
||||
* other way around (ADD+DEL) can happen in case of roaming of
|
||||
* a client still in the NEW state. Roaming of NEW clients is
|
||||
* now possible due to automatically recognition of "temporary"
|
||||
* clients
|
||||
*/
|
||||
del_op_entry = entry->change.flags & BATADV_TT_CLIENT_DEL;
|
||||
if (!del_op_requested && del_op_entry)
|
||||
goto del;
|
||||
if (del_op_requested && !del_op_entry)
|
||||
goto del;
|
||||
|
||||
/* this is a second add in the same originator interval. It
|
||||
* means that flags have been changed: update them!
|
||||
*/
|
||||
if (!del_op_requested && !del_op_entry)
|
||||
if (del_op_requested != del_op_entry) {
|
||||
/* DEL+ADD in the same orig interval have no effect and
|
||||
* can be removed to avoid silly behaviour on the
|
||||
* receiver side. The other way around (ADD+DEL) can
|
||||
* happen in case of roaming of a client still in the
|
||||
* NEW state. Roaming of NEW clients is now possible due
|
||||
* to automatically recognition of "temporary" clients
|
||||
*/
|
||||
list_del(&entry->list);
|
||||
kmem_cache_free(batadv_tt_change_cache, entry);
|
||||
changes--;
|
||||
} else {
|
||||
/* this is a second add or del in the same originator
|
||||
* interval. It could mean that flags have been changed
|
||||
* (e.g. double add): update them
|
||||
*/
|
||||
entry->change.flags = flags;
|
||||
}
|
||||
|
||||
continue;
|
||||
del:
|
||||
list_del(&entry->list);
|
||||
kmem_cache_free(batadv_tt_change_cache, entry);
|
||||
kmem_cache_free(batadv_tt_change_cache, tt_change_node);
|
||||
event_removed = true;
|
||||
goto unlock;
|
||||
goto update_changes;
|
||||
}
|
||||
|
||||
/* track the change in the OGMinterval list */
|
||||
list_add_tail(&tt_change_node->list, &bat_priv->tt.changes_list);
|
||||
changes++;
|
||||
|
||||
unlock:
|
||||
update_changes:
|
||||
WRITE_ONCE(bat_priv->tt.local_changes, changes);
|
||||
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
|
||||
|
||||
if (event_removed)
|
||||
atomic_dec(&bat_priv->tt.local_changes);
|
||||
else
|
||||
atomic_inc(&bat_priv->tt.local_changes);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -952,7 +946,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
|
|||
size_t tt_extra_len = 0;
|
||||
u16 tvlv_len;
|
||||
|
||||
tt_diff_entries_num = atomic_read(&bat_priv->tt.local_changes);
|
||||
tt_diff_entries_num = READ_ONCE(bat_priv->tt.local_changes);
|
||||
tt_diff_len = batadv_tt_len(tt_diff_entries_num);
|
||||
|
||||
/* if we have too many changes for one packet don't send any
|
||||
|
@ -979,7 +973,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
|
|||
goto container_register;
|
||||
|
||||
spin_lock_bh(&bat_priv->tt.changes_list_lock);
|
||||
atomic_set(&bat_priv->tt.local_changes, 0);
|
||||
WRITE_ONCE(bat_priv->tt.local_changes, 0);
|
||||
|
||||
list_for_each_entry_safe(entry, safe, &bat_priv->tt.changes_list,
|
||||
list) {
|
||||
|
@ -1136,26 +1130,18 @@ batadv_tt_local_dump_bucket(struct sk_buff *msg, u32 portid,
|
|||
*/
|
||||
int batadv_tt_local_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct batadv_hashtable *hash;
|
||||
int ret;
|
||||
int ifindex;
|
||||
int bucket = cb->args[0];
|
||||
int idx = cb->args[1];
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
|
@ -1395,7 +1381,7 @@ static void batadv_tt_changes_list_free(struct batadv_priv *bat_priv)
|
|||
kmem_cache_free(batadv_tt_change_cache, entry);
|
||||
}
|
||||
|
||||
atomic_set(&bat_priv->tt.local_changes, 0);
|
||||
WRITE_ONCE(bat_priv->tt.local_changes, 0);
|
||||
spin_unlock_bh(&bat_priv->tt.changes_list_lock);
|
||||
}
|
||||
|
||||
|
@ -1911,28 +1897,20 @@ batadv_tt_global_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
|
|||
*/
|
||||
int batadv_tt_global_dump(struct sk_buff *msg, struct netlink_callback *cb)
|
||||
{
|
||||
struct net *net = sock_net(cb->skb->sk);
|
||||
struct net_device *soft_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
struct batadv_hard_iface *primary_if = NULL;
|
||||
struct batadv_hashtable *hash;
|
||||
struct hlist_head *head;
|
||||
int ret;
|
||||
int ifindex;
|
||||
int bucket = cb->args[0];
|
||||
int idx = cb->args[1];
|
||||
int sub = cb->args[2];
|
||||
int portid = NETLINK_CB(cb->skb).portid;
|
||||
|
||||
ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
|
||||
if (!ifindex)
|
||||
return -EINVAL;
|
||||
|
||||
soft_iface = dev_get_by_index(net, ifindex);
|
||||
if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
soft_iface = batadv_netlink_get_softif(cb);
|
||||
if (IS_ERR(soft_iface))
|
||||
return PTR_ERR(soft_iface);
|
||||
|
||||
bat_priv = netdev_priv(soft_iface);
|
||||
|
||||
|
@ -3656,7 +3634,7 @@ static void batadv_tt_local_commit_changes_nolock(struct batadv_priv *bat_priv)
|
|||
{
|
||||
lockdep_assert_held(&bat_priv->tt.commit_lock);
|
||||
|
||||
if (atomic_read(&bat_priv->tt.local_changes) < 1) {
|
||||
if (READ_ONCE(bat_priv->tt.local_changes) == 0) {
|
||||
if (!batadv_atomic_dec_not_zero(&bat_priv->tt.ogm_append_cnt))
|
||||
batadv_tt_tvlv_container_update(bat_priv);
|
||||
return;
|
||||
|
|
|
@ -1022,7 +1022,7 @@ struct batadv_priv_tt {
|
|||
atomic_t ogm_append_cnt;
|
||||
|
||||
/** @local_changes: changes registered in an originator interval */
|
||||
atomic_t local_changes;
|
||||
size_t local_changes;
|
||||
|
||||
/**
|
||||
* @changes_list: tracks tt local changes within an originator interval
|
||||
|
@ -1044,7 +1044,7 @@ struct batadv_priv_tt {
|
|||
*/
|
||||
struct list_head roam_list;
|
||||
|
||||
/** @changes_list_lock: lock protecting changes_list */
|
||||
/** @changes_list_lock: lock protecting changes_list & local_changes */
|
||||
spinlock_t changes_list_lock;
|
||||
|
||||
/** @req_list_lock: lock protecting req_list */
|
||||
|
|
Loading…
Reference in New Issue
Block a user