With this patch the functions batadv_send_skb_unicast() and
batadv_send_skb_unicast_4addr() are further refined into
batadv_send_skb_via_tt(), batadv_send_skb_via_tt_4addr() and
batadv_send_skb_via_gw(). This way we avoid any "guessing" about where to send
a packet in the unicast forwarding methods and let the callers decide.
This is going to be useful for the upcoming multicast related patches in
particular.
Further, the return values were polished a little to use the more
appropriate NET_XMIT_* defines.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
v3: changed return values to use the appropriate defines
distributed-arp-table.c | 10 +++---
send.c | 87 ++++++++++++++++++++++++++++++++++++-----------
send.h | 51 +++++++++++++++------------
soft-interface.c | 8 +++--
4 files changed, 108 insertions(+), 48 deletions(-)
diff --git a/distributed-arp-table.c b/distributed-arp-table.c
index f2543c2..081c1af 100644
--- a/distributed-arp-table.c
+++ b/distributed-arp-table.c
@@ -1026,13 +1026,13 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
* that a node not using the 4addr packet format doesn't support it.
*/
if (hdr_size == sizeof(struct batadv_unicast_4addr_packet))
- err = batadv_send_skb_unicast_4addr(bat_priv, skb_new,
- BATADV_P_DAT_CACHE_REPLY,
- vid);
+ err = batadv_send_skb_via_tt_4addr(bat_priv, skb_new,
+ BATADV_P_DAT_CACHE_REPLY,
+ vid);
else
- err = batadv_send_skb_unicast(bat_priv, skb_new, vid);
+ err = batadv_send_skb_via_tt(bat_priv, skb_new, vid);
- if (!err) {
+ if (err != NET_XMIT_DROP) {
batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX);
ret = true;
}
diff --git a/send.c b/send.c
index b631355..bf3e915 100644
--- a/send.c
+++ b/send.c
@@ -235,35 +235,31 @@ out:
}
/**
- * batadv_send_generic_unicast_skb - send an skb as unicast
+ * batadv_send_skb_unicast - encapsulate and send an skb via unicast
* @bat_priv: the bat priv with all the soft interface information
* @skb: payload to send
* @packet_type: the batman unicast packet type to use
* @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
* 4addr packets)
+ * @orig_node: the originator to send the packet to
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Wrap the given skb into a batman-adv unicast or unicast-4addr header
+ * depending on whether BATADV_UNICAST or BATADV_UNICAST_4ADDR was supplied
+ * as packet_type. Then send this frame to the given orig_node and release a
+ * reference to this orig_node.
+ *
+ * Return NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
*/
-int batadv_send_skb_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- unsigned short vid)
+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)
{
struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
struct batadv_unicast_packet *unicast_packet;
- struct batadv_orig_node *orig_node;
- int ret = NET_RX_DROP;
-
- /* get routing information */
- if (is_multicast_ether_addr(ethhdr->h_dest))
- orig_node = batadv_gw_get_selected_orig(bat_priv);
- else
- /* check for tt host - increases orig_node refcount.
- * returns NULL in case of AP isolation
- */
- orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
- ethhdr->h_dest, vid);
+ int ret = NET_XMIT_DROP;
if (!orig_node)
goto out;
@@ -294,16 +290,67 @@ int batadv_send_skb_generic_unicast(struct batadv_priv *bat_priv,
unicast_packet->ttvn = unicast_packet->ttvn - 1;
if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
- ret = 0;
+ ret = NET_XMIT_SUCCESS;
out:
if (orig_node)
batadv_orig_node_free_ref(orig_node);
- if (ret == NET_RX_DROP)
+ if (ret == NET_XMIT_DROP)
kfree_skb(skb);
return ret;
}
+/**
+ * batadv_send_skb_via_tt_generic - send an skb via TT lookup
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @packet_type: the batman unicast packet type to use
+ * @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
+ * 4addr packets)
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast or unicast-4addr header depending on whether BATADV_UNICAST or
+ * BATADV_UNICAST_4ADDR was supplied as packet_type. Then send this frame
+ * to the according destination node.
+ *
+ * Return NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
+ */
+int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
+ struct sk_buff *skb, int packet_type,
+ int packet_subtype, unsigned short vid)
+{
+ struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
+ ethhdr->h_dest, vid);
+ return batadv_send_skb_unicast(bat_priv, skb, packet_type,
+ packet_subtype, orig_node, vid);
+}
+
+/**
+ * batadv_send_skb_via_gw - send an skb via gateway lookup
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the currently selected gateway. Wrap the given skb into a batman-adv
+ * unicast header and send this frame to this gateway node.
+ *
+ * Return NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
+ */
+int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid)
+{
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_gw_get_selected_orig(bat_priv);
+ return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
+ orig_node, vid);
+}
+
void batadv_schedule_bat_ogm(struct batadv_hard_iface *hard_iface)
{
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
diff --git a/send.h b/send.h
index c030cb7..817fdb7 100644
--- a/send.h
+++ b/send.h
@@ -38,45 +38,54 @@ 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_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- 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, unsigned short vid);
+int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid);
/**
- * batadv_send_unicast_skb - send the skb encapsulated in a unicast packet
+ * 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
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast header. Then send this frame to the according destination node.
+ *
+ * Return NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
*/
-static inline int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- unsigned short vid)
+static inline int batadv_send_skb_via_tt(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb, BATADV_UNICAST,
- 0, vid);
+ return batadv_send_skb_via_tt_generic(bat_priv, skb, BATADV_UNICAST, 0,
+ vid);
}
/**
- * batadv_send_4addr_unicast_skb - send the skb encapsulated in a unicast 4addr
- * packet
+ * batadv_send_skb_via_tt_4addr - send an skb via TT lookup
* @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
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast-4addr header. Then send this frame to the according destination
+ * node.
+ *
+ * Return NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
*/
-static inline int batadv_send_skb_unicast_4addr(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- int packet_subtype,
- unsigned short vid)
+static inline int batadv_send_skb_via_tt_4addr(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ int packet_subtype,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb,
- BATADV_UNICAST_4ADDR,
- packet_subtype, vid);
+ return batadv_send_skb_via_tt_generic(bat_priv, skb,
+ BATADV_UNICAST_4ADDR,
+ packet_subtype, vid);
}
#endif /* _NET_BATMAN_ADV_SEND_H_ */
diff --git a/soft-interface.c b/soft-interface.c
index d897194..049bcc4 100644
--- a/soft-interface.c
+++ b/soft-interface.c
@@ -289,8 +289,12 @@ static int batadv_interface_tx(struct sk_buff *skb,
batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);
- ret = batadv_send_skb_unicast(bat_priv, skb, vid);
- if (ret != 0)
+ if (is_multicast_ether_addr(ethhdr->h_dest))
+ ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
+ else
+ ret = batadv_send_skb_via_tt(bat_priv, skb, vid);
+
+ if (ret == NET_XMIT_DROP)
goto dropped_freed;
}
--
1.7.10.4
Hello folks,
after version 4 I decided to split the bug TT-VLAN batch in several patchsets to
make them easier to get digested by the maintainers.
This is the sixth iteration of the first patchset.
Difference from v10:
- fixed off-by-one bug in computing the vlan subfolder string length
- use %hu instead of %u to print vid
Difference from v9:
- added rcu_read_lock()/unlock() to batadv_kobj_to_vlan()
Difference from v8:
- remove bat_priv->ap_isolation and converts code using it to use
vlan->ap_isolation
Difference from v7:
- fixed refcounting for mesh_obj (must be increased when used by the untagged
LAN)
- added kernel doc for batadv_softif_destroy_vlan()
- added kernel doc for batadv_vlan_kobj_to_batpriv()
- moved changes to sysfs routine from patch 3/3 to 2/3. In this way patch 2 is
the only one manipulating the sysfs framework
Differences from v6:
- added patch introducing the per-VLAN ap_isolation attribute. It made no sense
to have the new framework without a user. This patch introduces it.
- removed the "novlan" sysfs folder. To avoid confusion and keep backward
compatibility in a sane way, attributes corresponding to the untagged LAN are
located in the root sysfs mesh folder (as it was done before). To implement
this, some changes to the sysfs routines were needed (with respect to v6).
- the array used to build the sysfs subfolder name now has a proper size instead
of a too generic "256".
Differences from v5 are:
- added "untagged VLAN" removal routine. In the previous code the "untagged
VLAN" was added but never removed.
- use the correct vid argument when invoking batadv_tt_local_remove(). One
invocation to the mentioned function was getting a vid that was not ORed with
the HAS_TAG flag. However, such invocation has been enclosed into the new
batadv_softif_destroy_vlan() function introduced to account the previous
point.
- bat_priv->softif_vlan_list is now an hlist instead of of a list.
Thanks to Marek for his feedback.
Cheers,
Antonio Quartulli (3):
batman-adv: add per VLAN interface attribute framework
batman-adv: add sysfs framework for VLAN
batman-adv: make the AP isolation attribute VLAN specific
compat.c | 9 +++
compat.h | 24 +++++++
hard-interface.c | 2 +
main.c | 5 +-
soft-interface.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++++-
soft-interface.h | 4 ++
sysfs-class-net-mesh | 5 +-
sysfs.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++-
sysfs.h | 10 +++
translation-table.c | 27 ++++++--
translation-table.h | 2 +-
types.h | 25 +++++++-
12 files changed, 448 insertions(+), 19 deletions(-)
--
1.8.1.5
With this patch the functions batadv_send_skb_unicast() and
batadv_send_skb_unicast_4addr() are further refined into
batadv_send_skb_via_tt(), batadv_send_skb_via_tt_4addr() and
batadv_send_skb_via_gw(). This way we avoid any "guessing" about where to send
a packet in the unicast forwarding methods and let the callers decide.
This is going to be useful for the upcoming multicast related patches in
particular.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
Made changes according to Marek's and Antonio's feedback on irc:
* changed _tt*()/_gw() to _via_tt*()/_via_gw()
* changed comment about return value:
using defines "NET_RX_SUCCESS"/"NET_RX_DROP"
* changed a "ret = 0" to "ret = NET_RX_SUCCESS"
And added the changes Antonio suggested via eMail.
distributed-arp-table.c | 8 ++---
send.c | 83 +++++++++++++++++++++++++++++++++++++----------
send.h | 51 +++++++++++++++++------------
soft-interface.c | 6 +++-
4 files changed, 104 insertions(+), 44 deletions(-)
diff --git a/distributed-arp-table.c b/distributed-arp-table.c
index f2543c2..12e84f7 100644
--- a/distributed-arp-table.c
+++ b/distributed-arp-table.c
@@ -1026,11 +1026,11 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
* that a node not using the 4addr packet format doesn't support it.
*/
if (hdr_size == sizeof(struct batadv_unicast_4addr_packet))
- err = batadv_send_skb_unicast_4addr(bat_priv, skb_new,
- BATADV_P_DAT_CACHE_REPLY,
- vid);
+ err = batadv_send_skb_via_tt_4addr(bat_priv, skb_new,
+ BATADV_P_DAT_CACHE_REPLY,
+ vid);
else
- err = batadv_send_skb_unicast(bat_priv, skb_new, vid);
+ err = batadv_send_skb_via_tt(bat_priv, skb_new, vid);
if (!err) {
batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX);
diff --git a/send.c b/send.c
index b631355..29b42fe 100644
--- a/send.c
+++ b/send.c
@@ -235,36 +235,32 @@ out:
}
/**
- * batadv_send_generic_unicast_skb - send an skb as unicast
+ * batadv_send_skb_unicast - encapsulate and send an skb via unicast
* @bat_priv: the bat priv with all the soft interface information
* @skb: payload to send
* @packet_type: the batman unicast packet type to use
* @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
* 4addr packets)
+ * @orig_node: the originator to send the packet to
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Wrap the given skb into a batman-adv unicast or unicast-4addr header
+ * depending on whether BATADV_UNICAST or BATADV_UNICAST_4ADDR was supplied
+ * as packet_type. Then send this frame to the given orig_node and release a
+ * reference to this orig_node.
+ *
+ * Return NET_RX_DROP in case of error or NET_RX_SUCCESS otherwise.
*/
-int batadv_send_skb_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- unsigned short vid)
+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)
{
struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
struct batadv_unicast_packet *unicast_packet;
- struct batadv_orig_node *orig_node;
int ret = NET_RX_DROP;
- /* get routing information */
- if (is_multicast_ether_addr(ethhdr->h_dest))
- orig_node = batadv_gw_get_selected_orig(bat_priv);
- else
- /* check for tt host - increases orig_node refcount.
- * returns NULL in case of AP isolation
- */
- orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
- ethhdr->h_dest, vid);
-
if (!orig_node)
goto out;
@@ -294,7 +290,7 @@ int batadv_send_skb_generic_unicast(struct batadv_priv *bat_priv,
unicast_packet->ttvn = unicast_packet->ttvn - 1;
if (batadv_send_skb_to_orig(skb, orig_node, NULL) != NET_XMIT_DROP)
- ret = 0;
+ ret = NET_RX_SUCCESS;
out:
if (orig_node)
@@ -304,6 +300,57 @@ out:
return ret;
}
+/**
+ * batadv_send_skb_via_tt_generic - send an skb via TT lookup
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @packet_type: the batman unicast packet type to use
+ * @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
+ * 4addr packets)
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast or unicast-4addr header depending on whether BATADV_UNICAST or
+ * BATADV_UNICAST_4ADDR was supplied as packet_type. Then send this frame
+ * to the according destination node.
+ *
+ * Return NET_RX_DROP in case of error or NET_RX_SUCCESS otherwise.
+ */
+int batadv_send_skb_via_tt_generic(struct batadv_priv *bat_priv,
+ struct sk_buff *skb, int packet_type,
+ int packet_subtype, unsigned short vid)
+{
+ struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
+ ethhdr->h_dest, vid);
+ return batadv_send_skb_unicast(bat_priv, skb, packet_type,
+ packet_subtype, orig_node, vid);
+}
+
+/**
+ * batadv_send_skb_via_gw - send an skb via gateway lookup
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the currently selected gateway. Wrap the given skb into a batman-adv
+ * unicast header and send this frame to this gateway node.
+ *
+ * Return NET_RX_DROP in case of error or NET_RX_SUCCESS otherwise.
+ */
+int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid)
+{
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_gw_get_selected_orig(bat_priv);
+ return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
+ orig_node, vid);
+}
+
void batadv_schedule_bat_ogm(struct batadv_hard_iface *hard_iface)
{
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
diff --git a/send.h b/send.h
index c030cb7..1bf52ba 100644
--- a/send.h
+++ b/send.h
@@ -38,45 +38,54 @@ 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_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- 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, unsigned short vid);
+int batadv_send_skb_via_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid);
/**
- * batadv_send_unicast_skb - send the skb encapsulated in a unicast packet
+ * 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
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast header. Then send this frame to the according destination node.
+ *
+ * Return NET_RX_DROP in case of error or NET_RX_SUCCESS otherwise.
*/
-static inline int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- unsigned short vid)
+static inline int batadv_send_skb_via_tt(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb, BATADV_UNICAST,
- 0, vid);
+ return batadv_send_skb_via_tt_generic(bat_priv, skb, BATADV_UNICAST, 0,
+ vid);
}
/**
- * batadv_send_4addr_unicast_skb - send the skb encapsulated in a unicast 4addr
- * packet
+ * batadv_send_skb_via_tt_4addr - send an skb via TT lookup
* @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
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Look up the recipient node for the destination address in the ethernet
+ * header via the translation table. Wrap the given skb into a batman-adv
+ * unicast-4addr header. Then send this frame to the according destination
+ * node.
+ *
+ * Return NET_RX_DROP in case of error or NET_RX_SUCCESS otherwise.
*/
-static inline int batadv_send_skb_unicast_4addr(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- int packet_subtype,
- unsigned short vid)
+static inline int batadv_send_skb_via_tt_4addr(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ int packet_subtype,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb,
- BATADV_UNICAST_4ADDR,
- packet_subtype, vid);
+ return batadv_send_skb_via_tt_generic(bat_priv, skb,
+ BATADV_UNICAST_4ADDR,
+ packet_subtype, vid);
}
#endif /* _NET_BATMAN_ADV_SEND_H_ */
diff --git a/soft-interface.c b/soft-interface.c
index d897194..0136e5a 100644
--- a/soft-interface.c
+++ b/soft-interface.c
@@ -289,7 +289,11 @@ static int batadv_interface_tx(struct sk_buff *skb,
batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);
- ret = batadv_send_skb_unicast(bat_priv, skb, vid);
+ if (is_multicast_ether_addr(ethhdr->h_dest))
+ ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
+ else
+ ret = batadv_send_skb_via_tt(bat_priv, skb, vid);
+
if (ret != 0)
goto dropped_freed;
}
--
1.7.10.4
> Message: 3
> Date: Tue, 2 Jul 2013 09:25:31 +0200
> From: Antonio Quartulli <ordex(a)autistici.org>
> To: The list for a Better Approach To Mobile Ad-hoc Networking
> <b.a.t.m.a.n(a)lists.open-mesh.org>
> Subject: Re: [B.A.T.M.A.N.] ttcrc value
> Message-ID: <20130702072531.GA2325(a)ritirata.org>
> Content-Type: text/plain; charset="utf-8"
>
> On Tue, Jul 02, 2013 at 11:28:48AM +0530, ajeet singh wrote:
>> Hello all,
>> We are getting the same value of ttcrc always even after restarting the nodes.
>>
>> Please check the bellow TCPDUMP log,
>>
>> Log 1
>> 09:05:17.118462 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
>> f4:7b:5e:88:7d:a0, seq 2246235905, tq 255, ttvn 1, ttcrc 15939, ttl
>> 50, v 14, flags [...F.], length 26
>> 09:05:17.118764 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
>> f4:7b:5e:88:7d:a0, seq 2246235905, tq 255, ttvn 1, ttcrc 15939, ttl
>> 50, v 14, flags [...F.], length 26
>>
>> Log 2 ( After restart)
>> 00:12:29.480397 BAT f6:7b:5e:88:7d:a0: OGM IV via neigh
>> aa:aa:03:00:00:00, seq 2864163091, tq 255, ttvn 1, ttcrc 15939, ttl
>> 2, v 14, flags [.....], length 26
>> 00:12:29.520254 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
>> aa:aa:03:00:00:00, seq 31648486, tq 255, ttvn 1, ttcrc 15939, ttl 50,
>> v 14, flags [...F.], length 26
>> 00:12:32.488390 BAT f6:7b:5e:88:7d:a0: OGM IV via neigh
>> aa:aa:03:00:00:00, seq 2864163092, tq 255, ttvn 1, ttcrc 15939, ttl
>> 2, v 14, flags [.....], length 26
>> 00:12:32.536432 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
>> aa:aa:03:00:00:00, seq 31648487, tq 255, ttvn 1, ttcrc 15939, ttl 50,
>> v 14, flags [...F.], length 26
>>
>>
>> Is it normal operation?
>
> The TTCRC is computed based _only_ on the address addresses listed in the local
> table. There is no randomness involved, therefore, if the addresses in the table
> are always the same, then also the TTCRC will stay the same.
>
> Is this the case?
>
> cheers,
>
> --
> Antonio Quartulli
>
> ..each of us alone is worth nothing..
> Ernesto "Che" Guevara
>
Hello all,
We are getting the same value of ttcrc always even after restarting the nodes.
Please check the bellow TCPDUMP log,
Log 1
09:05:17.118462 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
f4:7b:5e:88:7d:a0, seq 2246235905, tq 255, ttvn 1, ttcrc 15939, ttl
50, v 14, flags [...F.], length 26
09:05:17.118764 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
f4:7b:5e:88:7d:a0, seq 2246235905, tq 255, ttvn 1, ttcrc 15939, ttl
50, v 14, flags [...F.], length 26
Log 2 ( After restart)
00:12:29.480397 BAT f6:7b:5e:88:7d:a0: OGM IV via neigh
aa:aa:03:00:00:00, seq 2864163091, tq 255, ttvn 1, ttcrc 15939, ttl
2, v 14, flags [.....], length 26
00:12:29.520254 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
aa:aa:03:00:00:00, seq 31648486, tq 255, ttvn 1, ttcrc 15939, ttl 50,
v 14, flags [...F.], length 26
00:12:32.488390 BAT f6:7b:5e:88:7d:a0: OGM IV via neigh
aa:aa:03:00:00:00, seq 2864163092, tq 255, ttvn 1, ttcrc 15939, ttl
2, v 14, flags [.....], length 26
00:12:32.536432 BAT f4:7b:5e:88:7d:a0: OGM IV via neigh
aa:aa:03:00:00:00, seq 31648487, tq 255, ttvn 1, ttcrc 15939, ttl 50,
v 14, flags [...F.], length 26
Is it normal operation?
Thanks
Ajeet
With this patch the functions batadv_send_skb_unicast() and
batadv_send_skb_unicast_4addr() are further refined into
batadv_send_skb_tt(), batadv_send_skb_tt_4addr() and
batadv_send_skb_gw(). This way we avoid any guessing about where to send
a packet in the unicast forwarding methods and let the callers decide.
This is going to be useful for the upcoming multicast related patches in
particular.
Signed-off-by: Linus Lüssing <linus.luessing(a)web.de>
---
distributed-arp-table.c | 7 ++--
send.c | 88 ++++++++++++++++++++++++++++++++++++++---------
send.h | 52 ++++++++++++++++++----------
soft-interface.c | 6 +++-
4 files changed, 112 insertions(+), 41 deletions(-)
diff --git a/distributed-arp-table.c b/distributed-arp-table.c
index f2543c2..5399c29 100644
--- a/distributed-arp-table.c
+++ b/distributed-arp-table.c
@@ -1026,11 +1026,10 @@ bool batadv_dat_snoop_incoming_arp_request(struct batadv_priv *bat_priv,
* that a node not using the 4addr packet format doesn't support it.
*/
if (hdr_size == sizeof(struct batadv_unicast_4addr_packet))
- err = batadv_send_skb_unicast_4addr(bat_priv, skb_new,
- BATADV_P_DAT_CACHE_REPLY,
- vid);
+ err = batadv_send_skb_tt_4addr(bat_priv, skb_new,
+ BATADV_P_DAT_CACHE_REPLY, vid);
else
- err = batadv_send_skb_unicast(bat_priv, skb_new, vid);
+ err = batadv_send_skb_tt(bat_priv, skb_new, vid);
if (!err) {
batadv_inc_counter(bat_priv, BATADV_CNT_DAT_CACHED_REPLY_TX);
diff --git a/send.c b/send.c
index b631355..c9c33d8 100644
--- a/send.c
+++ b/send.c
@@ -235,36 +235,34 @@ out:
}
/**
- * batadv_send_generic_unicast_skb - send an skb as unicast
+ * batadv_send_skb_unicast - encapsulate and send an skb via unicast
* @bat_priv: the bat priv with all the soft interface information
* @skb: payload to send
* @packet_type: the batman unicast packet type to use
* @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
* 4addr packets)
+ * @orig_node: the originator to send the packet to
* @vid: the vid to be used to search the translation table
*
- * Returns 1 in case of error or 0 otherwise.
+ * Wrap the given skb into a batman-adv unicast or unicast-4addr header
+ * depending on whether BATADV_UNICAST or BATADV_UNICAST_4ADDR was supplied
+ * as packet_type.
+ *
+ * Then send this frame to the given orig_node and release a reference to
+ * this orig_node.
+ *
+ * Return 1 in case of error or 0 otherwise.
*/
-int batadv_send_skb_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- unsigned short vid)
+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)
{
struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
struct batadv_unicast_packet *unicast_packet;
- struct batadv_orig_node *orig_node;
int ret = NET_RX_DROP;
- /* get routing information */
- if (is_multicast_ether_addr(ethhdr->h_dest))
- orig_node = batadv_gw_get_selected_orig(bat_priv);
- else
- /* check for tt host - increases orig_node refcount.
- * returns NULL in case of AP isolation
- */
- orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
- ethhdr->h_dest, vid);
-
if (!orig_node)
goto out;
@@ -304,6 +302,62 @@ out:
return ret;
}
+/**
+ * batadv_send_skb_generic_tt - send an skb to a translation table node
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @packet_type: the batman unicast packet type to use
+ * @packet_subtype: the unicast 4addr packet subtype (only relevant for unicast
+ * 4addr packets)
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the destination node for the destination address in the ethernet
+ * header via the translation table.
+ *
+ * Wrap the given skb into a batman-adv unicast or unicast-4addr header
+ * depending on whether BATADV_UNICAST or BATADV_UNICAST_4ADDR was supplied
+ * as packet_type.
+ *
+ * Then send this frame to the according destination node.
+ *
+ * Return 1 in case of error or 0 otherwise.
+ */
+int batadv_send_skb_generic_tt(struct batadv_priv *bat_priv,
+ struct sk_buff *skb, int packet_type,
+ int packet_subtype, unsigned short vid)
+{
+ struct ethhdr *ethhdr = (struct ethhdr *)skb->data;
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
+ ethhdr->h_dest, vid);
+ return batadv_send_skb_unicast(bat_priv, skb, packet_type,
+ packet_subtype, orig_node, vid);
+}
+
+/**
+ * batadv_send_skb_gw - send an skb to a gateway node
+ * @bat_priv: the bat priv with all the soft interface information
+ * @skb: payload to send
+ * @vid: the vid to be used to search the translation table
+ *
+ * Look up the currently selected gateway.
+ *
+ * Wrap the given skb into a batman-adv unicast header and send this frame
+ * to this gateway node.
+ *
+ * Return 1 in case of error or 0 otherwise.
+ */
+int batadv_send_skb_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid)
+{
+ struct batadv_orig_node *orig_node;
+
+ orig_node = batadv_gw_get_selected_orig(bat_priv);
+ return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
+ orig_node, vid);
+}
+
void batadv_schedule_bat_ogm(struct batadv_hard_iface *hard_iface)
{
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
diff --git a/send.h b/send.h
index c030cb7..87c4426 100644
--- a/send.h
+++ b/send.h
@@ -38,45 +38,59 @@ 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_generic_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb, int packet_type,
- int packet_subtype,
- unsigned short vid);
+int batadv_send_skb_generic_tt(struct batadv_priv *bat_priv,
+ struct sk_buff *skb, int packet_type,
+ int packet_subtype, unsigned short vid);
+int batadv_send_skb_gw(struct batadv_priv *bat_priv, struct sk_buff *skb,
+ unsigned short vid);
/**
- * batadv_send_unicast_skb - send the skb encapsulated in a unicast packet
+ * batadv_send_skb_tt - send an skb to a translation table node
* @bat_priv: the bat priv with all the soft interface information
* @skb: the payload to send
* @vid: the vid to be used to search the translation table
*
+ * Look up the destination node for the destination address in the ethernet
+ * header via the translation table.
+ *
+ * Wrap the given skb into a batman-adv unicast header.
+ *
+ * Then send this frame to the according destination node.
+ *
* Returns 1 in case of error or 0 otherwise.
*/
-static inline int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- unsigned short vid)
+static inline int batadv_send_skb_tt(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb, BATADV_UNICAST,
- 0, vid);
+ return batadv_send_skb_generic_tt(bat_priv, skb, BATADV_UNICAST, 0,
+ vid);
}
/**
- * batadv_send_4addr_unicast_skb - send the skb encapsulated in a unicast 4addr
- * packet
+ * batadv_send_skb_tt_4addr - send an skb to a translation table node
* @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
* @vid: the vid to be used to search the translation table
*
+ * Look up the destination node for the destination address in the ethernet
+ * header via the translation table.
+ *
+ * Wrap the given skb into a batman-adv unicast-4addr header.
+ *
+ * Then send this frame to the according destination node.
+ *
* Returns 1 in case of error or 0 otherwise.
*/
-static inline int batadv_send_skb_unicast_4addr(struct batadv_priv *bat_priv,
- struct sk_buff *skb,
- int packet_subtype,
- unsigned short vid)
+static inline int batadv_send_skb_tt_4addr(struct batadv_priv *bat_priv,
+ struct sk_buff *skb,
+ int packet_subtype,
+ unsigned short vid)
{
- return batadv_send_skb_generic_unicast(bat_priv, skb,
- BATADV_UNICAST_4ADDR,
- packet_subtype, vid);
+ return batadv_send_skb_generic_tt(bat_priv, skb,
+ BATADV_UNICAST_4ADDR,
+ packet_subtype, vid);
}
#endif /* _NET_BATMAN_ADV_SEND_H_ */
diff --git a/soft-interface.c b/soft-interface.c
index d897194..e84ef45 100644
--- a/soft-interface.c
+++ b/soft-interface.c
@@ -289,7 +289,11 @@ static int batadv_interface_tx(struct sk_buff *skb,
batadv_dat_snoop_outgoing_arp_reply(bat_priv, skb);
- ret = batadv_send_skb_unicast(bat_priv, skb, vid);
+ if (is_multicast_ether_addr(ethhdr->h_dest))
+ ret = batadv_send_skb_gw(bat_priv, skb, vid);
+ else
+ ret = batadv_send_skb_tt(bat_priv, skb, vid);
+
if (ret != 0)
goto dropped_freed;
}
--
1.7.10.4