aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/bat_iv_ogm.c
diff options
context:
space:
mode:
authorSven Eckelmann <sven@narfation.org>2011-11-20 09:47:38 -0500
committerMarek Lindner <lindner_marek@yahoo.de>2012-02-16 13:50:19 -0500
commit76543d14aec6ce5cb3fc7be9b39c50fcebd2043b (patch)
tree4f739cfadaee8ec9a06d7855956f3accc1dcc2be /net/batman-adv/bat_iv_ogm.c
parent17071578888c7c18709e48e74fae228c04581b9a (diff)
batman-adv: Explicitly mark the common header structure
All batman-adv packets have a common 3 byte header. It can be used to share some code between different code paths, but it was never explicit stated that this header has to be always the same for all packets. Therefore, new code changes always have the problem that they may accidently introduce regressions by moving some elements around. A new structure is introduced that contains the common header and makes it easier visible that these 3 bytes have to be the same for all on-wire packets. Signed-off-by: Sven Eckelmann <sven@narfation.org> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
Diffstat (limited to 'net/batman-adv/bat_iv_ogm.c')
-rw-r--r--net/batman-adv/bat_iv_ogm.c47
1 files changed, 24 insertions, 23 deletions
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
index 3512e251545..d60e1ba0bc1 100644
--- a/net/batman-adv/bat_iv_ogm.c
+++ b/net/batman-adv/bat_iv_ogm.c
@@ -38,10 +38,10 @@ void bat_ogm_init(struct hard_iface *hard_iface)
38 hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC); 38 hard_iface->packet_buff = kmalloc(hard_iface->packet_len, GFP_ATOMIC);
39 39
40 batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff; 40 batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
41 batman_ogm_packet->packet_type = BAT_OGM; 41 batman_ogm_packet->header.packet_type = BAT_OGM;
42 batman_ogm_packet->version = COMPAT_VERSION; 42 batman_ogm_packet->header.version = COMPAT_VERSION;
43 batman_ogm_packet->header.ttl = 2;
43 batman_ogm_packet->flags = NO_FLAGS; 44 batman_ogm_packet->flags = NO_FLAGS;
44 batman_ogm_packet->ttl = 2;
45 batman_ogm_packet->tq = TQ_MAX_VALUE; 45 batman_ogm_packet->tq = TQ_MAX_VALUE;
46 batman_ogm_packet->tt_num_changes = 0; 46 batman_ogm_packet->tt_num_changes = 0;
47 batman_ogm_packet->ttvn = 0; 47 batman_ogm_packet->ttvn = 0;
@@ -53,7 +53,7 @@ void bat_ogm_init_primary(struct hard_iface *hard_iface)
53 53
54 batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff; 54 batman_ogm_packet = (struct batman_ogm_packet *)hard_iface->packet_buff;
55 batman_ogm_packet->flags = PRIMARIES_FIRST_HOP; 55 batman_ogm_packet->flags = PRIMARIES_FIRST_HOP;
56 batman_ogm_packet->ttl = TTL; 56 batman_ogm_packet->header.ttl = TTL;
57} 57}
58 58
59void bat_ogm_update_mac(struct hard_iface *hard_iface) 59void bat_ogm_update_mac(struct hard_iface *hard_iface)
@@ -137,7 +137,7 @@ static void bat_ogm_send_to_if(struct forw_packet *forw_packet,
137 fwd_str, (packet_num > 0 ? "aggregated " : ""), 137 fwd_str, (packet_num > 0 ? "aggregated " : ""),
138 batman_ogm_packet->orig, 138 batman_ogm_packet->orig,
139 ntohl(batman_ogm_packet->seqno), 139 ntohl(batman_ogm_packet->seqno),
140 batman_ogm_packet->tq, batman_ogm_packet->ttl, 140 batman_ogm_packet->tq, batman_ogm_packet->header.ttl,
141 (batman_ogm_packet->flags & DIRECTLINK ? 141 (batman_ogm_packet->flags & DIRECTLINK ?
142 "on" : "off"), 142 "on" : "off"),
143 batman_ogm_packet->ttvn, hard_iface->net_dev->name, 143 batman_ogm_packet->ttvn, hard_iface->net_dev->name,
@@ -188,7 +188,7 @@ void bat_ogm_emit(struct forw_packet *forw_packet)
188 188
189 /* multihomed peer assumed */ 189 /* multihomed peer assumed */
190 /* non-primary OGMs are only broadcasted on their interface */ 190 /* non-primary OGMs are only broadcasted on their interface */
191 if ((directlink && (batman_ogm_packet->ttl == 1)) || 191 if ((directlink && (batman_ogm_packet->header.ttl == 1)) ||
192 (forw_packet->own && (forw_packet->if_incoming != primary_if))) { 192 (forw_packet->own && (forw_packet->if_incoming != primary_if))) {
193 193
194 /* FIXME: what about aggregated packets ? */ 194 /* FIXME: what about aggregated packets ? */
@@ -198,7 +198,7 @@ void bat_ogm_emit(struct forw_packet *forw_packet)
198 (forw_packet->own ? "Sending own" : "Forwarding"), 198 (forw_packet->own ? "Sending own" : "Forwarding"),
199 batman_ogm_packet->orig, 199 batman_ogm_packet->orig,
200 ntohl(batman_ogm_packet->seqno), 200 ntohl(batman_ogm_packet->seqno),
201 batman_ogm_packet->ttl, 201 batman_ogm_packet->header.ttl,
202 forw_packet->if_incoming->net_dev->name, 202 forw_packet->if_incoming->net_dev->name,
203 forw_packet->if_incoming->net_dev->dev_addr); 203 forw_packet->if_incoming->net_dev->dev_addr);
204 204
@@ -272,7 +272,7 @@ static bool bat_ogm_can_aggregate(const struct batman_ogm_packet
272 * are flooded through the net */ 272 * are flooded through the net */
273 if ((!directlink) && 273 if ((!directlink) &&
274 (!(batman_ogm_packet->flags & DIRECTLINK)) && 274 (!(batman_ogm_packet->flags & DIRECTLINK)) &&
275 (batman_ogm_packet->ttl != 1) && 275 (batman_ogm_packet->header.ttl != 1) &&
276 276
277 /* own packets originating non-primary 277 /* own packets originating non-primary
278 * interfaces leave only that interface */ 278 * interfaces leave only that interface */
@@ -285,7 +285,7 @@ static bool bat_ogm_can_aggregate(const struct batman_ogm_packet
285 /* if the incoming packet is sent via this one 285 /* if the incoming packet is sent via this one
286 * interface only - we still can aggregate */ 286 * interface only - we still can aggregate */
287 if ((directlink) && 287 if ((directlink) &&
288 (new_batman_ogm_packet->ttl == 1) && 288 (new_batman_ogm_packet->header.ttl == 1) &&
289 (forw_packet->if_incoming == if_incoming) && 289 (forw_packet->if_incoming == if_incoming) &&
290 290
291 /* packets from direct neighbors or 291 /* packets from direct neighbors or
@@ -471,7 +471,7 @@ static void bat_ogm_forward(struct orig_node *orig_node,
471 uint8_t in_tq, in_ttl, tq_avg = 0; 471 uint8_t in_tq, in_ttl, tq_avg = 0;
472 uint8_t tt_num_changes; 472 uint8_t tt_num_changes;
473 473
474 if (batman_ogm_packet->ttl <= 1) { 474 if (batman_ogm_packet->header.ttl <= 1) {
475 bat_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n"); 475 bat_dbg(DBG_BATMAN, bat_priv, "ttl exceeded\n");
476 return; 476 return;
477 } 477 }
@@ -479,10 +479,10 @@ static void bat_ogm_forward(struct orig_node *orig_node,
479 router = orig_node_get_router(orig_node); 479 router = orig_node_get_router(orig_node);
480 480
481 in_tq = batman_ogm_packet->tq; 481 in_tq = batman_ogm_packet->tq;
482 in_ttl = batman_ogm_packet->ttl; 482 in_ttl = batman_ogm_packet->header.ttl;
483 tt_num_changes = batman_ogm_packet->tt_num_changes; 483 tt_num_changes = batman_ogm_packet->tt_num_changes;
484 484
485 batman_ogm_packet->ttl--; 485 batman_ogm_packet->header.ttl--;
486 memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); 486 memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN);
487 487
488 /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast 488 /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast
@@ -494,7 +494,8 @@ static void bat_ogm_forward(struct orig_node *orig_node,
494 batman_ogm_packet->tq = router->tq_avg; 494 batman_ogm_packet->tq = router->tq_avg;
495 495
496 if (router->last_ttl) 496 if (router->last_ttl)
497 batman_ogm_packet->ttl = router->last_ttl - 1; 497 batman_ogm_packet->header.ttl =
498 router->last_ttl - 1;
498 } 499 }
499 500
500 tq_avg = router->tq_avg; 501 tq_avg = router->tq_avg;
@@ -510,7 +511,7 @@ static void bat_ogm_forward(struct orig_node *orig_node,
510 "Forwarding packet: tq_orig: %i, tq_avg: %i, " 511 "Forwarding packet: tq_orig: %i, tq_avg: %i, "
511 "tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n", 512 "tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n",
512 in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1, 513 in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1,
513 batman_ogm_packet->ttl); 514 batman_ogm_packet->header.ttl);
514 515
515 batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno); 516 batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno);
516 batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc); 517 batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc);
@@ -642,8 +643,8 @@ static void bat_ogm_orig_update(struct bat_priv *bat_priv,
642 spin_unlock_bh(&neigh_node->tq_lock); 643 spin_unlock_bh(&neigh_node->tq_lock);
643 644
644 if (!is_duplicate) { 645 if (!is_duplicate) {
645 orig_node->last_ttl = batman_ogm_packet->ttl; 646 orig_node->last_ttl = batman_ogm_packet->header.ttl;
646 neigh_node->last_ttl = batman_ogm_packet->ttl; 647 neigh_node->last_ttl = batman_ogm_packet->header.ttl;
647 } 648 }
648 649
649 bonding_candidate_add(orig_node, neigh_node); 650 bonding_candidate_add(orig_node, neigh_node);
@@ -683,7 +684,7 @@ update_tt:
683 /* I have to check for transtable changes only if the OGM has been 684 /* I have to check for transtable changes only if the OGM has been
684 * sent through a primary interface */ 685 * sent through a primary interface */
685 if (((batman_ogm_packet->orig != ethhdr->h_source) && 686 if (((batman_ogm_packet->orig != ethhdr->h_source) &&
686 (batman_ogm_packet->ttl > 2)) || 687 (batman_ogm_packet->header.ttl > 2)) ||
687 (batman_ogm_packet->flags & PRIMARIES_FIRST_HOP)) 688 (batman_ogm_packet->flags & PRIMARIES_FIRST_HOP))
688 tt_update_orig(bat_priv, orig_node, tt_buff, 689 tt_update_orig(bat_priv, orig_node, tt_buff,
689 batman_ogm_packet->tt_num_changes, 690 batman_ogm_packet->tt_num_changes,
@@ -918,7 +919,7 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
918 * packet in an aggregation. Here we expect that the padding 919 * packet in an aggregation. Here we expect that the padding
919 * is always zero (or not 0x01) 920 * is always zero (or not 0x01)
920 */ 921 */
921 if (batman_ogm_packet->packet_type != BAT_OGM) 922 if (batman_ogm_packet->header.packet_type != BAT_OGM)
922 return; 923 return;
923 924
924 /* could be changed by schedule_own_packet() */ 925 /* could be changed by schedule_own_packet() */
@@ -938,8 +939,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
938 batman_ogm_packet->prev_sender, batman_ogm_packet->seqno, 939 batman_ogm_packet->prev_sender, batman_ogm_packet->seqno,
939 batman_ogm_packet->ttvn, batman_ogm_packet->tt_crc, 940 batman_ogm_packet->ttvn, batman_ogm_packet->tt_crc,
940 batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq, 941 batman_ogm_packet->tt_num_changes, batman_ogm_packet->tq,
941 batman_ogm_packet->ttl, batman_ogm_packet->version, 942 batman_ogm_packet->header.ttl,
942 has_directlink_flag); 943 batman_ogm_packet->header.version, has_directlink_flag);
943 944
944 rcu_read_lock(); 945 rcu_read_lock();
945 list_for_each_entry_rcu(hard_iface, &hardif_list, list) { 946 list_for_each_entry_rcu(hard_iface, &hardif_list, list) {
@@ -966,10 +967,10 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
966 } 967 }
967 rcu_read_unlock(); 968 rcu_read_unlock();
968 969
969 if (batman_ogm_packet->version != COMPAT_VERSION) { 970 if (batman_ogm_packet->header.version != COMPAT_VERSION) {
970 bat_dbg(DBG_BATMAN, bat_priv, 971 bat_dbg(DBG_BATMAN, bat_priv,
971 "Drop packet: incompatible batman version (%i)\n", 972 "Drop packet: incompatible batman version (%i)\n",
972 batman_ogm_packet->version); 973 batman_ogm_packet->header.version);
973 return; 974 return;
974 } 975 }
975 976
@@ -1091,7 +1092,7 @@ static void bat_ogm_process(const struct ethhdr *ethhdr,
1091 if (is_bidirectional && 1092 if (is_bidirectional &&
1092 (!is_duplicate || 1093 (!is_duplicate ||
1093 ((orig_node->last_real_seqno == batman_ogm_packet->seqno) && 1094 ((orig_node->last_real_seqno == batman_ogm_packet->seqno) &&
1094 (orig_node->last_ttl - 3 <= batman_ogm_packet->ttl)))) 1095 (orig_node->last_ttl - 3 <= batman_ogm_packet->header.ttl))))
1095 bat_ogm_orig_update(bat_priv, orig_node, ethhdr, 1096 bat_ogm_orig_update(bat_priv, orig_node, ethhdr,
1096 batman_ogm_packet, if_incoming, 1097 batman_ogm_packet, if_incoming,
1097 tt_buff, is_duplicate); 1098 tt_buff, is_duplicate);