diff options
Diffstat (limited to 'net/batman-adv/bat_iv_ogm.c')
-rw-r--r-- | net/batman-adv/bat_iv_ogm.c | 99 |
1 files changed, 59 insertions, 40 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index e877af8bdd1e..b02b75dae3a8 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
@@ -166,13 +166,15 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
166 | int16_t buff_pos; | 166 | int16_t buff_pos; |
167 | struct batadv_ogm_packet *batadv_ogm_packet; | 167 | struct batadv_ogm_packet *batadv_ogm_packet; |
168 | struct sk_buff *skb; | 168 | struct sk_buff *skb; |
169 | uint8_t *packet_pos; | ||
169 | 170 | ||
170 | if (hard_iface->if_status != BATADV_IF_ACTIVE) | 171 | if (hard_iface->if_status != BATADV_IF_ACTIVE) |
171 | return; | 172 | return; |
172 | 173 | ||
173 | packet_num = 0; | 174 | packet_num = 0; |
174 | buff_pos = 0; | 175 | buff_pos = 0; |
175 | batadv_ogm_packet = (struct batadv_ogm_packet *)forw_packet->skb->data; | 176 | packet_pos = forw_packet->skb->data; |
177 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; | ||
176 | 178 | ||
177 | /* adjust all flags and log packets */ | 179 | /* adjust all flags and log packets */ |
178 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, | 180 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, |
@@ -181,15 +183,17 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
181 | /* we might have aggregated direct link packets with an | 183 | /* we might have aggregated direct link packets with an |
182 | * ordinary base packet | 184 | * ordinary base packet |
183 | */ | 185 | */ |
184 | if ((forw_packet->direct_link_flags & (1 << packet_num)) && | 186 | if (forw_packet->direct_link_flags & BIT(packet_num) && |
185 | (forw_packet->if_incoming == hard_iface)) | 187 | forw_packet->if_incoming == hard_iface) |
186 | batadv_ogm_packet->flags |= BATADV_DIRECTLINK; | 188 | batadv_ogm_packet->flags |= BATADV_DIRECTLINK; |
187 | else | 189 | else |
188 | batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; | 190 | batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; |
189 | 191 | ||
190 | fwd_str = (packet_num > 0 ? "Forwarding" : (forw_packet->own ? | 192 | if (packet_num > 0 || !forw_packet->own) |
191 | "Sending own" : | 193 | fwd_str = "Forwarding"; |
192 | "Forwarding")); | 194 | else |
195 | fwd_str = "Sending own"; | ||
196 | |||
193 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, | 197 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, |
194 | "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", | 198 | "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d) on interface %s [%pM]\n", |
195 | fwd_str, (packet_num > 0 ? "aggregated " : ""), | 199 | fwd_str, (packet_num > 0 ? "aggregated " : ""), |
@@ -204,8 +208,8 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
204 | buff_pos += BATADV_OGM_HLEN; | 208 | buff_pos += BATADV_OGM_HLEN; |
205 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); | 209 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); |
206 | packet_num++; | 210 | packet_num++; |
207 | batadv_ogm_packet = (struct batadv_ogm_packet *) | 211 | packet_pos = forw_packet->skb->data + buff_pos; |
208 | (forw_packet->skb->data + buff_pos); | 212 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |
209 | } | 213 | } |
210 | 214 | ||
211 | /* create clone because function is called more than once */ | 215 | /* create clone because function is called more than once */ |
@@ -227,9 +231,10 @@ static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet) | |||
227 | struct batadv_hard_iface *primary_if = NULL; | 231 | struct batadv_hard_iface *primary_if = NULL; |
228 | struct batadv_ogm_packet *batadv_ogm_packet; | 232 | struct batadv_ogm_packet *batadv_ogm_packet; |
229 | unsigned char directlink; | 233 | unsigned char directlink; |
234 | uint8_t *packet_pos; | ||
230 | 235 | ||
231 | batadv_ogm_packet = (struct batadv_ogm_packet *) | 236 | packet_pos = forw_packet->skb->data; |
232 | (forw_packet->skb->data); | 237 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |
233 | directlink = (batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0); | 238 | directlink = (batadv_ogm_packet->flags & BATADV_DIRECTLINK ? 1 : 0); |
234 | 239 | ||
235 | if (!forw_packet->if_incoming) { | 240 | if (!forw_packet->if_incoming) { |
@@ -454,6 +459,7 @@ static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr, | |||
454 | int packet_len, bool direct_link) | 459 | int packet_len, bool direct_link) |
455 | { | 460 | { |
456 | unsigned char *skb_buff; | 461 | unsigned char *skb_buff; |
462 | unsigned long new_direct_link_flag; | ||
457 | 463 | ||
458 | skb_buff = skb_put(forw_packet_aggr->skb, packet_len); | 464 | skb_buff = skb_put(forw_packet_aggr->skb, packet_len); |
459 | memcpy(skb_buff, packet_buff, packet_len); | 465 | memcpy(skb_buff, packet_buff, packet_len); |
@@ -461,9 +467,10 @@ static void batadv_iv_ogm_aggregate(struct batadv_forw_packet *forw_packet_aggr, | |||
461 | forw_packet_aggr->num_packets++; | 467 | forw_packet_aggr->num_packets++; |
462 | 468 | ||
463 | /* save packet direct link flag status */ | 469 | /* save packet direct link flag status */ |
464 | if (direct_link) | 470 | if (direct_link) { |
465 | forw_packet_aggr->direct_link_flags |= | 471 | new_direct_link_flag = BIT(forw_packet_aggr->num_packets); |
466 | (1 << forw_packet_aggr->num_packets); | 472 | forw_packet_aggr->direct_link_flags |= new_direct_link_flag; |
473 | } | ||
467 | } | 474 | } |
468 | 475 | ||
469 | static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv, | 476 | static void batadv_iv_ogm_queue_add(struct batadv_priv *bat_priv, |
@@ -586,6 +593,8 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) | |||
586 | struct batadv_ogm_packet *batadv_ogm_packet; | 593 | struct batadv_ogm_packet *batadv_ogm_packet; |
587 | struct batadv_hard_iface *primary_if; | 594 | struct batadv_hard_iface *primary_if; |
588 | int vis_server, tt_num_changes = 0; | 595 | int vis_server, tt_num_changes = 0; |
596 | uint32_t seqno; | ||
597 | uint8_t bandwidth; | ||
589 | 598 | ||
590 | vis_server = atomic_read(&bat_priv->vis_mode); | 599 | vis_server = atomic_read(&bat_priv->vis_mode); |
591 | primary_if = batadv_primary_if_get_selected(bat_priv); | 600 | primary_if = batadv_primary_if_get_selected(bat_priv); |
@@ -599,12 +608,12 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) | |||
599 | batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; | 608 | batadv_ogm_packet = (struct batadv_ogm_packet *)hard_iface->packet_buff; |
600 | 609 | ||
601 | /* change sequence number to network order */ | 610 | /* change sequence number to network order */ |
602 | batadv_ogm_packet->seqno = | 611 | seqno = (uint32_t)atomic_read(&hard_iface->seqno); |
603 | htonl((uint32_t)atomic_read(&hard_iface->seqno)); | 612 | batadv_ogm_packet->seqno = htonl(seqno); |
604 | atomic_inc(&hard_iface->seqno); | 613 | atomic_inc(&hard_iface->seqno); |
605 | 614 | ||
606 | batadv_ogm_packet->ttvn = atomic_read(&bat_priv->ttvn); | 615 | batadv_ogm_packet->ttvn = atomic_read(&bat_priv->tt.vn); |
607 | batadv_ogm_packet->tt_crc = htons(bat_priv->tt_crc); | 616 | batadv_ogm_packet->tt_crc = htons(bat_priv->tt.local_crc); |
608 | if (tt_num_changes >= 0) | 617 | if (tt_num_changes >= 0) |
609 | batadv_ogm_packet->tt_num_changes = tt_num_changes; | 618 | batadv_ogm_packet->tt_num_changes = tt_num_changes; |
610 | 619 | ||
@@ -613,12 +622,13 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) | |||
613 | else | 622 | else |
614 | batadv_ogm_packet->flags &= ~BATADV_VIS_SERVER; | 623 | batadv_ogm_packet->flags &= ~BATADV_VIS_SERVER; |
615 | 624 | ||
616 | if ((hard_iface == primary_if) && | 625 | if (hard_iface == primary_if && |
617 | (atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_SERVER)) | 626 | atomic_read(&bat_priv->gw_mode) == BATADV_GW_MODE_SERVER) { |
618 | batadv_ogm_packet->gw_flags = | 627 | bandwidth = (uint8_t)atomic_read(&bat_priv->gw_bandwidth); |
619 | (uint8_t)atomic_read(&bat_priv->gw_bandwidth); | 628 | batadv_ogm_packet->gw_flags = bandwidth; |
620 | else | 629 | } else { |
621 | batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS; | 630 | batadv_ogm_packet->gw_flags = BATADV_NO_FLAGS; |
631 | } | ||
622 | 632 | ||
623 | batadv_slide_own_bcast_window(hard_iface); | 633 | batadv_slide_own_bcast_window(hard_iface); |
624 | batadv_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff, | 634 | batadv_iv_ogm_queue_add(bat_priv, hard_iface->packet_buff, |
@@ -642,8 +652,10 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
642 | struct batadv_neigh_node *router = NULL; | 652 | struct batadv_neigh_node *router = NULL; |
643 | struct batadv_orig_node *orig_node_tmp; | 653 | struct batadv_orig_node *orig_node_tmp; |
644 | struct hlist_node *node; | 654 | struct hlist_node *node; |
645 | uint8_t bcast_own_sum_orig, bcast_own_sum_neigh; | 655 | int if_num; |
656 | uint8_t sum_orig, sum_neigh; | ||
646 | uint8_t *neigh_addr; | 657 | uint8_t *neigh_addr; |
658 | uint8_t tq_avg; | ||
647 | 659 | ||
648 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, | 660 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, |
649 | "update_originator(): Searching and updating originator entry of received packet\n"); | 661 | "update_originator(): Searching and updating originator entry of received packet\n"); |
@@ -667,8 +679,8 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
667 | spin_lock_bh(&tmp_neigh_node->lq_update_lock); | 679 | spin_lock_bh(&tmp_neigh_node->lq_update_lock); |
668 | batadv_ring_buffer_set(tmp_neigh_node->tq_recv, | 680 | batadv_ring_buffer_set(tmp_neigh_node->tq_recv, |
669 | &tmp_neigh_node->tq_index, 0); | 681 | &tmp_neigh_node->tq_index, 0); |
670 | tmp_neigh_node->tq_avg = | 682 | tq_avg = batadv_ring_buffer_avg(tmp_neigh_node->tq_recv); |
671 | batadv_ring_buffer_avg(tmp_neigh_node->tq_recv); | 683 | tmp_neigh_node->tq_avg = tq_avg; |
672 | spin_unlock_bh(&tmp_neigh_node->lq_update_lock); | 684 | spin_unlock_bh(&tmp_neigh_node->lq_update_lock); |
673 | } | 685 | } |
674 | 686 | ||
@@ -727,17 +739,17 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv, | |||
727 | if (router && (neigh_node->tq_avg == router->tq_avg)) { | 739 | if (router && (neigh_node->tq_avg == router->tq_avg)) { |
728 | orig_node_tmp = router->orig_node; | 740 | orig_node_tmp = router->orig_node; |
729 | spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); | 741 | spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); |
730 | bcast_own_sum_orig = | 742 | if_num = router->if_incoming->if_num; |
731 | orig_node_tmp->bcast_own_sum[if_incoming->if_num]; | 743 | sum_orig = orig_node_tmp->bcast_own_sum[if_num]; |
732 | spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); | 744 | spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); |
733 | 745 | ||
734 | orig_node_tmp = neigh_node->orig_node; | 746 | orig_node_tmp = neigh_node->orig_node; |
735 | spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); | 747 | spin_lock_bh(&orig_node_tmp->ogm_cnt_lock); |
736 | bcast_own_sum_neigh = | 748 | if_num = neigh_node->if_incoming->if_num; |
737 | orig_node_tmp->bcast_own_sum[if_incoming->if_num]; | 749 | sum_neigh = orig_node_tmp->bcast_own_sum[if_num]; |
738 | spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); | 750 | spin_unlock_bh(&orig_node_tmp->ogm_cnt_lock); |
739 | 751 | ||
740 | if (bcast_own_sum_orig >= bcast_own_sum_neigh) | 752 | if (sum_orig >= sum_neigh) |
741 | goto update_tt; | 753 | goto update_tt; |
742 | } | 754 | } |
743 | 755 | ||
@@ -835,8 +847,10 @@ static int batadv_iv_ogm_calc_tq(struct batadv_orig_node *orig_node, | |||
835 | spin_unlock_bh(&orig_node->ogm_cnt_lock); | 847 | spin_unlock_bh(&orig_node->ogm_cnt_lock); |
836 | 848 | ||
837 | /* pay attention to not get a value bigger than 100 % */ | 849 | /* pay attention to not get a value bigger than 100 % */ |
838 | total_count = (orig_eq_count > neigh_rq_count ? | 850 | if (orig_eq_count > neigh_rq_count) |
839 | neigh_rq_count : orig_eq_count); | 851 | total_count = neigh_rq_count; |
852 | else | ||
853 | total_count = orig_eq_count; | ||
840 | 854 | ||
841 | /* if we have too few packets (too less data) we set tq_own to zero | 855 | /* if we have too few packets (too less data) we set tq_own to zero |
842 | * if we receive too few packets it is not considered bidirectional | 856 | * if we receive too few packets it is not considered bidirectional |
@@ -910,6 +924,7 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
910 | int set_mark, ret = -1; | 924 | int set_mark, ret = -1; |
911 | uint32_t seqno = ntohl(batadv_ogm_packet->seqno); | 925 | uint32_t seqno = ntohl(batadv_ogm_packet->seqno); |
912 | uint8_t *neigh_addr; | 926 | uint8_t *neigh_addr; |
927 | uint8_t packet_count; | ||
913 | 928 | ||
914 | orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); | 929 | orig_node = batadv_get_orig_node(bat_priv, batadv_ogm_packet->orig); |
915 | if (!orig_node) | 930 | if (!orig_node) |
@@ -944,9 +959,9 @@ batadv_iv_ogm_update_seqnos(const struct ethhdr *ethhdr, | |||
944 | tmp_neigh_node->real_bits, | 959 | tmp_neigh_node->real_bits, |
945 | seq_diff, set_mark); | 960 | seq_diff, set_mark); |
946 | 961 | ||
947 | tmp_neigh_node->real_packet_count = | 962 | packet_count = bitmap_weight(tmp_neigh_node->real_bits, |
948 | bitmap_weight(tmp_neigh_node->real_bits, | 963 | BATADV_TQ_LOCAL_WINDOW_SIZE); |
949 | BATADV_TQ_LOCAL_WINDOW_SIZE); | 964 | tmp_neigh_node->real_packet_count = packet_count; |
950 | } | 965 | } |
951 | rcu_read_unlock(); | 966 | rcu_read_unlock(); |
952 | 967 | ||
@@ -1163,9 +1178,12 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1163 | /* if sender is a direct neighbor the sender mac equals | 1178 | /* if sender is a direct neighbor the sender mac equals |
1164 | * originator mac | 1179 | * originator mac |
1165 | */ | 1180 | */ |
1166 | orig_neigh_node = (is_single_hop_neigh ? | 1181 | if (is_single_hop_neigh) |
1167 | orig_node : | 1182 | orig_neigh_node = orig_node; |
1168 | batadv_get_orig_node(bat_priv, ethhdr->h_source)); | 1183 | else |
1184 | orig_neigh_node = batadv_get_orig_node(bat_priv, | ||
1185 | ethhdr->h_source); | ||
1186 | |||
1169 | if (!orig_neigh_node) | 1187 | if (!orig_neigh_node) |
1170 | goto out; | 1188 | goto out; |
1171 | 1189 | ||
@@ -1251,6 +1269,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
1251 | int buff_pos = 0, packet_len; | 1269 | int buff_pos = 0, packet_len; |
1252 | unsigned char *tt_buff, *packet_buff; | 1270 | unsigned char *tt_buff, *packet_buff; |
1253 | bool ret; | 1271 | bool ret; |
1272 | uint8_t *packet_pos; | ||
1254 | 1273 | ||
1255 | ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); | 1274 | ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); |
1256 | if (!ret) | 1275 | if (!ret) |
@@ -1281,8 +1300,8 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
1281 | buff_pos += BATADV_OGM_HLEN; | 1300 | buff_pos += BATADV_OGM_HLEN; |
1282 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); | 1301 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); |
1283 | 1302 | ||
1284 | batadv_ogm_packet = (struct batadv_ogm_packet *) | 1303 | packet_pos = packet_buff + buff_pos; |
1285 | (packet_buff + buff_pos); | 1304 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |
1286 | } while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, | 1305 | } while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, |
1287 | batadv_ogm_packet->tt_num_changes)); | 1306 | batadv_ogm_packet->tt_num_changes)); |
1288 | 1307 | ||