You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'batman-adv-for-davem' of git://git.open-mesh.org/linux-merge
Antonio Quartulli says: ==================== Included changes: - use ether_addr_copy instead of memcpy when possible - implement new multicast packet optimisation - improve several kerneldoc sections - minor code cleanups here you have our patchset for net-next/linux-3.15. They are 16 patches but most of them are just small cleanups and kerneldoc improvements. The only big change is the one from patch 8 to 13 by Linus Lüssing that introduces a new multicast packets optimisation. This new component aims to reduce the air overhead by sending multicast packets as bat-unicast when only one destination exists or by dropping them directly at the source if the multicast group is totally empty. In patch 11 Linus introduces an atomic_t variable, that like others that we already have is only object of write and read, thus making the atomic characteristic totally useless. Unfortunately this is part of our sysfs framework, that helps the developer to introduce new knobs by using few macros only. For this reason we decided to keep Linus' new knob for now, but I'd like to let you know that we are in the process of re-working such framework in order to convert all the current (useless) atomic_t to boolean in one go. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -76,6 +76,15 @@ Description:
|
||||
is used to classify clients as "isolated" by the
|
||||
Extended Isolation feature.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/multicast_mode
|
||||
Date: Feb 2014
|
||||
Contact: Linus Lüssing <linus.luessing@web.de>
|
||||
Description:
|
||||
Indicates whether multicast optimizations are enabled
|
||||
or disabled. If set to zero then all nodes in the
|
||||
mesh are going to use classic flooding for any
|
||||
multicast packet with no optimizations.
|
||||
|
||||
What: /sys/class/net/<mesh_iface>/mesh/network_coding
|
||||
Date: Nov 2012
|
||||
Contact: Martin Hundeboll <martin@hundeboll.net>
|
||||
|
||||
@@ -50,6 +50,15 @@ config BATMAN_ADV_NC
|
||||
If you think that your network does not need this feature you
|
||||
can safely disable it and save some space.
|
||||
|
||||
config BATMAN_ADV_MCAST
|
||||
bool "Multicast optimisation"
|
||||
depends on BATMAN_ADV
|
||||
default n
|
||||
help
|
||||
This option enables the multicast optimisation which aims to
|
||||
reduce the air overhead while improving the reliability of
|
||||
multicast messages.
|
||||
|
||||
config BATMAN_ADV_DEBUG
|
||||
bool "B.A.T.M.A.N. debugging"
|
||||
depends on BATMAN_ADV
|
||||
|
||||
@@ -36,3 +36,4 @@ batman-adv-y += send.o
|
||||
batman-adv-y += soft-interface.o
|
||||
batman-adv-y += sysfs.o
|
||||
batman-adv-y += translation-table.o
|
||||
batman-adv-$(CONFIG_BATMAN_ADV_MCAST) += multicast.o
|
||||
|
||||
@@ -347,10 +347,10 @@ static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
|
||||
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
||||
|
||||
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
||||
memcpy(batadv_ogm_packet->orig,
|
||||
hard_iface->net_dev->dev_addr, ETH_ALEN);
|
||||
memcpy(batadv_ogm_packet->prev_sender,
|
||||
hard_iface->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(batadv_ogm_packet->orig,
|
||||
hard_iface->net_dev->dev_addr);
|
||||
ether_addr_copy(batadv_ogm_packet->prev_sender,
|
||||
hard_iface->net_dev->dev_addr);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -830,7 +830,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
|
||||
tvlv_len = ntohs(batadv_ogm_packet->tvlv_len);
|
||||
|
||||
batadv_ogm_packet->ttl--;
|
||||
memcpy(batadv_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN);
|
||||
ether_addr_copy(batadv_ogm_packet->prev_sender, ethhdr->h_source);
|
||||
|
||||
/* apply hop penalty */
|
||||
batadv_ogm_packet->tq = batadv_hop_penalty(batadv_ogm_packet->tq,
|
||||
|
||||
@@ -191,7 +191,7 @@ batadv_backbone_hash_find(struct batadv_priv *bat_priv,
|
||||
if (!hash)
|
||||
return NULL;
|
||||
|
||||
memcpy(search_entry.orig, addr, ETH_ALEN);
|
||||
ether_addr_copy(search_entry.orig, addr);
|
||||
search_entry.vid = vid;
|
||||
|
||||
index = batadv_choose_backbone_gw(&search_entry, hash->size);
|
||||
@@ -305,7 +305,7 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
|
||||
/* normal claim frame
|
||||
* set Ethernet SRC to the clients mac
|
||||
*/
|
||||
memcpy(ethhdr->h_source, mac, ETH_ALEN);
|
||||
ether_addr_copy(ethhdr->h_source, mac);
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
"bla_send_claim(): CLAIM %pM on vid %d\n", mac,
|
||||
BATADV_PRINT_VID(vid));
|
||||
@@ -314,7 +314,7 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
|
||||
/* unclaim frame
|
||||
* set HW SRC to the clients mac
|
||||
*/
|
||||
memcpy(hw_src, mac, ETH_ALEN);
|
||||
ether_addr_copy(hw_src, mac);
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
"bla_send_claim(): UNCLAIM %pM on vid %d\n", mac,
|
||||
BATADV_PRINT_VID(vid));
|
||||
@@ -323,7 +323,7 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
|
||||
/* announcement frame
|
||||
* set HW SRC to the special mac containg the crc
|
||||
*/
|
||||
memcpy(hw_src, mac, ETH_ALEN);
|
||||
ether_addr_copy(hw_src, mac);
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
"bla_send_claim(): ANNOUNCE of %pM on vid %d\n",
|
||||
ethhdr->h_source, BATADV_PRINT_VID(vid));
|
||||
@@ -333,8 +333,8 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, uint8_t *mac,
|
||||
* set HW SRC and header destination to the receiving backbone
|
||||
* gws mac
|
||||
*/
|
||||
memcpy(hw_src, mac, ETH_ALEN);
|
||||
memcpy(ethhdr->h_dest, mac, ETH_ALEN);
|
||||
ether_addr_copy(hw_src, mac);
|
||||
ether_addr_copy(ethhdr->h_dest, mac);
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv,
|
||||
"bla_send_claim(): REQUEST of %pM to %pM on vid %d\n",
|
||||
ethhdr->h_source, ethhdr->h_dest,
|
||||
@@ -395,7 +395,7 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, uint8_t *orig,
|
||||
entry->bat_priv = bat_priv;
|
||||
atomic_set(&entry->request_sent, 0);
|
||||
atomic_set(&entry->wait_periods, 0);
|
||||
memcpy(entry->orig, orig, ETH_ALEN);
|
||||
ether_addr_copy(entry->orig, orig);
|
||||
|
||||
/* one for the hash, one for returning */
|
||||
atomic_set(&entry->refcount, 2);
|
||||
@@ -563,7 +563,7 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
|
||||
struct batadv_bla_claim search_claim;
|
||||
int hash_added;
|
||||
|
||||
memcpy(search_claim.addr, mac, ETH_ALEN);
|
||||
ether_addr_copy(search_claim.addr, mac);
|
||||
search_claim.vid = vid;
|
||||
claim = batadv_claim_hash_find(bat_priv, &search_claim);
|
||||
|
||||
@@ -573,7 +573,7 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
|
||||
if (!claim)
|
||||
return;
|
||||
|
||||
memcpy(claim->addr, mac, ETH_ALEN);
|
||||
ether_addr_copy(claim->addr, mac);
|
||||
claim->vid = vid;
|
||||
claim->lasttime = jiffies;
|
||||
claim->backbone_gw = backbone_gw;
|
||||
@@ -624,7 +624,7 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
|
||||
{
|
||||
struct batadv_bla_claim search_claim, *claim;
|
||||
|
||||
memcpy(search_claim.addr, mac, ETH_ALEN);
|
||||
ether_addr_copy(search_claim.addr, mac);
|
||||
search_claim.vid = vid;
|
||||
claim = batadv_claim_hash_find(bat_priv, &search_claim);
|
||||
if (!claim)
|
||||
@@ -882,7 +882,7 @@ static int batadv_bla_process_claim(struct batadv_priv *bat_priv,
|
||||
proto = ethhdr->h_proto;
|
||||
headlen = ETH_HLEN;
|
||||
if (vid & BATADV_VLAN_HAS_TAG) {
|
||||
vhdr = (struct vlan_ethhdr *)ethhdr;
|
||||
vhdr = vlan_eth_hdr(skb);
|
||||
proto = vhdr->h_vlan_encapsulated_proto;
|
||||
headlen += VLAN_HLEN;
|
||||
}
|
||||
@@ -1103,8 +1103,8 @@ void batadv_bla_update_orig_address(struct batadv_priv *bat_priv,
|
||||
oldif->net_dev->dev_addr))
|
||||
continue;
|
||||
|
||||
memcpy(backbone_gw->orig,
|
||||
primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(backbone_gw->orig,
|
||||
primary_if->net_dev->dev_addr);
|
||||
/* send an announce frame so others will ask for our
|
||||
* claims and update their tables.
|
||||
*/
|
||||
@@ -1310,7 +1310,7 @@ int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
||||
entry = &bat_priv->bla.bcast_duplist[curr];
|
||||
entry->crc = crc;
|
||||
entry->entrytime = jiffies;
|
||||
memcpy(entry->orig, bcast_packet->orig, ETH_ALEN);
|
||||
ether_addr_copy(entry->orig, bcast_packet->orig);
|
||||
bat_priv->bla.bcast_duplist_curr = curr;
|
||||
|
||||
out:
|
||||
@@ -1458,7 +1458,7 @@ int batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
if (is_multicast_ether_addr(ethhdr->h_dest) && is_bcast)
|
||||
goto handled;
|
||||
|
||||
memcpy(search_claim.addr, ethhdr->h_source, ETH_ALEN);
|
||||
ether_addr_copy(search_claim.addr, ethhdr->h_source);
|
||||
search_claim.vid = vid;
|
||||
claim = batadv_claim_hash_find(bat_priv, &search_claim);
|
||||
|
||||
@@ -1547,9 +1547,6 @@ int batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
if (!atomic_read(&bat_priv->bridge_loop_avoidance))
|
||||
goto allow;
|
||||
|
||||
/* in VLAN case, the mac header might not be set. */
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
if (batadv_bla_process_claim(bat_priv, primary_if, skb))
|
||||
goto handled;
|
||||
|
||||
@@ -1560,7 +1557,7 @@ int batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
if (is_multicast_ether_addr(ethhdr->h_dest))
|
||||
goto handled;
|
||||
|
||||
memcpy(search_claim.addr, ethhdr->h_source, ETH_ALEN);
|
||||
ether_addr_copy(search_claim.addr, ethhdr->h_source);
|
||||
search_claim.vid = vid;
|
||||
|
||||
claim = batadv_claim_hash_find(bat_priv, &search_claim);
|
||||
|
||||
@@ -277,7 +277,7 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
|
||||
/* if this entry is already known, just update it */
|
||||
if (dat_entry) {
|
||||
if (!batadv_compare_eth(dat_entry->mac_addr, mac_addr))
|
||||
memcpy(dat_entry->mac_addr, mac_addr, ETH_ALEN);
|
||||
ether_addr_copy(dat_entry->mac_addr, mac_addr);
|
||||
dat_entry->last_update = jiffies;
|
||||
batadv_dbg(BATADV_DBG_DAT, bat_priv,
|
||||
"Entry updated: %pI4 %pM (vid: %d)\n",
|
||||
@@ -292,7 +292,7 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
|
||||
|
||||
dat_entry->ip = ip;
|
||||
dat_entry->vid = vid;
|
||||
memcpy(dat_entry->mac_addr, mac_addr, ETH_ALEN);
|
||||
ether_addr_copy(dat_entry->mac_addr, mac_addr);
|
||||
dat_entry->last_update = jiffies;
|
||||
atomic_set(&dat_entry->refcount, 2);
|
||||
|
||||
@@ -1027,6 +1027,11 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
|
||||
if (!skb_new)
|
||||
goto out;
|
||||
|
||||
/* the rest of the TX path assumes that the mac_header offset pointing
|
||||
* to the inner Ethernet header has been set, therefore reset it now.
|
||||
*/
|
||||
skb_reset_mac_header(skb_new);
|
||||
|
||||
if (vid & BATADV_VLAN_HAS_TAG)
|
||||
skb_new = vlan_insert_tag(skb_new, htons(ETH_P_8021Q),
|
||||
vid & VLAN_VID_MASK);
|
||||
|
||||
@@ -25,6 +25,9 @@
|
||||
|
||||
#include <linux/if_arp.h>
|
||||
|
||||
/**
|
||||
* BATADV_DAT_ADDR_MAX - maximum address value in the DHT space
|
||||
*/
|
||||
#define BATADV_DAT_ADDR_MAX ((batadv_dat_addr_t)~(batadv_dat_addr_t)0)
|
||||
|
||||
void batadv_dat_status_update(struct net_device *net_dev);
|
||||
|
||||
@@ -449,8 +449,8 @@ bool batadv_frag_send_packet(struct sk_buff *skb,
|
||||
frag_header.reserved = 0;
|
||||
frag_header.no = 0;
|
||||
frag_header.total_size = htons(skb->len);
|
||||
memcpy(frag_header.orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
memcpy(frag_header.dest, orig_node->orig, ETH_ALEN);
|
||||
ether_addr_copy(frag_header.orig, primary_if->net_dev->dev_addr);
|
||||
ether_addr_copy(frag_header.dest, orig_node->orig);
|
||||
|
||||
/* Eat and send fragments from the tail of skb */
|
||||
while (skb->len > max_fragment_size) {
|
||||
|
||||
@@ -678,7 +678,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
|
||||
if (!pskb_may_pull(skb, *header_len + ETH_HLEN))
|
||||
return BATADV_DHCP_NO;
|
||||
|
||||
ethhdr = (struct ethhdr *)skb->data;
|
||||
ethhdr = eth_hdr(skb);
|
||||
proto = ethhdr->h_proto;
|
||||
*header_len += ETH_HLEN;
|
||||
|
||||
@@ -687,7 +687,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
|
||||
if (!pskb_may_pull(skb, *header_len + VLAN_HLEN))
|
||||
return BATADV_DHCP_NO;
|
||||
|
||||
vhdr = (struct vlan_ethhdr *)skb->data;
|
||||
vhdr = vlan_eth_hdr(skb);
|
||||
proto = vhdr->h_vlan_encapsulated_proto;
|
||||
*header_len += VLAN_HLEN;
|
||||
}
|
||||
@@ -726,7 +726,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
|
||||
return BATADV_DHCP_NO;
|
||||
|
||||
/* skb->data might have been reallocated by pskb_may_pull() */
|
||||
ethhdr = (struct ethhdr *)skb->data;
|
||||
ethhdr = eth_hdr(skb);
|
||||
if (ntohs(ethhdr->h_proto) == ETH_P_8021Q)
|
||||
ethhdr = (struct ethhdr *)(skb->data + VLAN_HLEN);
|
||||
|
||||
@@ -763,7 +763,7 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
|
||||
if (*p != ETH_ALEN)
|
||||
return BATADV_DHCP_NO;
|
||||
|
||||
memcpy(chaddr, skb->data + chaddr_offset, ETH_ALEN);
|
||||
ether_addr_copy(chaddr, skb->data + chaddr_offset);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -158,6 +158,7 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
|
||||
struct batadv_orig_node *orig_node = NULL;
|
||||
struct batadv_neigh_node *neigh_node = NULL;
|
||||
size_t packet_len = sizeof(struct batadv_icmp_packet);
|
||||
uint8_t *addr;
|
||||
|
||||
if (len < sizeof(struct batadv_icmp_header)) {
|
||||
batadv_dbg(BATADV_DBG_BATMAN, bat_priv,
|
||||
@@ -227,10 +228,10 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
|
||||
goto dst_unreach;
|
||||
|
||||
icmp_packet_rr = (struct batadv_icmp_packet_rr *)icmp_header;
|
||||
if (packet_len == sizeof(*icmp_packet_rr))
|
||||
memcpy(icmp_packet_rr->rr,
|
||||
neigh_node->if_incoming->net_dev->dev_addr,
|
||||
ETH_ALEN);
|
||||
if (packet_len == sizeof(*icmp_packet_rr)) {
|
||||
addr = neigh_node->if_incoming->net_dev->dev_addr;
|
||||
ether_addr_copy(icmp_packet_rr->rr[0], addr);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
@@ -250,7 +251,7 @@ static ssize_t batadv_socket_write(struct file *file, const char __user *buff,
|
||||
goto free_skb;
|
||||
}
|
||||
|
||||
memcpy(icmp_header->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(icmp_header->orig, primary_if->net_dev->dev_addr);
|
||||
|
||||
batadv_send_skb_packet(skb, neigh_node->if_incoming, neigh_node->addr);
|
||||
goto out;
|
||||
|
||||
+17
-2
@@ -34,6 +34,7 @@
|
||||
#include "gateway_client.h"
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "distributed-arp-table.h"
|
||||
#include "multicast.h"
|
||||
#include "gateway_common.h"
|
||||
#include "hash.h"
|
||||
#include "bat_algo.h"
|
||||
@@ -110,6 +111,9 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
||||
spin_lock_init(&bat_priv->tt.last_changeset_lock);
|
||||
spin_lock_init(&bat_priv->tt.commit_lock);
|
||||
spin_lock_init(&bat_priv->gw.list_lock);
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
spin_lock_init(&bat_priv->mcast.want_lists_lock);
|
||||
#endif
|
||||
spin_lock_init(&bat_priv->tvlv.container_list_lock);
|
||||
spin_lock_init(&bat_priv->tvlv.handler_list_lock);
|
||||
spin_lock_init(&bat_priv->softif_vlan_list_lock);
|
||||
@@ -117,9 +121,17 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
||||
INIT_HLIST_HEAD(&bat_priv->forw_bat_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->forw_bcast_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->gw.list);
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
INIT_HLIST_HEAD(&bat_priv->mcast.want_all_unsnoopables_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv4_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv6_list);
|
||||
#endif
|
||||
INIT_LIST_HEAD(&bat_priv->tt.changes_list);
|
||||
INIT_LIST_HEAD(&bat_priv->tt.req_list);
|
||||
INIT_LIST_HEAD(&bat_priv->tt.roam_list);
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
INIT_HLIST_HEAD(&bat_priv->mcast.mla_list);
|
||||
#endif
|
||||
INIT_HLIST_HEAD(&bat_priv->tvlv.container_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->tvlv.handler_list);
|
||||
INIT_HLIST_HEAD(&bat_priv->softif_vlan_list);
|
||||
@@ -145,6 +157,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
||||
goto err;
|
||||
|
||||
batadv_gw_init(bat_priv);
|
||||
batadv_mcast_init(bat_priv);
|
||||
|
||||
atomic_set(&bat_priv->gw.reselect, 0);
|
||||
atomic_set(&bat_priv->mesh_state, BATADV_MESH_ACTIVE);
|
||||
@@ -169,6 +182,8 @@ void batadv_mesh_free(struct net_device *soft_iface)
|
||||
batadv_dat_free(bat_priv);
|
||||
batadv_bla_free(bat_priv);
|
||||
|
||||
batadv_mcast_free(bat_priv);
|
||||
|
||||
/* Free the TT and the originator tables only after having terminated
|
||||
* all the other depending components which may use these structures for
|
||||
* their purposes.
|
||||
@@ -1133,8 +1148,8 @@ void batadv_tvlv_unicast_send(struct batadv_priv *bat_priv, uint8_t *src,
|
||||
unicast_tvlv_packet->reserved = 0;
|
||||
unicast_tvlv_packet->tvlv_len = htons(tvlv_len);
|
||||
unicast_tvlv_packet->align = 0;
|
||||
memcpy(unicast_tvlv_packet->src, src, ETH_ALEN);
|
||||
memcpy(unicast_tvlv_packet->dst, dst, ETH_ALEN);
|
||||
ether_addr_copy(unicast_tvlv_packet->src, src);
|
||||
ether_addr_copy(unicast_tvlv_packet->dst, dst);
|
||||
|
||||
tvlv_buff = (unsigned char *)(unicast_tvlv_packet + 1);
|
||||
tvlv_hdr = (struct batadv_tvlv_hdr *)tvlv_buff;
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||
|
||||
#ifndef BATADV_SOURCE_VERSION
|
||||
#define BATADV_SOURCE_VERSION "2014.1.0"
|
||||
#define BATADV_SOURCE_VERSION "2014.2.0"
|
||||
#endif
|
||||
|
||||
/* B.A.T.M.A.N. parameters */
|
||||
@@ -176,6 +176,8 @@ enum batadv_uev_type {
|
||||
#include <linux/percpu.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/sock.h> /* struct sock */
|
||||
#include <net/addrconf.h> /* ipv6 address stuff */
|
||||
#include <linux/ip.h>
|
||||
#include <net/rtnetlink.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
/* Copyright (C) 2014 B.A.T.M.A.N. contributors:
|
||||
*
|
||||
* Linus Lüssing
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of version 2 of the GNU General Public
|
||||
* License as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _NET_BATMAN_ADV_MULTICAST_H_
|
||||
#define _NET_BATMAN_ADV_MULTICAST_H_
|
||||
|
||||
/**
|
||||
* batadv_forw_mode - the way a packet should be forwarded as
|
||||
* @BATADV_FORW_ALL: forward the packet to all nodes (currently via classic
|
||||
* flooding)
|
||||
* @BATADV_FORW_SINGLE: forward the packet to a single node (currently via the
|
||||
* BATMAN unicast routing protocol)
|
||||
* @BATADV_FORW_NONE: don't forward, drop it
|
||||
*/
|
||||
enum batadv_forw_mode {
|
||||
BATADV_FORW_ALL,
|
||||
BATADV_FORW_SINGLE,
|
||||
BATADV_FORW_NONE,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
|
||||
void batadv_mcast_mla_update(struct batadv_priv *bat_priv);
|
||||
|
||||
enum batadv_forw_mode
|
||||
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
struct batadv_orig_node **mcast_single_orig);
|
||||
|
||||
void batadv_mcast_init(struct batadv_priv *bat_priv);
|
||||
|
||||
void batadv_mcast_free(struct batadv_priv *bat_priv);
|
||||
|
||||
void batadv_mcast_purge_orig(struct batadv_orig_node *orig_node);
|
||||
|
||||
#else
|
||||
|
||||
static inline void batadv_mcast_mla_update(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline enum batadv_forw_mode
|
||||
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
struct batadv_orig_node **mcast_single_orig)
|
||||
{
|
||||
return BATADV_FORW_ALL;
|
||||
}
|
||||
|
||||
static inline int batadv_mcast_init(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void batadv_mcast_free(struct batadv_priv *bat_priv)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void batadv_mcast_purge_orig(struct batadv_orig_node *orig_node)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_BATMAN_ADV_MCAST */
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_MULTICAST_H_ */
|
||||
@@ -819,7 +819,7 @@ static struct batadv_nc_node
|
||||
|
||||
/* Initialize nc_node */
|
||||
INIT_LIST_HEAD(&nc_node->list);
|
||||
memcpy(nc_node->addr, orig_node->orig, ETH_ALEN);
|
||||
ether_addr_copy(nc_node->addr, orig_node->orig);
|
||||
nc_node->orig_node = orig_neigh_node;
|
||||
atomic_set(&nc_node->refcount, 2);
|
||||
|
||||
@@ -941,8 +941,8 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
|
||||
spin_lock_init(&nc_path->packet_list_lock);
|
||||
atomic_set(&nc_path->refcount, 2);
|
||||
nc_path->last_valid = jiffies;
|
||||
memcpy(nc_path->next_hop, dst, ETH_ALEN);
|
||||
memcpy(nc_path->prev_hop, src, ETH_ALEN);
|
||||
ether_addr_copy(nc_path->next_hop, dst);
|
||||
ether_addr_copy(nc_path->prev_hop, src);
|
||||
|
||||
batadv_dbg(BATADV_DBG_NC, bat_priv, "Adding nc_path %pM -> %pM\n",
|
||||
nc_path->prev_hop,
|
||||
@@ -1114,15 +1114,15 @@ static bool batadv_nc_code_packets(struct batadv_priv *bat_priv,
|
||||
coded_packet->ttl = packet1->ttl;
|
||||
|
||||
/* Info about first unicast packet */
|
||||
memcpy(coded_packet->first_source, first_source, ETH_ALEN);
|
||||
memcpy(coded_packet->first_orig_dest, packet1->dest, ETH_ALEN);
|
||||
ether_addr_copy(coded_packet->first_source, first_source);
|
||||
ether_addr_copy(coded_packet->first_orig_dest, packet1->dest);
|
||||
coded_packet->first_crc = packet_id1;
|
||||
coded_packet->first_ttvn = packet1->ttvn;
|
||||
|
||||
/* Info about second unicast packet */
|
||||
memcpy(coded_packet->second_dest, second_dest, ETH_ALEN);
|
||||
memcpy(coded_packet->second_source, second_source, ETH_ALEN);
|
||||
memcpy(coded_packet->second_orig_dest, packet2->dest, ETH_ALEN);
|
||||
ether_addr_copy(coded_packet->second_dest, second_dest);
|
||||
ether_addr_copy(coded_packet->second_source, second_source);
|
||||
ether_addr_copy(coded_packet->second_orig_dest, packet2->dest);
|
||||
coded_packet->second_crc = packet_id2;
|
||||
coded_packet->second_ttl = packet2->ttl;
|
||||
coded_packet->second_ttvn = packet2->ttvn;
|
||||
@@ -1349,8 +1349,8 @@ static void batadv_nc_skb_store_before_coding(struct batadv_priv *bat_priv,
|
||||
|
||||
/* Set the mac header as if we actually sent the packet uncoded */
|
||||
ethhdr = eth_hdr(skb);
|
||||
memcpy(ethhdr->h_source, ethhdr->h_dest, ETH_ALEN);
|
||||
memcpy(ethhdr->h_dest, eth_dst_new, ETH_ALEN);
|
||||
ether_addr_copy(ethhdr->h_source, ethhdr->h_dest);
|
||||
ether_addr_copy(ethhdr->h_dest, eth_dst_new);
|
||||
|
||||
/* Set data pointer to MAC header to mimic packets from our tx path */
|
||||
skb_push(skb, ETH_HLEN);
|
||||
@@ -1636,7 +1636,7 @@ batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
|
||||
/* Reconstruct original mac header */
|
||||
ethhdr = eth_hdr(skb);
|
||||
memcpy(ethhdr, ðhdr_tmp, sizeof(*ethhdr));
|
||||
*ethhdr = ethhdr_tmp;
|
||||
|
||||
/* Select the correct unicast header information based on the location
|
||||
* of our mac address in the coded_packet header
|
||||
@@ -1646,7 +1646,7 @@ batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
* so the Ethernet address must be copied to h_dest and
|
||||
* pkt_type changed from PACKET_OTHERHOST to PACKET_HOST
|
||||
*/
|
||||
memcpy(ethhdr->h_dest, coded_packet_tmp.second_dest, ETH_ALEN);
|
||||
ether_addr_copy(ethhdr->h_dest, coded_packet_tmp.second_dest);
|
||||
skb->pkt_type = PACKET_HOST;
|
||||
|
||||
orig_dest = coded_packet_tmp.second_orig_dest;
|
||||
@@ -1682,7 +1682,7 @@ batadv_nc_skb_decode_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
unicast_packet->packet_type = BATADV_UNICAST;
|
||||
unicast_packet->version = BATADV_COMPAT_VERSION;
|
||||
unicast_packet->ttl = ttl;
|
||||
memcpy(unicast_packet->dest, orig_dest, ETH_ALEN);
|
||||
ether_addr_copy(unicast_packet->dest, orig_dest);
|
||||
unicast_packet->ttvn = ttvn;
|
||||
|
||||
batadv_nc_packet_free(nc_packet);
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "bridge_loop_avoidance.h"
|
||||
#include "network-coding.h"
|
||||
#include "fragmentation.h"
|
||||
#include "multicast.h"
|
||||
|
||||
/* hash class keys */
|
||||
static struct lock_class_key batadv_orig_hash_lock_class_key;
|
||||
@@ -446,7 +447,7 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,
|
||||
INIT_HLIST_HEAD(&neigh_node->ifinfo_list);
|
||||
spin_lock_init(&neigh_node->ifinfo_lock);
|
||||
|
||||
memcpy(neigh_node->addr, neigh_addr, ETH_ALEN);
|
||||
ether_addr_copy(neigh_node->addr, neigh_addr);
|
||||
neigh_node->if_incoming = hard_iface;
|
||||
neigh_node->orig_node = orig_node;
|
||||
|
||||
@@ -557,6 +558,8 @@ static void batadv_orig_node_free_rcu(struct rcu_head *rcu)
|
||||
}
|
||||
spin_unlock_bh(&orig_node->neigh_list_lock);
|
||||
|
||||
batadv_mcast_purge_orig(orig_node);
|
||||
|
||||
/* Free nc_nodes */
|
||||
batadv_nc_purge_orig(orig_node->bat_priv, orig_node, NULL);
|
||||
|
||||
@@ -664,15 +667,17 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
|
||||
/* extra reference for return */
|
||||
atomic_set(&orig_node->refcount, 2);
|
||||
|
||||
orig_node->tt_initialised = false;
|
||||
orig_node->bat_priv = bat_priv;
|
||||
memcpy(orig_node->orig, addr, ETH_ALEN);
|
||||
ether_addr_copy(orig_node->orig, addr);
|
||||
batadv_dat_init_orig_node_addr(orig_node);
|
||||
atomic_set(&orig_node->last_ttvn, 0);
|
||||
orig_node->tt_buff = NULL;
|
||||
orig_node->tt_buff_len = 0;
|
||||
reset_time = jiffies - 1 - msecs_to_jiffies(BATADV_RESET_PROTECTION_MS);
|
||||
orig_node->bcast_seqno_reset = reset_time;
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
orig_node->mcast_flags = BATADV_NO_FLAGS;
|
||||
#endif
|
||||
|
||||
/* create a vlan object for the "untagged" LAN */
|
||||
vlan = batadv_orig_node_vlan_new(orig_node, BATADV_NO_FLAGS);
|
||||
|
||||
+49
-4
@@ -89,6 +89,19 @@ enum batadv_icmp_packettype {
|
||||
BATADV_PARAMETER_PROBLEM = 12,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum batadv_mcast_flags - flags for multicast capabilities and settings
|
||||
* @BATADV_MCAST_WANT_ALL_UNSNOOPABLES: we want all packets destined for
|
||||
* 224.0.0.0/24 or ff02::1
|
||||
* @BATADV_MCAST_WANT_ALL_IPV4: we want all IPv4 multicast packets
|
||||
* @BATADV_MCAST_WANT_ALL_IPV6: we want all IPv6 multicast packets
|
||||
*/
|
||||
enum batadv_mcast_flags {
|
||||
BATADV_MCAST_WANT_ALL_UNSNOOPABLES = BIT(0),
|
||||
BATADV_MCAST_WANT_ALL_IPV4 = BIT(1),
|
||||
BATADV_MCAST_WANT_ALL_IPV6 = BIT(2),
|
||||
};
|
||||
|
||||
/* tt data subtypes */
|
||||
#define BATADV_TT_DATA_TYPE_MASK 0x0F
|
||||
|
||||
@@ -106,10 +119,30 @@ enum batadv_tt_data_flags {
|
||||
BATADV_TT_FULL_TABLE = BIT(4),
|
||||
};
|
||||
|
||||
/* BATADV_TT_CLIENT flags.
|
||||
* Flags from BIT(0) to BIT(7) are sent on the wire, while flags from BIT(8) to
|
||||
* BIT(15) are used for local computation only.
|
||||
* Flags from BIT(4) to BIT(7) are kept in sync with the rest of the network.
|
||||
/**
|
||||
* enum batadv_tt_client_flags - TT client specific flags
|
||||
* @BATADV_TT_CLIENT_DEL: the client has to be deleted from the table
|
||||
* @BATADV_TT_CLIENT_ROAM: the client roamed to/from another node and the new
|
||||
* update telling its new real location has not been received/sent yet
|
||||
* @BATADV_TT_CLIENT_WIFI: this client is connected through a wifi interface.
|
||||
* This information is used by the "AP Isolation" feature
|
||||
* @BATADV_TT_CLIENT_ISOLA: this client is considered "isolated". This
|
||||
* information is used by the Extended Isolation feature
|
||||
* @BATADV_TT_CLIENT_NOPURGE: this client should never be removed from the table
|
||||
* @BATADV_TT_CLIENT_NEW: this client has been added to the local table but has
|
||||
* not been announced yet
|
||||
* @BATADV_TT_CLIENT_PENDING: this client is marked for removal but it is kept
|
||||
* in the table for one more originator interval for consistency purposes
|
||||
* @BATADV_TT_CLIENT_TEMP: this global client has been detected to be part of
|
||||
* the network but no nnode has already announced it
|
||||
*
|
||||
* Bits from 0 to 7 are called _remote flags_ because they are sent on the wire.
|
||||
* Bits from 8 to 15 are called _local flags_ because they are used for local
|
||||
* computations only.
|
||||
*
|
||||
* Bits from 4 to 7 - a subset of remote flags - are ensured to be in sync with
|
||||
* the other nodes in the network. To achieve this goal these flags are included
|
||||
* in the TT CRC computation.
|
||||
*/
|
||||
enum batadv_tt_client_flags {
|
||||
BATADV_TT_CLIENT_DEL = BIT(0),
|
||||
@@ -145,6 +178,7 @@ enum batadv_bla_claimframe {
|
||||
* @BATADV_TVLV_NC: network coding tvlv
|
||||
* @BATADV_TVLV_TT: translation table tvlv
|
||||
* @BATADV_TVLV_ROAM: roaming advertisement tvlv
|
||||
* @BATADV_TVLV_MCAST: multicast capability tvlv
|
||||
*/
|
||||
enum batadv_tvlv_type {
|
||||
BATADV_TVLV_GW = 0x01,
|
||||
@@ -152,6 +186,7 @@ enum batadv_tvlv_type {
|
||||
BATADV_TVLV_NC = 0x03,
|
||||
BATADV_TVLV_TT = 0x04,
|
||||
BATADV_TVLV_ROAM = 0x05,
|
||||
BATADV_TVLV_MCAST = 0x06,
|
||||
};
|
||||
|
||||
#pragma pack(2)
|
||||
@@ -504,4 +539,14 @@ struct batadv_tvlv_roam_adv {
|
||||
__be16 vid;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct batadv_tvlv_mcast_data - payload of a multicast tvlv
|
||||
* @flags: multicast flags announced by the orig node
|
||||
* @reserved: reserved field
|
||||
*/
|
||||
struct batadv_tvlv_mcast_data {
|
||||
uint8_t flags;
|
||||
uint8_t reserved[3];
|
||||
};
|
||||
|
||||
#endif /* _NET_BATMAN_ADV_PACKET_H_ */
|
||||
|
||||
@@ -222,8 +222,8 @@ static int batadv_recv_my_icmp_packet(struct batadv_priv *bat_priv,
|
||||
|
||||
icmph = (struct batadv_icmp_header *)skb->data;
|
||||
|
||||
memcpy(icmph->dst, icmph->orig, ETH_ALEN);
|
||||
memcpy(icmph->orig, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(icmph->dst, icmph->orig);
|
||||
ether_addr_copy(icmph->orig, primary_if->net_dev->dev_addr);
|
||||
icmph->msg_type = BATADV_ECHO_REPLY;
|
||||
icmph->ttl = BATADV_TTL;
|
||||
|
||||
@@ -276,9 +276,8 @@ static int batadv_recv_icmp_ttl_exceeded(struct batadv_priv *bat_priv,
|
||||
|
||||
icmp_packet = (struct batadv_icmp_packet *)skb->data;
|
||||
|
||||
memcpy(icmp_packet->dst, icmp_packet->orig, ETH_ALEN);
|
||||
memcpy(icmp_packet->orig, primary_if->net_dev->dev_addr,
|
||||
ETH_ALEN);
|
||||
ether_addr_copy(icmp_packet->dst, icmp_packet->orig);
|
||||
ether_addr_copy(icmp_packet->orig, primary_if->net_dev->dev_addr);
|
||||
icmp_packet->msg_type = BATADV_TTL_EXCEEDED;
|
||||
icmp_packet->ttl = BATADV_TTL;
|
||||
|
||||
@@ -341,8 +340,8 @@ int batadv_recv_icmp_packet(struct sk_buff *skb,
|
||||
if (icmp_packet_rr->rr_cur >= BATADV_RR_LEN)
|
||||
goto out;
|
||||
|
||||
memcpy(&(icmp_packet_rr->rr[icmp_packet_rr->rr_cur]),
|
||||
ethhdr->h_dest, ETH_ALEN);
|
||||
ether_addr_copy(icmp_packet_rr->rr[icmp_packet_rr->rr_cur],
|
||||
ethhdr->h_dest);
|
||||
icmp_packet_rr->rr_cur++;
|
||||
}
|
||||
|
||||
@@ -664,7 +663,7 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
||||
}
|
||||
|
||||
/* update the packet header */
|
||||
memcpy(unicast_packet->dest, orig_addr, ETH_ALEN);
|
||||
ether_addr_copy(unicast_packet->dest, orig_addr);
|
||||
unicast_packet->ttvn = orig_ttvn;
|
||||
|
||||
ret = true;
|
||||
@@ -774,7 +773,7 @@ static int batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
||||
if (!primary_if)
|
||||
return 0;
|
||||
|
||||
memcpy(unicast_packet->dest, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
|
||||
|
||||
batadv_hardif_free_ref(primary_if);
|
||||
|
||||
|
||||
+16
-15
@@ -27,6 +27,7 @@
|
||||
#include "originator.h"
|
||||
#include "network-coding.h"
|
||||
#include "fragmentation.h"
|
||||
#include "multicast.h"
|
||||
|
||||
static void batadv_send_outstanding_bcast_packet(struct work_struct *work);
|
||||
|
||||
@@ -59,8 +60,8 @@ int batadv_send_skb_packet(struct sk_buff *skb,
|
||||
skb_reset_mac_header(skb);
|
||||
|
||||
ethhdr = eth_hdr(skb);
|
||||
memcpy(ethhdr->h_source, hard_iface->net_dev->dev_addr, ETH_ALEN);
|
||||
memcpy(ethhdr->h_dest, dst_addr, ETH_ALEN);
|
||||
ether_addr_copy(ethhdr->h_source, hard_iface->net_dev->dev_addr);
|
||||
ether_addr_copy(ethhdr->h_dest, dst_addr);
|
||||
ethhdr->h_proto = htons(ETH_P_BATMAN);
|
||||
|
||||
skb_set_network_header(skb, ETH_HLEN);
|
||||
@@ -165,7 +166,7 @@ batadv_send_skb_push_fill_unicast(struct sk_buff *skb, int hdr_size,
|
||||
/* set unicast ttl */
|
||||
unicast_packet->ttl = BATADV_TTL;
|
||||
/* copy the destination for faster routing */
|
||||
memcpy(unicast_packet->dest, orig_node->orig, ETH_ALEN);
|
||||
ether_addr_copy(unicast_packet->dest, orig_node->orig);
|
||||
/* set the destination tt version number */
|
||||
unicast_packet->ttvn = ttvn;
|
||||
|
||||
@@ -220,7 +221,7 @@ bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv,
|
||||
|
||||
uc_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
||||
uc_4addr_packet->u.packet_type = BATADV_UNICAST_4ADDR;
|
||||
memcpy(uc_4addr_packet->src, primary_if->net_dev->dev_addr, ETH_ALEN);
|
||||
ether_addr_copy(uc_4addr_packet->src, primary_if->net_dev->dev_addr);
|
||||
uc_4addr_packet->subtype = packet_subtype;
|
||||
uc_4addr_packet->reserved = 0;
|
||||
|
||||
@@ -248,15 +249,15 @@ out:
|
||||
*
|
||||
* Returns NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
|
||||
*/
|
||||
static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb, int packet_type,
|
||||
int packet_subtype,
|
||||
struct batadv_orig_node *orig_node,
|
||||
unsigned short vid)
|
||||
int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb, int packet_type,
|
||||
int packet_subtype,
|
||||
struct batadv_orig_node *orig_node,
|
||||
unsigned short vid)
|
||||
{
|
||||
struct ethhdr *ethhdr;
|
||||
struct batadv_unicast_packet *unicast_packet;
|
||||
int ret = NET_XMIT_DROP, hdr_size;
|
||||
int ret = NET_XMIT_DROP;
|
||||
|
||||
if (!orig_node)
|
||||
goto out;
|
||||
@@ -265,16 +266,12 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
||||
case BATADV_UNICAST:
|
||||
if (!batadv_send_skb_prepare_unicast(skb, orig_node))
|
||||
goto out;
|
||||
|
||||
hdr_size = sizeof(*unicast_packet);
|
||||
break;
|
||||
case BATADV_UNICAST_4ADDR:
|
||||
if (!batadv_send_skb_prepare_unicast_4addr(bat_priv, skb,
|
||||
orig_node,
|
||||
packet_subtype))
|
||||
goto out;
|
||||
|
||||
hdr_size = sizeof(struct batadv_unicast_4addr_packet);
|
||||
break;
|
||||
default:
|
||||
/* this function supports UNICAST and UNICAST_4ADDR only. It
|
||||
@@ -283,7 +280,10 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
||||
goto out;
|
||||
}
|
||||
|
||||
ethhdr = (struct ethhdr *)(skb->data + hdr_size);
|
||||
/* skb->data might have been reallocated by
|
||||
* batadv_send_skb_prepare_unicast{,_4addr}()
|
||||
*/
|
||||
ethhdr = eth_hdr(skb);
|
||||
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
||||
|
||||
/* inform the destination node that we are still missing a correct route
|
||||
@@ -312,6 +312,7 @@ out:
|
||||
* @packet_type: the batman unicast packet type to use
|
||||
* @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
|
||||
* 4addr packets)
|
||||
* @dst_hint: can be used to override the destination contained in the skb
|
||||
* @vid: the vid to be used to search the translation table
|
||||
*
|
||||
* Look up the recipient node for the destination address in the ethernet
|
||||
|
||||
@@ -36,6 +36,11 @@ bool batadv_send_skb_prepare_unicast_4addr(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb,
|
||||
struct batadv_orig_node *orig_node,
|
||||
int packet_subtype);
|
||||
int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb, int packet_type,
|
||||
int packet_subtype,
|
||||
struct batadv_orig_node *orig_node,
|
||||
unsigned short vid);
|
||||
int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
|
||||
struct sk_buff *skb, int packet_type,
|
||||
int packet_subtype, uint8_t *dst_hint,
|
||||
@@ -47,6 +52,7 @@ int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||
* batadv_send_skb_via_tt - send an skb via TT lookup
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @skb: the payload to send
|
||||
* @dst_hint: can be used to override the destination contained in the skb
|
||||
* @vid: the vid to be used to search the translation table
|
||||
*
|
||||
* Look up the recipient node for the destination address in the ethernet
|
||||
@@ -68,6 +74,7 @@ static inline int batadv_send_skb_via_tt(struct batadv_priv *bat_priv,
|
||||
* @bat_priv: the bat priv with all the soft interface information
|
||||
* @skb: the payload to send
|
||||
* @packet_subtype: the unicast 4addr packet subtype to use
|
||||
* @dst_hint: can be used to override the destination contained in the skb
|
||||
* @vid: the vid to be used to search the translation table
|
||||
*
|
||||
* Look up the recipient node for the destination address in the ethernet
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user