@@ -135,9 +135,8 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
135
135
batadv_ogm_packet -> header .version = BATADV_COMPAT_VERSION ;
136
136
batadv_ogm_packet -> header .ttl = 2 ;
137
137
batadv_ogm_packet -> flags = BATADV_NO_FLAGS ;
138
+ batadv_ogm_packet -> reserved = 0 ;
138
139
batadv_ogm_packet -> tq = BATADV_TQ_MAX_VALUE ;
139
- batadv_ogm_packet -> tt_num_changes = 0 ;
140
- batadv_ogm_packet -> ttvn = 0 ;
141
140
142
141
res = 0 ;
143
142
@@ -207,12 +206,12 @@ static uint8_t batadv_hop_penalty(uint8_t tq,
207
206
208
207
/* is there another aggregated packet here? */
209
208
static int batadv_iv_ogm_aggr_packet (int buff_pos , int packet_len ,
210
- int tt_num_changes )
209
+ __be16 tvlv_len )
211
210
{
212
211
int next_buff_pos = 0 ;
213
212
214
213
next_buff_pos += buff_pos + BATADV_OGM_HLEN ;
215
- next_buff_pos += batadv_tt_len ( tt_num_changes );
214
+ next_buff_pos += ntohs ( tvlv_len );
216
215
217
216
return (next_buff_pos <= packet_len ) &&
218
217
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES );
@@ -240,7 +239,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
240
239
241
240
/* adjust all flags and log packets */
242
241
while (batadv_iv_ogm_aggr_packet (buff_pos , forw_packet -> packet_len ,
243
- batadv_ogm_packet -> tt_num_changes )) {
242
+ batadv_ogm_packet -> tvlv_len )) {
244
243
/* we might have aggregated direct link packets with an
245
244
* ordinary base packet
246
245
*/
@@ -256,18 +255,18 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
256
255
fwd_str = "Sending own" ;
257
256
258
257
batadv_dbg (BATADV_DBG_BATMAN , bat_priv ,
259
- "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s, ttvn %d ) on interface %s [%pM]\n" ,
258
+ "%s %spacket (originator %pM, seqno %u, TQ %d, TTL %d, IDF %s) on interface %s [%pM]\n" ,
260
259
fwd_str , (packet_num > 0 ? "aggregated " : "" ),
261
260
batadv_ogm_packet -> orig ,
262
261
ntohl (batadv_ogm_packet -> seqno ),
263
262
batadv_ogm_packet -> tq , batadv_ogm_packet -> header .ttl ,
264
263
(batadv_ogm_packet -> flags & BATADV_DIRECTLINK ?
265
264
"on" : "off" ),
266
- batadv_ogm_packet -> ttvn , hard_iface -> net_dev -> name ,
265
+ hard_iface -> net_dev -> name ,
267
266
hard_iface -> net_dev -> dev_addr );
268
267
269
268
buff_pos += BATADV_OGM_HLEN ;
270
- buff_pos += batadv_tt_len (batadv_ogm_packet -> tt_num_changes );
269
+ buff_pos += ntohs (batadv_ogm_packet -> tvlv_len );
271
270
packet_num ++ ;
272
271
packet_pos = forw_packet -> skb -> data + buff_pos ;
273
272
batadv_ogm_packet = (struct batadv_ogm_packet * )packet_pos ;
@@ -601,7 +600,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
601
600
struct batadv_hard_iface * if_incoming )
602
601
{
603
602
struct batadv_priv * bat_priv = netdev_priv (if_incoming -> soft_iface );
604
- uint8_t tt_num_changes ;
603
+ uint16_t tvlv_len ;
605
604
606
605
if (batadv_ogm_packet -> header .ttl <= 1 ) {
607
606
batadv_dbg (BATADV_DBG_BATMAN , bat_priv , "ttl exceeded\n" );
@@ -621,7 +620,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
621
620
return ;
622
621
}
623
622
624
- tt_num_changes = batadv_ogm_packet -> tt_num_changes ;
623
+ tvlv_len = ntohs ( batadv_ogm_packet -> tvlv_len ) ;
625
624
626
625
batadv_ogm_packet -> header .ttl -- ;
627
626
memcpy (batadv_ogm_packet -> prev_sender , ethhdr -> h_source , ETH_ALEN );
@@ -642,7 +641,7 @@ static void batadv_iv_ogm_forward(struct batadv_orig_node *orig_node,
642
641
batadv_ogm_packet -> flags &= ~BATADV_DIRECTLINK ;
643
642
644
643
batadv_iv_ogm_queue_add (bat_priv , (unsigned char * )batadv_ogm_packet ,
645
- BATADV_OGM_HLEN + batadv_tt_len ( tt_num_changes ) ,
644
+ BATADV_OGM_HLEN + tvlv_len ,
646
645
if_incoming , 0 , batadv_iv_ogm_fwd_send_time ());
647
646
}
648
647
@@ -688,43 +687,29 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
688
687
struct batadv_ogm_packet * batadv_ogm_packet ;
689
688
struct batadv_hard_iface * primary_if ;
690
689
int * ogm_buff_len = & hard_iface -> bat_iv .ogm_buff_len ;
691
- int vis_server , tt_num_changes = 0 ;
692
690
uint32_t seqno ;
693
- uint8_t bandwidth ;
691
+ uint16_t tvlv_len = 0 ;
694
692
695
- vis_server = atomic_read (& bat_priv -> vis_mode );
696
693
primary_if = batadv_primary_if_get_selected (bat_priv );
697
694
698
- if (hard_iface == primary_if )
699
- tt_num_changes = batadv_tt_append_diff (bat_priv , ogm_buff ,
700
- ogm_buff_len ,
701
- BATADV_OGM_HLEN );
695
+ if (hard_iface == primary_if ) {
696
+ /* tt changes have to be committed before the tvlv data is
697
+ * appended as it may alter the tt tvlv container
698
+ */
699
+ batadv_tt_local_commit_changes (bat_priv );
700
+ tvlv_len = batadv_tvlv_container_ogm_append (bat_priv , ogm_buff ,
701
+ ogm_buff_len ,
702
+ BATADV_OGM_HLEN );
703
+ }
702
704
703
705
batadv_ogm_packet = (struct batadv_ogm_packet * )(* ogm_buff );
706
+ batadv_ogm_packet -> tvlv_len = htons (tvlv_len );
704
707
705
708
/* change sequence number to network order */
706
709
seqno = (uint32_t )atomic_read (& hard_iface -> bat_iv .ogm_seqno );
707
710
batadv_ogm_packet -> seqno = htonl (seqno );
708
711
atomic_inc (& hard_iface -> bat_iv .ogm_seqno );
709
712
710
- batadv_ogm_packet -> ttvn = atomic_read (& bat_priv -> tt .vn );
711
- batadv_ogm_packet -> tt_crc = htons (bat_priv -> tt .local_crc );
712
- if (tt_num_changes >= 0 )
713
- batadv_ogm_packet -> tt_num_changes = tt_num_changes ;
714
-
715
- if (vis_server == BATADV_VIS_TYPE_SERVER_SYNC )
716
- batadv_ogm_packet -> flags |= BATADV_VIS_SERVER ;
717
- else
718
- batadv_ogm_packet -> flags &= ~BATADV_VIS_SERVER ;
719
-
720
- if (hard_iface == primary_if &&
721
- atomic_read (& bat_priv -> gw_mode ) == BATADV_GW_MODE_SERVER ) {
722
- bandwidth = (uint8_t )atomic_read (& bat_priv -> gw_bandwidth );
723
- batadv_ogm_packet -> gw_flags = bandwidth ;
724
- } else {
725
- batadv_ogm_packet -> gw_flags = BATADV_NO_FLAGS ;
726
- }
727
-
728
713
batadv_iv_ogm_slide_own_bcast_window (hard_iface );
729
714
batadv_iv_ogm_queue_add (bat_priv , hard_iface -> bat_iv .ogm_buff ,
730
715
hard_iface -> bat_iv .ogm_buff_len , hard_iface , 1 ,
@@ -798,7 +783,6 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
798
783
799
784
rcu_read_unlock ();
800
785
801
- orig_node -> flags = batadv_ogm_packet -> flags ;
802
786
neigh_node -> last_seen = jiffies ;
803
787
804
788
spin_lock_bh (& neigh_node -> lq_update_lock );
@@ -820,11 +804,11 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
820
804
*/
821
805
router = batadv_orig_node_get_router (orig_node );
822
806
if (router == neigh_node )
823
- goto update_tt ;
807
+ goto out ;
824
808
825
809
/* if this neighbor does not offer a better TQ we won't consider it */
826
810
if (router && (router -> tq_avg > neigh_node -> tq_avg ))
827
- goto update_tt ;
811
+ goto out ;
828
812
829
813
/* if the TQ is the same and the link not more symmetric we
830
814
* won't consider it either
@@ -843,35 +827,10 @@ batadv_iv_ogm_orig_update(struct batadv_priv *bat_priv,
843
827
spin_unlock_bh (& orig_node_tmp -> ogm_cnt_lock );
844
828
845
829
if (sum_orig >= sum_neigh )
846
- goto update_tt ;
830
+ goto out ;
847
831
}
848
832
849
833
batadv_update_route (bat_priv , orig_node , neigh_node );
850
-
851
- update_tt :
852
- /* I have to check for transtable changes only if the OGM has been
853
- * sent through a primary interface
854
- */
855
- if (((batadv_ogm_packet -> orig != ethhdr -> h_source ) &&
856
- (batadv_ogm_packet -> header .ttl > 2 )) ||
857
- (batadv_ogm_packet -> flags & BATADV_PRIMARIES_FIRST_HOP ))
858
- batadv_tt_update_orig (bat_priv , orig_node , tt_buff ,
859
- batadv_ogm_packet -> tt_num_changes ,
860
- batadv_ogm_packet -> ttvn ,
861
- ntohs (batadv_ogm_packet -> tt_crc ));
862
-
863
- if (orig_node -> gw_flags != batadv_ogm_packet -> gw_flags )
864
- batadv_gw_node_update (bat_priv , orig_node ,
865
- batadv_ogm_packet -> gw_flags );
866
-
867
- orig_node -> gw_flags = batadv_ogm_packet -> gw_flags ;
868
-
869
- /* restart gateway selection if fast or late switching was enabled */
870
- if ((orig_node -> gw_flags ) &&
871
- (atomic_read (& bat_priv -> gw_mode ) == BATADV_GW_MODE_CLIENT ) &&
872
- (atomic_read (& bat_priv -> gw_sel_class ) > 2 ))
873
- batadv_gw_check_election (bat_priv , orig_node );
874
-
875
834
goto out ;
876
835
877
836
unlock :
@@ -1122,13 +1081,11 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
1122
1081
is_single_hop_neigh = true;
1123
1082
1124
1083
batadv_dbg (BATADV_DBG_BATMAN , bat_priv ,
1125
- "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, ttvn %u, crc %#.4x, changes %u, tq %d, TTL %d, V %d, IDF %d)\n" ,
1084
+ "Received BATMAN packet via NB: %pM, IF: %s [%pM] (from OG: %pM, via prev OG: %pM, seqno %u, tq %d, TTL %d, V %d, IDF %d)\n" ,
1126
1085
ethhdr -> h_source , if_incoming -> net_dev -> name ,
1127
1086
if_incoming -> net_dev -> dev_addr , batadv_ogm_packet -> orig ,
1128
1087
batadv_ogm_packet -> prev_sender ,
1129
- ntohl (batadv_ogm_packet -> seqno ), batadv_ogm_packet -> ttvn ,
1130
- ntohs (batadv_ogm_packet -> tt_crc ),
1131
- batadv_ogm_packet -> tt_num_changes , batadv_ogm_packet -> tq ,
1088
+ ntohl (batadv_ogm_packet -> seqno ), batadv_ogm_packet -> tq ,
1132
1089
batadv_ogm_packet -> header .ttl ,
1133
1090
batadv_ogm_packet -> header .version , has_directlink_flag );
1134
1091
@@ -1254,6 +1211,8 @@ static void batadv_iv_ogm_process(const struct ethhdr *ethhdr,
1254
1211
goto out ;
1255
1212
}
1256
1213
1214
+ batadv_tvlv_ogm_receive (bat_priv , batadv_ogm_packet , orig_node );
1215
+
1257
1216
/* if sender is a direct neighbor the sender mac equals
1258
1217
* originator mac
1259
1218
*/
@@ -1350,9 +1309,9 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
1350
1309
struct batadv_ogm_packet * batadv_ogm_packet ;
1351
1310
struct ethhdr * ethhdr ;
1352
1311
int buff_pos = 0 , packet_len ;
1353
- unsigned char * tt_buff , * packet_buff ;
1354
- bool ret ;
1312
+ unsigned char * tvlv_buff , * packet_buff ;
1355
1313
uint8_t * packet_pos ;
1314
+ bool ret ;
1356
1315
1357
1316
ret = batadv_check_management_packet (skb , if_incoming , BATADV_OGM_HLEN );
1358
1317
if (!ret )
@@ -1375,14 +1334,14 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
1375
1334
1376
1335
/* unpack the aggregated packets and process them one by one */
1377
1336
while (batadv_iv_ogm_aggr_packet (buff_pos , packet_len ,
1378
- batadv_ogm_packet -> tt_num_changes )) {
1379
- tt_buff = packet_buff + buff_pos + BATADV_OGM_HLEN ;
1337
+ batadv_ogm_packet -> tvlv_len )) {
1338
+ tvlv_buff = packet_buff + buff_pos + BATADV_OGM_HLEN ;
1380
1339
1381
- batadv_iv_ogm_process (ethhdr , batadv_ogm_packet , tt_buff ,
1382
- if_incoming );
1340
+ batadv_iv_ogm_process (ethhdr , batadv_ogm_packet ,
1341
+ tvlv_buff , if_incoming );
1383
1342
1384
1343
buff_pos += BATADV_OGM_HLEN ;
1385
- buff_pos += batadv_tt_len (batadv_ogm_packet -> tt_num_changes );
1344
+ buff_pos += ntohs (batadv_ogm_packet -> tvlv_len );
1386
1345
1387
1346
packet_pos = packet_buff + buff_pos ;
1388
1347
batadv_ogm_packet = (struct batadv_ogm_packet * )packet_pos ;
0 commit comments