diff options
Diffstat (limited to 'net/batman-adv/bat_iv_ogm.c')
-rw-r--r-- | net/batman-adv/bat_iv_ogm.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index 0a8a80cd4bf1..f7dd7e51fff4 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c | |||
@@ -207,12 +207,12 @@ static uint8_t batadv_hop_penalty(uint8_t tq, | |||
207 | 207 | ||
208 | /* is there another aggregated packet here? */ | 208 | /* is there another aggregated packet here? */ |
209 | static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, | 209 | static int batadv_iv_ogm_aggr_packet(int buff_pos, int packet_len, |
210 | int tt_num_changes) | 210 | __be16 tvlv_len) |
211 | { | 211 | { |
212 | int next_buff_pos = 0; | 212 | int next_buff_pos = 0; |
213 | 213 | ||
214 | next_buff_pos += buff_pos + BATADV_OGM_HLEN; | 214 | next_buff_pos += buff_pos + BATADV_OGM_HLEN; |
215 | next_buff_pos += batadv_tt_len(tt_num_changes); | 215 | next_buff_pos += ntohs(tvlv_len); |
216 | 216 | ||
217 | return (next_buff_pos <= packet_len) && | 217 | return (next_buff_pos <= packet_len) && |
218 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); | 218 | (next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES); |
@@ -240,7 +240,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
240 | 240 | ||
241 | /* adjust all flags and log packets */ | 241 | /* adjust all flags and log packets */ |
242 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, | 242 | while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len, |
243 | batadv_ogm_packet->tt_num_changes)) { | 243 | batadv_ogm_packet->tvlv_len)) { |
244 | /* we might have aggregated direct link packets with an | 244 | /* we might have aggregated direct link packets with an |
245 | * ordinary base packet | 245 | * ordinary base packet |
246 | */ | 246 | */ |
@@ -267,7 +267,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet, | |||
267 | hard_iface->net_dev->dev_addr); | 267 | hard_iface->net_dev->dev_addr); |
268 | 268 | ||
269 | buff_pos += BATADV_OGM_HLEN; | 269 | buff_pos += BATADV_OGM_HLEN; |
270 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); | 270 | buff_pos += ntohs(batadv_ogm_packet->tvlv_len); |
271 | packet_num++; | 271 | packet_num++; |
272 | packet_pos = forw_packet->skb->data + buff_pos; | 272 | packet_pos = forw_packet->skb->data + buff_pos; |
273 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; | 273 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |
@@ -601,7 +601,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node, | |||
601 | struct batadv_hard_iface *if_incoming) | 601 | struct batadv_hard_iface *if_incoming) |
602 | { | 602 | { |
603 | struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); | 603 | struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); |
604 | uint8_t tt_num_changes; | 604 | uint16_t tvlv_len; |
605 | 605 | ||
606 | if (batadv_ogm_packet->header.ttl <= 1) { | 606 | if (batadv_ogm_packet->header.ttl <= 1) { |
607 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n"); | 607 | batadv_dbg(BATADV_DBG_BATMAN, bat_priv, "ttl exceeded\n"); |
@@ -621,7 +621,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node, | |||
621 | return; | 621 | return; |
622 | } | 622 | } |
623 | 623 | ||
624 | tt_num_changes = batadv_ogm_packet->tt_num_changes; | 624 | tvlv_len = ntohs(batadv_ogm_packet->tvlv_len); |
625 | 625 | ||
626 | batadv_ogm_packet->header.ttl--; | 626 | batadv_ogm_packet->header.ttl--; |
627 | memcpy(batadv_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); | 627 | memcpy(batadv_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); |
@@ -642,7 +642,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node, | |||
642 | batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; | 642 | batadv_ogm_packet->flags &= ~BATADV_DIRECTLINK; |
643 | 643 | ||
644 | batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet, | 644 | batadv_iv_ogm_queue_add(bat_priv, (unsigned char *)batadv_ogm_packet, |
645 | BATADV_OGM_HLEN + batadv_tt_len(tt_num_changes), | 645 | BATADV_OGM_HLEN + tvlv_len, |
646 | if_incoming, 0, batadv_iv_ogm_fwd_send_time()); | 646 | if_incoming, 0, batadv_iv_ogm_fwd_send_time()); |
647 | } | 647 | } |
648 | 648 | ||
@@ -691,16 +691,18 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface) | |||
691 | int vis_server, tt_num_changes = 0; | 691 | int vis_server, tt_num_changes = 0; |
692 | uint32_t seqno; | 692 | uint32_t seqno; |
693 | uint8_t bandwidth; | 693 | uint8_t bandwidth; |
694 | uint16_t tvlv_len = 0; | ||
694 | 695 | ||
695 | vis_server = atomic_read(&bat_priv->vis_mode); | 696 | vis_server = atomic_read(&bat_priv->vis_mode); |
696 | primary_if = batadv_primary_if_get_selected(bat_priv); | 697 | primary_if = batadv_primary_if_get_selected(bat_priv); |
697 | 698 | ||
698 | if (hard_iface == primary_if) | 699 | if (hard_iface == primary_if) |
699 | tt_num_changes = batadv_tt_append_diff(bat_priv, ogm_buff, | 700 | tvlv_len = batadv_tvlv_container_ogm_append(bat_priv, ogm_buff, |
700 | ogm_buff_len, | 701 | ogm_buff_len, |
701 | BATADV_OGM_HLEN); | 702 | BATADV_OGM_HLEN); |
702 | 703 | ||
703 | batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff); | 704 | batadv_ogm_packet = (struct batadv_ogm_packet *)(*ogm_buff); |
705 | batadv_ogm_packet->tvlv_len = htons(tvlv_len); | ||
704 | 706 | ||
705 | /* change sequence number to network order */ | 707 | /* change sequence number to network order */ |
706 | seqno = (uint32_t)atomic_read(&hard_iface->bat_iv.ogm_seqno); | 708 | seqno = (uint32_t)atomic_read(&hard_iface->bat_iv.ogm_seqno); |
@@ -1254,6 +1256,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr, | |||
1254 | goto out; | 1256 | goto out; |
1255 | } | 1257 | } |
1256 | 1258 | ||
1259 | batadv_tvlv_ogm_receive(bat_priv, batadv_ogm_packet, orig_node); | ||
1260 | |||
1257 | /* if sender is a direct neighbor the sender mac equals | 1261 | /* if sender is a direct neighbor the sender mac equals |
1258 | * originator mac | 1262 | * originator mac |
1259 | */ | 1263 | */ |
@@ -1350,9 +1354,9 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
1350 | struct batadv_ogm_packet *batadv_ogm_packet; | 1354 | struct batadv_ogm_packet *batadv_ogm_packet; |
1351 | struct ethhdr *ethhdr; | 1355 | struct ethhdr *ethhdr; |
1352 | int buff_pos = 0, packet_len; | 1356 | int buff_pos = 0, packet_len; |
1353 | unsigned char *tt_buff, *packet_buff; | 1357 | unsigned char *tvlv_buff, *packet_buff; |
1354 | bool ret; | ||
1355 | uint8_t *packet_pos; | 1358 | uint8_t *packet_pos; |
1359 | bool ret; | ||
1356 | 1360 | ||
1357 | ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); | 1361 | ret = batadv_check_management_packet(skb, if_incoming, BATADV_OGM_HLEN); |
1358 | if (!ret) | 1362 | if (!ret) |
@@ -1375,14 +1379,14 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, | |||
1375 | 1379 | ||
1376 | /* unpack the aggregated packets and process them one by one */ | 1380 | /* unpack the aggregated packets and process them one by one */ |
1377 | while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, | 1381 | while (batadv_iv_ogm_aggr_packet(buff_pos, packet_len, |
1378 | batadv_ogm_packet->tt_num_changes)) { | 1382 | batadv_ogm_packet->tvlv_len)) { |
1379 | tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; | 1383 | tvlv_buff = packet_buff + buff_pos + BATADV_OGM_HLEN; |
1380 | 1384 | ||
1381 | batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, tt_buff, | 1385 | batadv_iv_ogm_process(ethhdr, batadv_ogm_packet, |
1382 | if_incoming); | 1386 | tvlv_buff, if_incoming); |
1383 | 1387 | ||
1384 | buff_pos += BATADV_OGM_HLEN; | 1388 | buff_pos += BATADV_OGM_HLEN; |
1385 | buff_pos += batadv_tt_len(batadv_ogm_packet->tt_num_changes); | 1389 | buff_pos += ntohs(batadv_ogm_packet->tvlv_len); |
1386 | 1390 | ||
1387 | packet_pos = packet_buff + buff_pos; | 1391 | packet_pos = packet_buff + buff_pos; |
1388 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; | 1392 | batadv_ogm_packet = (struct batadv_ogm_packet *)packet_pos; |