diff options
Diffstat (limited to 'net/batman-adv/routing.c')
-rw-r--r-- | net/batman-adv/routing.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 289df027ecdd..cc3ed93a6d51 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c | |||
@@ -759,6 +759,7 @@ free_skb: | |||
759 | /** | 759 | /** |
760 | * batadv_reroute_unicast_packet() - update the unicast header for re-routing | 760 | * batadv_reroute_unicast_packet() - update the unicast header for re-routing |
761 | * @bat_priv: the bat priv with all the soft interface information | 761 | * @bat_priv: the bat priv with all the soft interface information |
762 | * @skb: unicast packet to process | ||
762 | * @unicast_packet: the unicast header to be updated | 763 | * @unicast_packet: the unicast header to be updated |
763 | * @dst_addr: the payload destination | 764 | * @dst_addr: the payload destination |
764 | * @vid: VLAN identifier | 765 | * @vid: VLAN identifier |
@@ -770,7 +771,7 @@ free_skb: | |||
770 | * Return: true if the packet header has been updated, false otherwise | 771 | * Return: true if the packet header has been updated, false otherwise |
771 | */ | 772 | */ |
772 | static bool | 773 | static bool |
773 | batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, | 774 | batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, struct sk_buff *skb, |
774 | struct batadv_unicast_packet *unicast_packet, | 775 | struct batadv_unicast_packet *unicast_packet, |
775 | u8 *dst_addr, unsigned short vid) | 776 | u8 *dst_addr, unsigned short vid) |
776 | { | 777 | { |
@@ -799,8 +800,10 @@ batadv_reroute_unicast_packet(struct batadv_priv *bat_priv, | |||
799 | } | 800 | } |
800 | 801 | ||
801 | /* update the packet header */ | 802 | /* update the packet header */ |
803 | skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); | ||
802 | ether_addr_copy(unicast_packet->dest, orig_addr); | 804 | ether_addr_copy(unicast_packet->dest, orig_addr); |
803 | unicast_packet->ttvn = orig_ttvn; | 805 | unicast_packet->ttvn = orig_ttvn; |
806 | skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); | ||
804 | 807 | ||
805 | ret = true; | 808 | ret = true; |
806 | out: | 809 | out: |
@@ -841,7 +844,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, | |||
841 | * the packet to | 844 | * the packet to |
842 | */ | 845 | */ |
843 | if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) { | 846 | if (batadv_tt_local_client_is_roaming(bat_priv, ethhdr->h_dest, vid)) { |
844 | if (batadv_reroute_unicast_packet(bat_priv, unicast_packet, | 847 | if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet, |
845 | ethhdr->h_dest, vid)) | 848 | ethhdr->h_dest, vid)) |
846 | batadv_dbg_ratelimited(BATADV_DBG_TT, | 849 | batadv_dbg_ratelimited(BATADV_DBG_TT, |
847 | bat_priv, | 850 | bat_priv, |
@@ -887,7 +890,7 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv, | |||
887 | * destination can possibly be updated and forwarded towards the new | 890 | * destination can possibly be updated and forwarded towards the new |
888 | * target host | 891 | * target host |
889 | */ | 892 | */ |
890 | if (batadv_reroute_unicast_packet(bat_priv, unicast_packet, | 893 | if (batadv_reroute_unicast_packet(bat_priv, skb, unicast_packet, |
891 | ethhdr->h_dest, vid)) { | 894 | ethhdr->h_dest, vid)) { |
892 | batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv, | 895 | batadv_dbg_ratelimited(BATADV_DBG_TT, bat_priv, |
893 | "Rerouting unicast packet to %pM (dst=%pM): TTVN mismatch old_ttvn=%u new_ttvn=%u\n", | 896 | "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, | |||
910 | if (!primary_if) | 913 | if (!primary_if) |
911 | return false; | 914 | return false; |
912 | 915 | ||
916 | /* update the packet header */ | ||
917 | skb_postpull_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); | ||
913 | ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr); | 918 | ether_addr_copy(unicast_packet->dest, primary_if->net_dev->dev_addr); |
919 | unicast_packet->ttvn = curr_ttvn; | ||
920 | skb_postpush_rcsum(skb, unicast_packet, sizeof(*unicast_packet)); | ||
914 | 921 | ||
915 | batadv_hardif_put(primary_if); | 922 | batadv_hardif_put(primary_if); |
916 | 923 | ||
917 | unicast_packet->ttvn = curr_ttvn; | ||
918 | |||
919 | return true; | 924 | return true; |
920 | } | 925 | } |
921 | 926 | ||
@@ -968,14 +973,10 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, | |||
968 | struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL; | 973 | struct batadv_orig_node *orig_node = NULL, *orig_node_gw = NULL; |
969 | int check, hdr_size = sizeof(*unicast_packet); | 974 | int check, hdr_size = sizeof(*unicast_packet); |
970 | enum batadv_subtype subtype; | 975 | enum batadv_subtype subtype; |
971 | struct ethhdr *ethhdr; | ||
972 | int ret = NET_RX_DROP; | 976 | int ret = NET_RX_DROP; |
973 | bool is4addr, is_gw; | 977 | bool is4addr, is_gw; |
974 | 978 | ||
975 | unicast_packet = (struct batadv_unicast_packet *)skb->data; | 979 | unicast_packet = (struct batadv_unicast_packet *)skb->data; |
976 | unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data; | ||
977 | ethhdr = eth_hdr(skb); | ||
978 | |||
979 | is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; | 980 | is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR; |
980 | /* the caller function should have already pulled 2 bytes */ | 981 | /* the caller function should have already pulled 2 bytes */ |
981 | if (is4addr) | 982 | if (is4addr) |
@@ -995,12 +996,14 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, | |||
995 | if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size)) | 996 | if (!batadv_check_unicast_ttvn(bat_priv, skb, hdr_size)) |
996 | goto free_skb; | 997 | goto free_skb; |
997 | 998 | ||
999 | unicast_packet = (struct batadv_unicast_packet *)skb->data; | ||
1000 | |||
998 | /* packet for me */ | 1001 | /* packet for me */ |
999 | if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { | 1002 | if (batadv_is_my_mac(bat_priv, unicast_packet->dest)) { |
1000 | /* If this is a unicast packet from another backgone gw, | 1003 | /* If this is a unicast packet from another backgone gw, |
1001 | * drop it. | 1004 | * drop it. |
1002 | */ | 1005 | */ |
1003 | orig_addr_gw = ethhdr->h_source; | 1006 | orig_addr_gw = eth_hdr(skb)->h_source; |
1004 | orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw); | 1007 | orig_node_gw = batadv_orig_hash_find(bat_priv, orig_addr_gw); |
1005 | if (orig_node_gw) { | 1008 | if (orig_node_gw) { |
1006 | is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw, | 1009 | is_gw = batadv_bla_is_backbone_gw(skb, orig_node_gw, |
@@ -1015,6 +1018,8 @@ int batadv_recv_unicast_packet(struct sk_buff *skb, | |||
1015 | } | 1018 | } |
1016 | 1019 | ||
1017 | if (is4addr) { | 1020 | if (is4addr) { |
1021 | unicast_4addr_packet = | ||
1022 | (struct batadv_unicast_4addr_packet *)skb->data; | ||
1018 | subtype = unicast_4addr_packet->subtype; | 1023 | subtype = unicast_4addr_packet->subtype; |
1019 | batadv_dat_inc_counter(bat_priv, subtype); | 1024 | batadv_dat_inc_counter(bat_priv, subtype); |
1020 | 1025 | ||