|
@@ -759,6 +759,7 @@ free_skb:
|
|
|
/**
|
|
|
* batadv_reroute_unicast_packet() - update the unicast header for re-routing
|
|
|
* @bat_priv: the bat priv with all the soft interface information
|
|
|
+ * @skb: unicast packet to process
|
|
|
* @unicast_packet: the unicast header to be updated
|
|
|
* @dst_addr: the payload destination
|
|
|
* @vid: VLAN identifier
|
|
@@ -770,7 +771,7 @@ free_skb:
|
|
|
* Return: true if the packet header has been updated, false otherwise
|
|
|
*/
|
|
|
static bool
|
|
|
-batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
|
|
+batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
|
struct batadv_unicast_packet *unicast_packet,
|
|
|
u8 *dst_addr, unsigned short vid)
|
|
|
{
|
|
@@ -799,8 +800,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv,
|
|
|
}
|
|
|
|
|
|
/* update the packet header */
|
|
|
+ skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
|
|
ether_addr_copy(unicast_packet->dest, orig_addr);
|
|
|
unicast_packet->ttvn = orig_ttvn;
|
|
|
+ skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
|
|
|
|
|
ret = true;
|
|
|
out:
|
|
@@ -841,7 +844,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
|
|
* the packet to
|
|
|
*/
|
|
|
if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) {
|
|
|
- if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
|
|
|
+ if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
|
|
|
ethhdr->h_dest, vid))
|
|
|
batadv_dbg_ratelimited(BATADV_DBG_TT,
|
|
|
bat_priv,
|
|
@@ -887,7 +890,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
|
|
* destination can possibly be updated and forwarded towards the new
|
|
|
* target host
|
|
|
*/
|
|
|
- if (batadv_reroute_unicast_packet(bat_priv, unicast_packet,
|
|
|
+ if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet,
|
|
|
ethhdr->h_dest, vid)) {
|
|
|
batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv,
|
|
|
"Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n",
|
|
@@ -910,12 +913,14 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
|
|
if (!primary_if)
|
|
|
return false;
|
|
|
|
|
|
+ /* update the packet header */
|
|
|
+ skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
|
|
ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr);
|
|
|
+ unicast_packet->ttvn = curr_ttvn;
|
|
|
+ skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet));
|
|
|
|
|
|
batadv_hardif_put(primary_if);
|
|
|
|
|
|
- unicast_packet->ttvn = curr_ttvn;
|
|
|
-
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -968,14 +973,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
|
|
struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL;
|
|
|
int check, hdr_size = sizeof(*unicast_packet);
|
|
|
enum batadv_subtype subtype;
|
|
|
- struct ethhdr *ethhdr;
|
|
|
int ret = NET_RX_DROP;
|
|
|
bool is4addr, is_gw;
|
|
|
|
|
|
unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
|
|
- unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
|
|
|
- ethhdr = eth_hdr(skb);
|
|
|
-
|
|
|
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
|
|
|
/* the caller function should have already pulled 2 bytes */
|
|
|
if (is4addr)
|
|
@@ -995,12 +996,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
|
|
if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size))
|
|
|
goto free_skb;
|
|
|
|
|
|
+ unicast_packet = (struct batadv_unicast_packet *)skb->data;
|
|
|
+
|
|
|
/* packet for me */
|
|
|
if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) {
|
|
|
/* If this is a unicast packet from another backgone gw,
|
|
|
* drop it.
|
|
|
*/
|
|
|
- orig_addr_gw = ethhdr->h_source;
|
|
|
+ orig_addr_gw = eth_hdr(skb)->h_source;
|
|
|
orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw);
|
|
|
if (orig_node_gw) {
|
|
|
is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw,
|
|
@@ -1015,6 +1018,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
if (is4addr) {
|
|
|
+ unicast_4addr_packet =
|
|
|
+ (struct batadv_unicast_4addr_packet *)skb->data;
|
|
|
subtype = unicast_4addr_packet->subtype;
|
|
|
batadv_dat_inc_counter(bat_priv, subtype);
|
|
|
|