batman-adv: Modified forwarding behaviour for multicast packets
[cascardo/linux.git] / net / batman-adv / send.c
index 579f5f0..8bee5e8 100644 (file)
@@ -59,8 +59,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 +165,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 +220,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,13 +248,13 @@ 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 ethhdr *)skb->data;
+       struct ethhdr *ethhdr;
        struct batadv_unicast_packet *unicast_packet;
        int ret = NET_XMIT_DROP;
 
@@ -279,6 +279,10 @@ static int batadv_send_skb_unicast(struct batadv_priv *bat_priv,
                goto out;
        }
 
+       /* 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
@@ -307,6 +311,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