Bläddra i källkod

client: FrameDecider: port multicast tree to SAvl

ambrop7 13 år sedan
förälder
incheckning
0b2cddc069
3 ändrade filer med 23 tillägg och 39 borttagningar
  1. 10 13
      client/FrameDecider.c
  2. 4 11
      client/FrameDecider.h
  3. 9 15
      client/FrameDecider_multicast_tree.h

+ 10 - 13
client/FrameDecider.c

@@ -64,7 +64,7 @@ static int compare_macs (const uint8_t *mac1, const uint8_t *mac2)
 #include <structure/SAvl_impl.h>
 #include <structure/SAvl_impl.h>
 
 
 #include "FrameDecider_multicast_tree.h"
 #include "FrameDecider_multicast_tree.h"
-#include <structure/CAvl_impl.h>
+#include <structure/SAvl_impl.h>
 
 
 static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
 static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
 {
 {
@@ -135,10 +135,9 @@ static void add_to_multicast (FrameDecider *d, struct _FrameDecider_group_entry
     // compute sig
     // compute sig
     uint32_t sig = compute_sig_for_group(group_entry->group);
     uint32_t sig = compute_sig_for_group(group_entry->group);
     
     
-    FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
-    if (FDMulticastTreeIsValidRef(ref)) {
+    struct _FrameDecider_group_entry *master = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
+    if (master) {
         // use existing master
         // use existing master
-        struct _FrameDecider_group_entry *master = ref.ptr;
         ASSERT(master->is_master)
         ASSERT(master->is_master)
         
         
         // set not master
         // set not master
@@ -156,7 +155,7 @@ static void add_to_multicast (FrameDecider *d, struct _FrameDecider_group_entry
         group_entry->master.sig = sig;
         group_entry->master.sig = sig;
         
         
         // insert to multicast tree
         // insert to multicast tree
-        int res = FDMulticastTree_Insert(&d->multicast_tree, 0, FDMulticastTreeDeref(0, group_entry), NULL);
+        int res = FDMulticastTree_Insert(&d->multicast_tree, 0, group_entry, NULL);
         ASSERT(res)
         ASSERT(res)
         
         
         // init list node
         // init list node
@@ -171,7 +170,7 @@ static void remove_from_multicast (FrameDecider *d, struct _FrameDecider_group_e
     
     
     if (group_entry->is_master) {
     if (group_entry->is_master) {
         // remove master from multicast tree
         // remove master from multicast tree
-        FDMulticastTree_Remove(&d->multicast_tree, 0, FDMulticastTreeDeref(0, group_entry));
+        FDMulticastTree_Remove(&d->multicast_tree, 0, group_entry);
         
         
         if (!LinkedList3Node_IsLonely(&group_entry->sig_list_node)) {
         if (!LinkedList3Node_IsLonely(&group_entry->sig_list_node)) {
             // at least one more group entry for this sig; make another entry the master
             // at least one more group entry for this sig; make another entry the master
@@ -188,7 +187,7 @@ static void remove_from_multicast (FrameDecider *d, struct _FrameDecider_group_e
             newmaster->master.sig = sig;
             newmaster->master.sig = sig;
             
             
             // insert to multicast tree
             // insert to multicast tree
-            int res = FDMulticastTree_Insert(&d->multicast_tree, 0, FDMulticastTreeDeref(0, newmaster), NULL);
+            int res = FDMulticastTree_Insert(&d->multicast_tree, 0, newmaster, NULL);
             ASSERT(res)
             ASSERT(res)
         }
         }
     }
     }
@@ -287,11 +286,10 @@ static void lower_group_timers_to_lmqt (FrameDecider *d, uint32_t group)
     uint32_t sig = compute_sig_for_group(group);
     uint32_t sig = compute_sig_for_group(group);
     
     
     // look up the sig in multicast tree
     // look up the sig in multicast tree
-    FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
-    if (FDMulticastTreeIsNullRef(ref)) {
+    struct _FrameDecider_group_entry *master = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
+    if (!master) {
         return;
         return;
     }
     }
-    struct _FrameDecider_group_entry *master = ref.ptr;
     ASSERT(master->is_master)
     ASSERT(master->is_master)
     
     
     // iterate all group entries with this sig
     // iterate all group entries with this sig
@@ -479,9 +477,8 @@ out:;
         uint32_t sig = compute_sig_for_mac(eh->dest);
         uint32_t sig = compute_sig_for_mac(eh->dest);
         
         
         // look up the sig in multicast tree
         // look up the sig in multicast tree
-        FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&o->multicast_tree, 0, sig);
-        if (FDMulticastTreeIsValidRef(ref)) {
-            struct _FrameDecider_group_entry *master = ref.ptr;
+        struct _FrameDecider_group_entry *master = FDMulticastTree_LookupExact(&o->multicast_tree, 0, sig);
+        if (master) {
             ASSERT(master->is_master)
             ASSERT(master->is_master)
             
             
             o->decide_state = DECIDE_STATE_MULTICAST;
             o->decide_state = DECIDE_STATE_MULTICAST;

+ 4 - 11
client/FrameDecider.h

@@ -39,7 +39,6 @@
 
 
 #include <structure/LinkedList2.h>
 #include <structure/LinkedList2.h>
 #include <structure/LinkedList3.h>
 #include <structure/LinkedList3.h>
-#include <structure/CAvl.h>
 #include <structure/SAvl.h>
 #include <structure/SAvl.h>
 #include <base/DebugObject.h>
 #include <base/DebugObject.h>
 #include <base/BLog.h>
 #include <base/BLog.h>
@@ -57,6 +56,9 @@ typedef const uint8_t *FDMacsTree_key;
 #include "FrameDecider_groups_tree.h"
 #include "FrameDecider_groups_tree.h"
 #include <structure/SAvl_decl.h>
 #include <structure/SAvl_decl.h>
 
 
+#include "FrameDecider_multicast_tree.h"
+#include <structure/SAvl_decl.h>
+
 struct _FrameDecider_mac_entry {
 struct _FrameDecider_mac_entry {
     struct _FrameDeciderPeer *peer;
     struct _FrameDeciderPeer *peer;
     LinkedList2Node list_node; // node in FrameDeciderPeer.mac_entries_free or FrameDeciderPeer.mac_entries_used
     LinkedList2Node list_node; // node in FrameDeciderPeer.mac_entries_free or FrameDeciderPeer.mac_entries_used
@@ -80,19 +82,10 @@ struct _FrameDecider_group_entry {
     // defined when used and we are master:
     // defined when used and we are master:
     struct {
     struct {
         uint32_t sig; // last 23 bits of group address
         uint32_t sig; // last 23 bits of group address
-        // node in FrameDecider.multicast_tree, indexed by sig
-        struct _FrameDecider_group_entry *tree_child[2];
-        struct _FrameDecider_group_entry *tree_parent;
-        int8_t tree_balance;
+        FDMulticastTreeNode tree_node; // node in FrameDecider.multicast_tree, indexed by sig
     } master;
     } master;
 };
 };
 
 
-typedef struct _FrameDecider_group_entry FDMulticastTree_entry;
-typedef struct _FrameDecider_group_entry *FDMulticastTree_link;
-
-#include "FrameDecider_multicast_tree.h"
-#include <structure/CAvl_decl.h>
-
 /**
 /**
  * Object that represents a local device.
  * Object that represents a local device.
  */
  */

+ 9 - 15
client/FrameDecider_multicast_tree.h

@@ -1,15 +1,9 @@
-#define CAVL_PARAM_NAME FDMulticastTree
-#define CAVL_PARAM_FEATURE_COUNTS 0
-#define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0
-#define CAVL_PARAM_FEATURE_NOKEYS 0
-#define CAVL_PARAM_TYPE_ENTRY FDMulticastTree_entry
-#define CAVL_PARAM_TYPE_LINK FDMulticastTree_link
-#define CAVL_PARAM_TYPE_KEY uint32_t
-#define CAVL_PARAM_TYPE_ARG int
-#define CAVL_PARAM_VALUE_NULL ((FDMulticastTree_link)NULL)
-#define CAVL_PARAM_FUN_DEREF(arg, link) (link)
-#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1).ptr->master.sig, (entry2).ptr->master.sig)
-#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2).ptr->master.sig)
-#define CAVL_PARAM_MEMBER_CHILD master.tree_child
-#define CAVL_PARAM_MEMBER_BALANCE master.tree_balance
-#define CAVL_PARAM_MEMBER_PARENT master.tree_parent
+#define SAVL_PARAM_NAME FDMulticastTree
+#define SAVL_PARAM_FEATURE_COUNTS 0
+#define SAVL_PARAM_FEATURE_NOKEYS 0
+#define SAVL_PARAM_TYPE_ENTRY struct _FrameDecider_group_entry
+#define SAVL_PARAM_TYPE_KEY uint32_t
+#define SAVL_PARAM_TYPE_ARG int
+#define SAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1)->master.sig, (entry2)->master.sig)
+#define SAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2)->master.sig)
+#define SAVL_PARAM_MEMBER_NODE master.tree_node