@@ -7,35 +7,71 @@ struct disabledmap *disabledmap_new(const tal_t *ctx)
77 if (!obj )
88 return NULL ;
99
10- obj -> disabled_scids = tal_arr (obj , struct short_channel_id , 0 );
11- obj -> warned_scids = tal_arr (obj , struct short_channel_id , 0 );
10+ obj -> disabled_map = tal (obj , struct scidd_map );
11+ obj -> warned_map = tal (obj , struct scidd_map );
12+ obj -> disabled_ctx = tal (obj , tal_t );
13+ obj -> warned_ctx = tal (obj , tal_t );
1214 obj -> disabled_nodes = tal_arr (obj , struct node_id , 0 );
1315
14- if (!obj -> disabled_scids || !obj -> warned_scids || !obj -> disabled_nodes )
16+ if (!obj -> disabled_map || !obj -> warned_map || !obj -> disabled_nodes ||
17+ !obj -> disabled_ctx || !obj -> warned_ctx )
1518 return tal_free (obj );
19+
20+ scidd_map_init (obj -> disabled_map );
21+ scidd_map_init (obj -> warned_map );
1622 return obj ;
1723}
1824
1925// FIXME: check success
2026void disabledmap_reset (struct disabledmap * p )
2127{
22- tal_resize (& p -> disabled_scids , 0 );
23- tal_resize (& p -> warned_scids , 0 );
28+ /* This will remove and free every element in the maps. */
29+ p -> warned_ctx = tal_free (p -> warned_ctx );
30+ p -> disabled_ctx = tal_free (p -> disabled_ctx );
31+
2432 tal_resize (& p -> disabled_nodes , 0 );
33+
34+ p -> disabled_ctx = tal (p , tal_t );
35+ p -> warned_ctx = tal (p , tal_t );
36+ }
37+
38+ static void remove_scidd (struct short_channel_id_dir * scidd ,
39+ struct scidd_map * map )
40+ {
41+ scidd_map_del (map , scidd );
2542}
2643
2744// FIXME: check success
2845void disabledmap_add_channel (struct disabledmap * p ,
29- struct short_channel_id scid )
46+ struct short_channel_id_dir scidd )
3047{
31- tal_arr_expand (& p -> disabled_scids , scid );
48+ struct short_channel_id_dir * ptr_scidd =
49+ scidd_map_get (p -> disabled_map , scidd );
50+ if (ptr_scidd ) {
51+ /* htable allows for duplicates, but we don't want duplicates.
52+ */
53+ return ;
54+ }
55+ ptr_scidd =
56+ tal_dup (p -> disabled_ctx , struct short_channel_id_dir , & scidd );
57+ scidd_map_add (p -> disabled_map , ptr_scidd );
58+ tal_add_destructor2 (ptr_scidd , remove_scidd , p -> disabled_map );
3259}
3360
3461// FIXME: check success
3562void disabledmap_warn_channel (struct disabledmap * p ,
36- struct short_channel_id scid )
63+ struct short_channel_id_dir scidd )
3764{
38- tal_arr_expand (& p -> warned_scids , scid );
65+ struct short_channel_id_dir * ptr_scidd =
66+ scidd_map_get (p -> warned_map , scidd );
67+ if (ptr_scidd ) {
68+ /* htable allows for duplicates, but we don't want duplicates.
69+ */
70+ return ;
71+ }
72+ ptr_scidd = tal_dup (p -> warned_ctx , struct short_channel_id_dir , & scidd );
73+ scidd_map_add (p -> warned_map , ptr_scidd );
74+ tal_add_destructor2 (ptr_scidd , remove_scidd , p -> warned_map );
3975}
4076
4177// FIXME: check success
@@ -45,29 +81,31 @@ void disabledmap_add_node(struct disabledmap *p, struct node_id node)
4581}
4682
4783bool disabledmap_channel_is_warned (struct disabledmap * p ,
48- struct short_channel_id scid )
84+ struct short_channel_id_dir scidd )
4985{
50- for (size_t i = 0 ; i < tal_count (p -> warned_scids ); i ++ ) {
51- if (short_channel_id_eq (scid , p -> warned_scids [i ]))
52- return true;
53- }
54- return false;
86+ return scidd_map_get (p -> warned_map , scidd ) != NULL ;
5587}
5688
5789bitmap * tal_disabledmap_get_bitmap (const tal_t * ctx , struct disabledmap * p ,
5890 const struct gossmap * gossmap )
5991{
60- bitmap * disabled =
61- tal_arrz ( ctx , bitmap , BITMAP_NWORDS (gossmap_max_chan_idx (gossmap )));
92+ bitmap * disabled = tal_arrz (
93+ ctx , bitmap , 2 * BITMAP_NWORDS (gossmap_max_chan_idx (gossmap )));
6294 if (!disabled )
6395 return NULL ;
6496
6597 /* Disable every channel in the list of disabled scids. */
66- for (size_t i = 0 ; i < tal_count (p -> disabled_scids ); i ++ ) {
98+ struct scidd_map_iter it ;
99+ for (struct short_channel_id_dir * scidd = scidd_map_first (p -> disabled_map ,& it );
100+ scidd ;
101+ scidd = scidd_map_next (p -> disabled_map , & it )){
102+
67103 struct gossmap_chan * c =
68- gossmap_find_chan (gossmap , & p -> disabled_scids [ i ] );
104+ gossmap_find_chan (gossmap , & scidd -> scid );
69105 if (c )
70- bitmap_set_bit (disabled , gossmap_chan_idx (gossmap , c ));
106+ bitmap_set_bit (disabled ,
107+ gossmap_chan_idx (gossmap , c ) * 2 +
108+ scidd -> dir );
71109 }
72110
73111 /* Disable all channels that lead to a disabled node. */
@@ -79,7 +117,8 @@ bitmap *tal_disabledmap_get_bitmap(const tal_t *ctx, struct disabledmap *p,
79117 int half ;
80118 const struct gossmap_chan * c =
81119 gossmap_nth_chan (gossmap , node , j , & half );
82- bitmap_set_bit (disabled , gossmap_chan_idx (gossmap , c ));
120+ bitmap_set_bit (disabled ,
121+ gossmap_chan_idx (gossmap , c ) * 2 + half );
83122 }
84123 }
85124 return disabled ;
0 commit comments