Apply localmods to this map */
| 877 | |
| 878 | /* Apply localmods to this map */ |
| 879 | void gossmap_apply_localmods(struct gossmap *map, |
| 880 | struct gossmap_localmods *localmods) |
| 881 | { |
| 882 | size_t n = tal_count(localmods->mods); |
| 883 | |
| 884 | assert(!map->local); |
| 885 | map->local = localmods->local; |
| 886 | |
| 887 | for (size_t i = 0; i < n; i++) { |
| 888 | struct localmod *mod = &localmods->mods[i]; |
| 889 | struct gossmap_chan *chan; |
| 890 | |
| 891 | /* Find gossmap entry which this applies to. */ |
| 892 | chan = gossmap_find_chan(map, &mod->scid); |
| 893 | /* If it doesn't exist, are we supposed to create a local one? */ |
| 894 | if (!chan) { |
| 895 | if (mod->local_off == 0xFFFFFFFF) |
| 896 | continue; |
| 897 | |
| 898 | /* Create new channel, pointing into local. */ |
| 899 | chan = add_channel(map, map->map_size + mod->local_off, |
| 900 | true); |
| 901 | } |
| 902 | |
| 903 | /* Save old, overwrite (keep nodeidx) */ |
| 904 | for (size_t h = 0; h < 2; h++) { |
| 905 | if (!mod->updates_set[h]) |
| 906 | continue; |
| 907 | mod->orig[h] = chan->half[h]; |
| 908 | mod->orig_cupdate_off[h] = chan->cupdate_off[h]; |
| 909 | chan->half[h] = mod->hc[h]; |
| 910 | chan->half[h].nodeidx = mod->orig[h].nodeidx; |
| 911 | chan->cupdate_off[h] = 0xFFFFFFFF; |
| 912 | } |
| 913 | } |
| 914 | } |
| 915 | |
| 916 | void gossmap_remove_localmods(struct gossmap *map, |
| 917 | const struct gossmap_localmods *localmods) |