diff options
Diffstat (limited to 'net/batman-adv/bat_iv_ogm.c')
-rw-r--r-- | net/batman-adv/bat_iv_ogm.c | 206 |
1 files changed, 107 insertions, 99 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index 94e6fdbdd13d..025df7c9a2d9 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
@@ -179,16 +179,16 @@ static void bat_iv_ogm_send_to_if(struct forw_packet *forw_packet, | |||
179 | fwd_str = (packet_num > 0 ? "Forwarding" : (forw_packet->own ? | 179 | fwd_str = (packet_num > 0 ? "Forwarding" : (forw_packet->own ? |
180 | "Sending own" : | 180 | "Sending own" : |
181 | "Forwarding")); | 181 | "Forwarding")); |
182 | bat_dbg(DBG_BATMAN, bat_priv, | 182 | batadv_dbg(DBG_BATMAN, bat_priv, |
183 | "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", | 183 | "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", |
184 | fwd_str, (packet_num > 0 ? "aggregated " : ""), | 184 | fwd_str, (packet_num > 0 ? "aggregated " : ""), |
185 | batman_ogm_packet->orig, | 185 | batman_ogm_packet->orig, |
186 | ntohl(batman_ogm_packet->seqno), | 186 | ntohl(batman_ogm_packet->seqno), |
187 | batman_ogm_packet->tq, batman_ogm_packet->header.ttl, | 187 | batman_ogm_packet->tq, batman_ogm_packet->header.ttl, |
188 | (batman_ogm_packet->flags & DIRECTLINK ? | 188 | (batman_ogm_packet->flags & DIRECTLINK ? |
189 | "on" : "off"), | 189 | "on" : "off"), |
190 | batman_ogm_packet->ttvn, hard_iface->net_dev->name, | 190 | batman_ogm_packet->ttvn, hard_iface->net_dev->name, |
191 | hard_iface->net_dev->dev_addr); | 191 | hard_iface->net_dev->dev_addr); |
192 | 192 | ||
193 | buff_pos += BATMAN_OGM_HLEN; | 193 | buff_pos += BATMAN_OGM_HLEN; |
194 | buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes); | 194 | buff_pos += batadv_tt_len(batman_ogm_packet->tt_num_changes); |
@@ -243,14 +243,14 @@ static void bat_iv_ogm_emit(struct forw_packet *forw_packet) | |||
243 | (forw_packet->own && (forw_packet->if_incoming != primary_if))) { | 243 | (forw_packet->own && (forw_packet->if_incoming != primary_if))) { |
244 | 244 | ||
245 | /* FIXME: what about aggregated packets ? */ | 245 | /* FIXME: what about aggregated packets ? */ |
246 | bat_dbg(DBG_BATMAN, bat_priv, | 246 | batadv_dbg(DBG_BATMAN, bat_priv, |
247 | "%s packet (originator %pM, seqno %u, TTL %d) on interface %s [%pM]\n", | 247 | "%s packet (originator %pM, seqno %u, TTL %d) on interface %s [%pM]\n", |
248 | (forw_packet->own ? "Sending own" : "Forwarding"), | 248 | (forw_packet->own ? "Sending own" : "Forwarding"), |
249 | batman_ogm_packet->orig, | 249 | batman_ogm_packet->orig, |
250 | ntohl(batman_ogm_packet->seqno), | 250 | ntohl(batman_ogm_packet->seqno), |
251 | batman_ogm_packet->header.ttl, | 251 | batman_ogm_packet->header.ttl, |
252 | forw_packet->if_incoming->net_dev->name, | 252 | forw_packet->if_incoming->net_dev->name, |
253 | forw_packet->if_incoming->net_dev->dev_addr); | 253 | forw_packet->if_incoming->net_dev->dev_addr); |
254 | 254 | ||
255 | /* skb is only used once and than forw_packet is free'd */ | 255 | /* skb is only used once and than forw_packet is free'd */ |
256 | batadv_send_skb_packet(forw_packet->skb, | 256 | batadv_send_skb_packet(forw_packet->skb, |
@@ -373,8 +373,8 @@ static void bat_iv_ogm_aggregate_new(const unsigned char *packet_buff, | |||
373 | /* own packet should always be scheduled */ | 373 | /* own packet should always be scheduled */ |
374 | if (!own_packet) { | 374 | if (!own_packet) { |
375 | if (!atomic_dec_not_zero(&bat_priv->batman_queue_left)) { | 375 | if (!atomic_dec_not_zero(&bat_priv->batman_queue_left)) { |
376 | bat_dbg(DBG_BATMAN, bat_priv, | 376 | batadv_dbg(DBG_BATMAN, bat_priv, |
377 | "batman packet queue full\n"); | 377 | "batman packet queue full\n"); |
378 | goto out; | 378 | goto out; |
379 | } | 379 | } |
380 | } | 380 | } |
@@ -521,7 +521,7 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, | |||
521 | uint8_t tt_num_changes; | 521 | uint8_t tt_num_changes; |
522 | 522 | ||
523 | if (batman_ogm_packet->header.ttl <= 1) { | 523 | if (batman_ogm_packet->header.ttl <= 1) { |
524 | bat_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n"); | 524 | batadv_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n"); |
525 | return; | 525 | return; |
526 | } | 526 | } |
527 | 527 | ||
@@ -546,9 +546,9 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, | |||
546 | /* apply hop penalty */ | 546 | /* apply hop penalty */ |
547 | batman_ogm_packet->tq = hop_penalty(batman_ogm_packet->tq, bat_priv); | 547 | batman_ogm_packet->tq = hop_penalty(batman_ogm_packet->tq, bat_priv); |
548 | 548 | ||
549 | bat_dbg(DBG_BATMAN, bat_priv, | 549 | batadv_dbg(DBG_BATMAN, bat_priv, |
550 | "Forwarding packet: tq: %i, ttl: %i\n", | 550 | "Forwarding packet: tq: %i, ttl: %i\n", |
551 | batman_ogm_packet->tq, batman_ogm_packet->header.ttl); | 551 | batman_ogm_packet->tq, batman_ogm_packet->header.ttl); |
552 | 552 | ||
553 | /* switch of primaries first hop flag when forwarding */ | 553 | /* switch of primaries first hop flag when forwarding */ |
554 | batman_ogm_packet->flags &= ~PRIMARIES_FIRST_HOP; | 554 | batman_ogm_packet->flags &= ~PRIMARIES_FIRST_HOP; |
@@ -625,16 +625,18 @@ static void bat_iv_ogm_orig_update(struct bat_priv *bat_priv, | |||
625 | struct orig_node *orig_node_tmp; | 625 | struct orig_node *orig_node_tmp; |
626 | struct hlist_node *node; | 626 | struct hlist_node *node; |
627 | uint8_t bcast_own_sum_orig, bcast_own_sum_neigh; | 627 | uint8_t bcast_own_sum_orig, bcast_own_sum_neigh; |
628 | uint8_t *neigh_addr; | ||
628 | 629 | ||
629 | bat_dbg(DBG_BATMAN, bat_priv, | 630 | batadv_dbg(DBG_BATMAN, bat_priv, |
630 | "update_originator(): Searching and updating originator entry of received packet\n"); | 631 | "update_originator(): Searching and updating originator entry of received packet\n"); |
631 | 632 | ||
632 | rcu_read_lock(); | 633 | rcu_read_lock(); |
633 | hlist_for_each_entry_rcu(tmp_neigh_node, node, | 634 | hlist_for_each_entry_rcu(tmp_neigh_node, node, |
634 | &orig_node->neigh_list, list) { | 635 | &orig_node->neigh_list, list) { |
635 | if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) && | 636 | neigh_addr = tmp_neigh_node->addr; |
636 | (tmp_neigh_node->if_incoming == if_incoming) && | 637 | if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && |
637 | atomic_inc_not_zero(&tmp_neigh_node->refcount)) { | 638 | tmp_neigh_node->if_incoming == if_incoming && |
639 | atomic_inc_not_zero(&tmp_neigh_node->refcount)) { | ||
638 | if (neigh_node) | 640 | if (neigh_node) |
639 | batadv_neigh_node_free_ref(neigh_node); | 641 | batadv_neigh_node_free_ref(neigh_node); |
640 | neigh_node = tmp_neigh_node; | 642 | neigh_node = tmp_neigh_node; |
@@ -667,8 +669,8 @@ static void bat_iv_ogm_orig_update(struct bat_priv *bat_priv, | |||
667 | if (!neigh_node) | 669 | if (!neigh_node) |
668 | goto unlock; | 670 | goto unlock; |
669 | } else | 671 | } else |
670 | bat_dbg(DBG_BATMAN, bat_priv, | 672 | batadv_dbg(DBG_BATMAN, bat_priv, |
671 | "Updating existing last-hop neighbor of originator\n"); | 673 | "Updating existing last-hop neighbor of originator\n"); |
672 | 674 | ||
673 | rcu_read_unlock(); | 675 | rcu_read_unlock(); |
674 | 676 | ||
@@ -774,7 +776,8 @@ static int bat_iv_ogm_calc_tq(struct orig_node *orig_node, | |||
774 | hlist_for_each_entry_rcu(tmp_neigh_node, node, | 776 | hlist_for_each_entry_rcu(tmp_neigh_node, node, |
775 | &orig_neigh_node->neigh_list, list) { | 777 | &orig_neigh_node->neigh_list, list) { |
776 | 778 | ||
777 | if (!compare_eth(tmp_neigh_node->addr, orig_neigh_node->orig)) | 779 | if (!batadv_compare_eth(tmp_neigh_node->addr, |
780 | orig_neigh_node->orig)) | ||
778 | continue; | 781 | continue; |
779 | 782 | ||
780 | if (tmp_neigh_node->if_incoming != if_incoming) | 783 | if (tmp_neigh_node->if_incoming != if_incoming) |
@@ -844,10 +847,11 @@ static int bat_iv_ogm_calc_tq(struct orig_node *orig_node, | |||
844 | * tq_asym_penalty) / | 847 | * tq_asym_penalty) / |
845 | (TQ_MAX_VALUE * TQ_MAX_VALUE)); | 848 | (TQ_MAX_VALUE * TQ_MAX_VALUE)); |
846 | 849 | ||
847 | bat_dbg(DBG_BATMAN, bat_priv, | 850 | batadv_dbg(DBG_BATMAN, bat_priv, |
848 | "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n", | 851 | "bidirectional: orig = %-15pM neigh = %-15pM => own_bcast = %2i, real recv = %2i, local tq: %3i, asym_penalty: %3i, total tq: %3i\n", |
849 | orig_node->orig, orig_neigh_node->orig, total_count, | 852 | orig_node->orig, orig_neigh_node->orig, total_count, |
850 | neigh_rq_count, tq_own, tq_asym_penalty, batman_ogm_packet->tq); | 853 | neigh_rq_count, tq_own, |
854 | tq_asym_penalty, batman_ogm_packet->tq); | ||
851 | 855 | ||
852 | /* if link has the minimum required transmission quality | 856 | /* if link has the minimum required transmission quality |
853 | * consider it bidirectional | 857 | * consider it bidirectional |
@@ -883,6 +887,7 @@ static int bat_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
883 | int need_update = 0; | 887 | int need_update = 0; |
884 | int set_mark, ret = -1; | 888 | int set_mark, ret = -1; |
885 | uint32_t seqno = ntohl(batman_ogm_packet->seqno); | 889 | uint32_t seqno = ntohl(batman_ogm_packet->seqno); |
890 | uint8_t *neigh_addr; | ||
886 | 891 | ||
887 | orig_node = batadv_get_orig_node(bat_priv, batman_ogm_packet->orig); | 892 | orig_node = batadv_get_orig_node(bat_priv, batman_ogm_packet->orig); |
888 | if (!orig_node) | 893 | if (!orig_node) |
@@ -905,8 +910,9 @@ static int bat_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
905 | orig_node->last_real_seqno, | 910 | orig_node->last_real_seqno, |
906 | seqno); | 911 | seqno); |
907 | 912 | ||
908 | if (compare_eth(tmp_neigh_node->addr, ethhdr->h_source) && | 913 | neigh_addr = tmp_neigh_node->addr; |
909 | (tmp_neigh_node->if_incoming == if_incoming)) | 914 | if (batadv_compare_eth(neigh_addr, ethhdr->h_source) && |
915 | tmp_neigh_node->if_incoming == if_incoming) | ||
910 | set_mark = 1; | 916 | set_mark = 1; |
911 | else | 917 | else |
912 | set_mark = 0; | 918 | set_mark = 0; |
@@ -923,9 +929,9 @@ static int bat_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
923 | rcu_read_unlock(); | 929 | rcu_read_unlock(); |
924 | 930 | ||
925 | if (need_update) { | 931 | if (need_update) { |
926 | bat_dbg(DBG_BATMAN, bat_priv, | 932 | batadv_dbg(DBG_BATMAN, bat_priv, |
927 | "updating last_seqno: old %u, new %u\n", | 933 | "updating last_seqno: old %u, new %u\n", |
928 | orig_node->last_real_seqno, seqno); | 934 | orig_node->last_real_seqno, seqno); |
929 | orig_node->last_real_seqno = seqno; | 935 | orig_node->last_real_seqno = seqno; |
930 | } | 936 | } |
931 | 937 | ||
@@ -954,6 +960,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
954 | bool is_from_best_next_hop = false; | 960 | bool is_from_best_next_hop = false; |
955 | int is_duplicate; | 961 | int is_duplicate; |
956 | uint32_t if_incoming_seqno; | 962 | uint32_t if_incoming_seqno; |
963 | uint8_t *prev_sender; | ||
957 | 964 | ||
958 | /* Silently drop when the batman packet is actually not a | 965 | /* Silently drop when the batman packet is actually not a |
959 | * correct packet. | 966 | * correct packet. |
@@ -975,18 +982,19 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
975 | 982 | ||
976 | has_directlink_flag = (batman_ogm_packet->flags & DIRECTLINK ? 1 : 0); | 983 | has_directlink_flag = (batman_ogm_packet->flags & DIRECTLINK ? 1 : 0); |
977 | 984 | ||
978 | if (compare_eth(ethhdr->h_source, batman_ogm_packet->orig)) | 985 | if (batadv_compare_eth(ethhdr->h_source, batman_ogm_packet->orig)) |
979 | is_single_hop_neigh = true; | 986 | is_single_hop_neigh = true; |
980 | 987 | ||
981 | bat_dbg(DBG_BATMAN, bat_priv, | 988 | batadv_dbg(DBG_BATMAN, bat_priv, |
982 | "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %u, changes %u, td %d, TTL %d, V %d, IDF %d)\n", | 989 | "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %u, changes %u, td %d, TTL %d, V %d, IDF %d)\n", |
983 | ethhdr->h_source, if_incoming->net_dev->name, | 990 | ethhdr->h_source, if_incoming->net_dev->name, |
984 | if_incoming->net_dev->dev_addr, batman_ogm_packet->orig, | 991 | if_incoming->net_dev->dev_addr, batman_ogm_packet->orig, |
985 | batman_ogm_packet->prev_sender, ntohl(batman_ogm_packet->seqno), | 992 | batman_ogm_packet->prev_sender, |
986 | batman_ogm_packet->ttvn, ntohs(batman_ogm_packet->tt_crc), | 993 | ntohl(batman_ogm_packet->seqno), batman_ogm_packet->ttvn, |
987 | batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq, | 994 | ntohs(batman_ogm_packet->tt_crc), |
988 | batman_ogm_packet->header.ttl, | 995 | batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq, |
989 | batman_ogm_packet->header.version, has_directlink_flag); | 996 | batman_ogm_packet->header.ttl, |
997 | batman_ogm_packet->header.version, has_directlink_flag); | ||
990 | 998 | ||
991 | rcu_read_lock(); | 999 | rcu_read_lock(); |
992 | list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { | 1000 | list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { |
@@ -996,16 +1004,16 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
996 | if (hard_iface->soft_iface != if_incoming->soft_iface) | 1004 | if (hard_iface->soft_iface != if_incoming->soft_iface) |
997 | continue; | 1005 | continue; |
998 | 1006 | ||
999 | if (compare_eth(ethhdr->h_source, | 1007 | if (batadv_compare_eth(ethhdr->h_source, |
1000 | hard_iface->net_dev->dev_addr)) | 1008 | hard_iface->net_dev->dev_addr)) |
1001 | is_my_addr = 1; | 1009 | is_my_addr = 1; |
1002 | 1010 | ||
1003 | if (compare_eth(batman_ogm_packet->orig, | 1011 | if (batadv_compare_eth(batman_ogm_packet->orig, |
1004 | hard_iface->net_dev->dev_addr)) | 1012 | hard_iface->net_dev->dev_addr)) |
1005 | is_my_orig = 1; | 1013 | is_my_orig = 1; |
1006 | 1014 | ||
1007 | if (compare_eth(batman_ogm_packet->prev_sender, | 1015 | if (batadv_compare_eth(batman_ogm_packet->prev_sender, |
1008 | hard_iface->net_dev->dev_addr)) | 1016 | hard_iface->net_dev->dev_addr)) |
1009 | is_my_oldorig = 1; | 1017 | is_my_oldorig = 1; |
1010 | 1018 | ||
1011 | if (is_broadcast_ether_addr(ethhdr->h_source)) | 1019 | if (is_broadcast_ether_addr(ethhdr->h_source)) |
@@ -1014,23 +1022,23 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1014 | rcu_read_unlock(); | 1022 | rcu_read_unlock(); |
1015 | 1023 | ||
1016 | if (batman_ogm_packet->header.version != COMPAT_VERSION) { | 1024 | if (batman_ogm_packet->header.version != COMPAT_VERSION) { |
1017 | bat_dbg(DBG_BATMAN, bat_priv, | 1025 | batadv_dbg(DBG_BATMAN, bat_priv, |
1018 | "Drop packet: incompatible batman version (%i)\n", | 1026 | "Drop packet: incompatible batman version (%i)\n", |
1019 | batman_ogm_packet->header.version); | 1027 | batman_ogm_packet->header.version); |
1020 | return; | 1028 | return; |
1021 | } | 1029 | } |
1022 | 1030 | ||
1023 | if (is_my_addr) { | 1031 | if (is_my_addr) { |
1024 | bat_dbg(DBG_BATMAN, bat_priv, | 1032 | batadv_dbg(DBG_BATMAN, bat_priv, |
1025 | "Drop packet: received my own broadcast (sender: %pM)\n", | 1033 | "Drop packet: received my own broadcast (sender: %pM)\n", |
1026 | ethhdr->h_source); | 1034 | ethhdr->h_source); |
1027 | return; | 1035 | return; |
1028 | } | 1036 | } |
1029 | 1037 | ||
1030 | if (is_broadcast) { | 1038 | if (is_broadcast) { |
1031 | bat_dbg(DBG_BATMAN, bat_priv, | 1039 | batadv_dbg(DBG_BATMAN, bat_priv, |
1032 | "Drop packet: ignoring all packets with broadcast source addr (sender: %pM)\n", | 1040 | "Drop packet: ignoring all packets with broadcast source addr (sender: %pM)\n", |
1033 | ethhdr->h_source); | 1041 | ethhdr->h_source); |
1034 | return; | 1042 | return; |
1035 | } | 1043 | } |
1036 | 1044 | ||
@@ -1049,8 +1057,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1049 | * save packet seqno for bidirectional check | 1057 | * save packet seqno for bidirectional check |
1050 | */ | 1058 | */ |
1051 | if (has_directlink_flag && | 1059 | if (has_directlink_flag && |
1052 | compare_eth(if_incoming->net_dev->dev_addr, | 1060 | batadv_compare_eth(if_incoming->net_dev->dev_addr, |
1053 | batman_ogm_packet->orig)) { | 1061 | batman_ogm_packet->orig)) { |
1054 | offset = if_incoming->if_num * NUM_WORDS; | 1062 | offset = if_incoming->if_num * NUM_WORDS; |
1055 | 1063 | ||
1056 | spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); | 1064 | spin_lock_bh(&orig_neigh_node->ogm_cnt_lock); |
@@ -1063,23 +1071,23 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1063 | spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock); | 1071 | spin_unlock_bh(&orig_neigh_node->ogm_cnt_lock); |
1064 | } | 1072 | } |
1065 | 1073 | ||
1066 | bat_dbg(DBG_BATMAN, bat_priv, | 1074 | batadv_dbg(DBG_BATMAN, bat_priv, |
1067 | "Drop packet: originator packet from myself (via neighbor)\n"); | 1075 | "Drop packet: originator packet from myself (via neighbor)\n"); |
1068 | batadv_orig_node_free_ref(orig_neigh_node); | 1076 | batadv_orig_node_free_ref(orig_neigh_node); |
1069 | return; | 1077 | return; |
1070 | } | 1078 | } |
1071 | 1079 | ||
1072 | if (is_my_oldorig) { | 1080 | if (is_my_oldorig) { |
1073 | bat_dbg(DBG_BATMAN, bat_priv, | 1081 | batadv_dbg(DBG_BATMAN, bat_priv, |
1074 | "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n", | 1082 | "Drop packet: ignoring all rebroadcast echos (sender: %pM)\n", |
1075 | ethhdr->h_source); | 1083 | ethhdr->h_source); |
1076 | return; | 1084 | return; |
1077 | } | 1085 | } |
1078 | 1086 | ||
1079 | if (batman_ogm_packet->flags & NOT_BEST_NEXT_HOP) { | 1087 | if (batman_ogm_packet->flags & NOT_BEST_NEXT_HOP) { |
1080 | bat_dbg(DBG_BATMAN, bat_priv, | 1088 | batadv_dbg(DBG_BATMAN, bat_priv, |
1081 | "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n", | 1089 | "Drop packet: ignoring all packets not forwarded from the best next hop (sender: %pM)\n", |
1082 | ethhdr->h_source); | 1090 | ethhdr->h_source); |
1083 | return; | 1091 | return; |
1084 | } | 1092 | } |
1085 | 1093 | ||
@@ -1091,15 +1099,15 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1091 | if_incoming); | 1099 | if_incoming); |
1092 | 1100 | ||
1093 | if (is_duplicate == -1) { | 1101 | if (is_duplicate == -1) { |
1094 | bat_dbg(DBG_BATMAN, bat_priv, | 1102 | batadv_dbg(DBG_BATMAN, bat_priv, |
1095 | "Drop packet: packet within seqno protection time (sender: %pM)\n", | 1103 | "Drop packet: packet within seqno protection time (sender: %pM)\n", |
1096 | ethhdr->h_source); | 1104 | ethhdr->h_source); |
1097 | goto out; | 1105 | goto out; |
1098 | } | 1106 | } |
1099 | 1107 | ||
1100 | if (batman_ogm_packet->tq == 0) { | 1108 | if (batman_ogm_packet->tq == 0) { |
1101 | bat_dbg(DBG_BATMAN, bat_priv, | 1109 | batadv_dbg(DBG_BATMAN, bat_priv, |
1102 | "Drop packet: originator packet with tq equal 0\n"); | 1110 | "Drop packet: originator packet with tq equal 0\n"); |
1103 | goto out; | 1111 | goto out; |
1104 | } | 1112 | } |
1105 | 1113 | ||
@@ -1108,18 +1116,18 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1108 | router_router = batadv_orig_node_get_router(router->orig_node); | 1116 | router_router = batadv_orig_node_get_router(router->orig_node); |
1109 | 1117 | ||
1110 | if ((router && router->tq_avg != 0) && | 1118 | if ((router && router->tq_avg != 0) && |
1111 | (compare_eth(router->addr, ethhdr->h_source))) | 1119 | (batadv_compare_eth(router->addr, ethhdr->h_source))) |
1112 | is_from_best_next_hop = true; | 1120 | is_from_best_next_hop = true; |
1113 | 1121 | ||
1122 | prev_sender = batman_ogm_packet->prev_sender; | ||
1114 | /* avoid temporary routing loops */ | 1123 | /* avoid temporary routing loops */ |
1115 | if (router && router_router && | 1124 | if (router && router_router && |
1116 | (compare_eth(router->addr, batman_ogm_packet->prev_sender)) && | 1125 | (batadv_compare_eth(router->addr, prev_sender)) && |
1117 | !(compare_eth(batman_ogm_packet->orig, | 1126 | !(batadv_compare_eth(batman_ogm_packet->orig, prev_sender)) && |
1118 | batman_ogm_packet->prev_sender)) && | 1127 | (batadv_compare_eth(router->addr, router_router->addr))) { |
1119 | (compare_eth(router->addr, router_router->addr))) { | 1128 | batadv_dbg(DBG_BATMAN, bat_priv, |
1120 | bat_dbg(DBG_BATMAN, bat_priv, | 1129 | "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n", |
1121 | "Drop packet: ignoring all rebroadcast packets that may make me loop (sender: %pM)\n", | 1130 | ethhdr->h_source); |
1122 | ethhdr->h_source); | ||
1123 | goto out; | 1131 | goto out; |
1124 | } | 1132 | } |
1125 | 1133 | ||
@@ -1138,8 +1146,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1138 | * don't route towards it | 1146 | * don't route towards it |
1139 | */ | 1147 | */ |
1140 | if (!is_single_hop_neigh && (!orig_neigh_router)) { | 1148 | if (!is_single_hop_neigh && (!orig_neigh_router)) { |
1141 | bat_dbg(DBG_BATMAN, bat_priv, | 1149 | batadv_dbg(DBG_BATMAN, bat_priv, |
1142 | "Drop packet: OGM via unknown neighbor!\n"); | 1150 | "Drop packet: OGM via unknown neighbor!\n"); |
1143 | goto out_neigh; | 1151 | goto out_neigh; |
1144 | } | 1152 | } |
1145 | 1153 | ||
@@ -1168,26 +1176,26 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1168 | is_single_hop_neigh, is_from_best_next_hop, | 1176 | is_single_hop_neigh, is_from_best_next_hop, |
1169 | if_incoming); | 1177 | if_incoming); |
1170 | 1178 | ||
1171 | bat_dbg(DBG_BATMAN, bat_priv, | 1179 | batadv_dbg(DBG_BATMAN, bat_priv, |
1172 | "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); | 1180 | "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); |
1173 | goto out_neigh; | 1181 | goto out_neigh; |
1174 | } | 1182 | } |
1175 | 1183 | ||
1176 | /* multihop originator */ | 1184 | /* multihop originator */ |
1177 | if (!is_bidirectional) { | 1185 | if (!is_bidirectional) { |
1178 | bat_dbg(DBG_BATMAN, bat_priv, | 1186 | batadv_dbg(DBG_BATMAN, bat_priv, |
1179 | "Drop packet: not received via bidirectional link\n"); | 1187 | "Drop packet: not received via bidirectional link\n"); |
1180 | goto out_neigh; | 1188 | goto out_neigh; |
1181 | } | 1189 | } |
1182 | 1190 | ||
1183 | if (is_duplicate) { | 1191 | if (is_duplicate) { |
1184 | bat_dbg(DBG_BATMAN, bat_priv, | 1192 | batadv_dbg(DBG_BATMAN, bat_priv, |
1185 | "Drop packet: duplicate packet received\n"); | 1193 | "Drop packet: duplicate packet received\n"); |
1186 | goto out_neigh; | 1194 | goto out_neigh; |
1187 | } | 1195 | } |
1188 | 1196 | ||
1189 | bat_dbg(DBG_BATMAN, bat_priv, | 1197 | batadv_dbg(DBG_BATMAN, bat_priv, |
1190 | "Forwarding packet: rebroadcast originator packet\n"); | 1198 | "Forwarding packet: rebroadcast originator packet\n"); |
1191 | bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, | 1199 | bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, |
1192 | is_single_hop_neigh, is_from_best_next_hop, | 1200 | is_single_hop_neigh, is_from_best_next_hop, |
1193 | if_incoming); | 1201 | if_incoming); |