diff --git a/channeld/channel_wire.csv b/channeld/channel_wire.csv index c7505f5af..95e9b7d6b 100644 --- a/channeld/channel_wire.csv +++ b/channeld/channel_wire.csv @@ -8,7 +8,7 @@ # Begin! (passes gossipd-client fd) msgtype,channel_init,1000 msgdata,channel_init,chainparams,chainparams, -msgdata,channel_init,feature_set,feature_set, +msgdata,channel_init,our_features,feature_set, msgdata,channel_init,funding_txid,bitcoin_txid, msgdata,channel_init,funding_txout,u16, msgdata,channel_init,funding_satoshi,amount_sat, @@ -64,8 +64,8 @@ msgdata,channel_init,init_peer_pkt_len,u16, msgdata,channel_init,init_peer_pkt,u8,init_peer_pkt_len msgdata,channel_init,reached_announce_depth,bool, msgdata,channel_init,last_remote_secret,secret, -msgdata,channel_init,lflen,u16, -msgdata,channel_init,localfeatures,u8,lflen +msgdata,channel_init,flen,u16, +msgdata,channel_init,their_features,u8,flen msgdata,channel_init,upfront_shutdown_script_len,u16, msgdata,channel_init,upfront_shutdown_script,u8,upfront_shutdown_script_len msgdata,channel_init,remote_ann_node_sig,?secp256k1_ecdsa_signature, diff --git a/channeld/channeld.c b/channeld/channeld.c index dc04e03f9..9768bda91 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -74,10 +74,10 @@ struct peer { u64 next_index[NUM_SIDES]; /* Features peer supports. */ - u8 *features; + u8 *their_features; /* Features we support. */ - struct feature_set *fset; + struct feature_set *our_features; /* Tolerable amounts for feerate (only relevant for fundee). */ u32 feerate_min, feerate_max; @@ -418,7 +418,9 @@ static void send_announcement_signatures(struct peer *peer) static u8 *create_channel_announcement(const tal_t *ctx, struct peer *peer) { int first, second; - u8 *cannounce, *features = get_agreed_channelfeatures(tmpctx, peer->fset, peer->features); + u8 *cannounce, *features + = get_agreed_channelfeatures(tmpctx, peer->our_features, + peer->their_features); if (peer->channel_direction == 0) { first = LOCAL; @@ -2328,7 +2330,8 @@ static void peer_reconnect(struct peer *peer, bool dataloss_protect, check_extra_fields; const u8 **premature_msgs = tal_arr(peer, const u8 *, 0); - dataloss_protect = feature_negotiated(peer->fset, peer->features, + dataloss_protect = feature_negotiated(peer->our_features, + peer->their_features, OPT_DATA_LOSS_PROTECT); /* Both these options give us extra fields to check. */ @@ -3059,7 +3062,7 @@ static void init_channel(struct peer *peer) msg = wire_sync_read(tmpctx, MASTER_FD); if (!fromwire_channel_init(peer, msg, &chainparams, - &peer->fset, + &peer->our_features, &funding_txid, &funding_txout, &funding, &minimum_depth, @@ -3105,7 +3108,7 @@ static void init_channel(struct peer *peer) &funding_signed, &peer->announce_depth_reached, &last_remote_per_commit_secret, - &peer->features, + &peer->their_features, &peer->remote_upfront_shutdown_script, &remote_ann_node_sig, &remote_ann_bitcoin_sig, diff --git a/common/bolt11.c b/common/bolt11.c index 08173ef72..9acaac645 100644 --- a/common/bolt11.c +++ b/common/bolt11.c @@ -489,7 +489,7 @@ static void shift_bitmap_down(u8 *bitmap, size_t bits) * See [Feature Bits](#feature-bits). */ static char *decode_9(struct bolt11 *b11, - const struct feature_set *fset, + const struct feature_set *our_features, struct hash_u5 *hu5, u5 **data, size_t *data_len, size_t data_length) @@ -512,9 +512,10 @@ static char *decode_9(struct bolt11 *b11, * - if the `9` field contains unknown _even_ bits that are non-zero: * - MUST fail the payment. */ - /* We skip this check for the cli tool, which sets fset to NULL */ - if (fset) { - badf = features_unsupported(fset, b11->features, BOLT11_FEATURE); + /* We skip this check for the cli tool, which sets our_features to NULL */ + if (our_features) { + badf = features_unsupported(our_features, + b11->features, BOLT11_FEATURE); if (badf != -1) return tal_fmt(b11, "9: unknown feature bit %i", badf); } @@ -545,7 +546,7 @@ struct bolt11 *new_bolt11(const tal_t *ctx, /* Decodes and checks signature; returns NULL on error. */ struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str, - const struct feature_set *fset, + const struct feature_set *our_features, const char *description, char **fail) { char *hrp, *amountstr, *prefix; @@ -740,7 +741,8 @@ struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str, data_length); break; case '9': - problem = decode_9(b11, fset, &hu5, &data, &data_len, + problem = decode_9(b11, our_features, &hu5, + &data, &data_len, data_length); break; case 's': diff --git a/common/bolt11.h b/common/bolt11.h index dae6da562..0f301241f 100644 --- a/common/bolt11.h +++ b/common/bolt11.h @@ -80,7 +80,7 @@ struct bolt11 { * fset is NULL to accept any features (usually not desirable!). */ struct bolt11 *bolt11_decode(const tal_t *ctx, const char *str, - const struct feature_set *fset, + const struct feature_set *our_features, const char *description, char **fail); /* Initialize an empty bolt11 struct with optional amount */ diff --git a/common/features.c b/common/features.c index 58a101904..ba20abda4 100644 --- a/common/features.c +++ b/common/features.c @@ -158,17 +158,17 @@ static void clear_feature_bit(u8 *features, u32 bit) * it sets. */ u8 *get_agreed_channelfeatures(const tal_t *ctx, - const struct feature_set *ours, - const u8 *theirfeatures) + const struct feature_set *our_features, + const u8 *their_features) { - u8 *f = tal_dup_talarr(ctx, u8, ours->bits[CHANNEL_FEATURE]); + u8 *f = tal_dup_talarr(ctx, u8, our_features->bits[CHANNEL_FEATURE]); size_t max_len = 0; /* Clear any features which they didn't offer too */ for (size_t i = 0; i < 8 * tal_count(f); i += 2) { if (!feature_offered(f, i)) continue; - if (!feature_offered(theirfeatures, i)) { + if (!feature_offered(their_features, i)) { clear_feature_bit(f, COMPULSORY_FEATURE(i)); clear_feature_bit(f, OPTIONAL_FEATURE(i)); continue; @@ -197,11 +197,11 @@ bool feature_offered(const u8 *features, size_t f) || feature_is_set(features, OPTIONAL_FEATURE(f)); } -bool feature_negotiated(const struct feature_set *ours, - const u8 *lfeatures, size_t f) +bool feature_negotiated(const struct feature_set *our_features, + const u8 *their_features, size_t f) { - return feature_offered(lfeatures, f) - && feature_offered(ours->bits[INIT_FEATURE], f); + return feature_offered(their_features, f) + && feature_offered(our_features->bits[INIT_FEATURE], f); } /** @@ -215,7 +215,7 @@ bool feature_negotiated(const struct feature_set *ours, * * Returns -1 on success, or first unsupported feature. */ -static int all_supported_features(const struct feature_set *ours, +static int all_supported_features(const struct feature_set *our_features, const u8 *bitmap, enum feature_place p) { @@ -226,7 +226,7 @@ static int all_supported_features(const struct feature_set *ours, if (!test_bit(bitmap, bitnum/8, bitnum%8)) continue; - if (feature_offered(ours->bits[p], bitnum)) + if (feature_offered(our_features->bits[p], bitnum)) continue; return bitnum; @@ -234,16 +234,17 @@ static int all_supported_features(const struct feature_set *ours, return -1; } -int features_unsupported(const struct feature_set *ours, const u8 *theirs, +int features_unsupported(const struct feature_set *our_features, + const u8 *their_features, enum feature_place p) { /* BIT 2 would logically be "compulsory initial_routing_sync", but * that does not exist, so we special case it. */ - if (feature_is_set(theirs, + if (feature_is_set(their_features, COMPULSORY_FEATURE(OPT_INITIAL_ROUTING_SYNC))) return COMPULSORY_FEATURE(OPT_INITIAL_ROUTING_SYNC); - return all_supported_features(ours, theirs, p); + return all_supported_features(our_features, their_features, p); } static const char *feature_name(const tal_t *ctx, size_t f) @@ -269,12 +270,12 @@ static const char *feature_name(const tal_t *ctx, size_t f) } const char **list_supported_features(const tal_t *ctx, - const struct feature_set *ours) + const struct feature_set *fset) { const char **list = tal_arr(ctx, const char *, 0); - for (size_t i = 0; i < tal_bytelen(ours->bits[INIT_FEATURE]) * 8; i++) { - if (test_bit(ours->bits[INIT_FEATURE], i / 8, i % 8)) + for (size_t i = 0; i < tal_bytelen(fset->bits[INIT_FEATURE]) * 8; i++) { + if (test_bit(fset->bits[INIT_FEATURE], i / 8, i % 8)) tal_arr_expand(&list, feature_name(list, i)); } diff --git a/common/features.h b/common/features.h index 40b681f5d..bf6b534e1 100644 --- a/common/features.h +++ b/common/features.h @@ -32,24 +32,25 @@ bool feature_set_or(struct feature_set *a, /* Returns -1 if we're OK with all these offered features, otherwise first * unsupported (even) feature. */ -int features_unsupported(const struct feature_set *ours, const u8 *theirs, +int features_unsupported(const struct feature_set *our_features, + const u8 *their_features, enum feature_place p); /* For the features in channel_announcement */ u8 *get_agreed_channelfeatures(const tal_t *ctx, - const struct feature_set *ours, + const struct feature_set *our_features, const u8 *theirfeatures); /* Is this feature bit requested? (Either compulsory or optional) */ bool feature_offered(const u8 *features, size_t f); /* Was this feature bit offered by them and us? */ -bool feature_negotiated(const struct feature_set *ours, - const u8 *features, size_t f); +bool feature_negotiated(const struct feature_set *our_features, + const u8 *their_features, size_t f); /* Return a list of what (init) features we advertize. */ const char **list_supported_features(const tal_t *ctx, - const struct feature_set *ours); + const struct feature_set *fset); /* Low-level helpers to deal with big-endian bitfields. */ bool feature_is_set(const u8 *features, size_t bit); diff --git a/connectd/connect_wire.csv b/connectd/connect_wire.csv index cf8bf988b..ef11459ae 100644 --- a/connectd/connect_wire.csv +++ b/connectd/connect_wire.csv @@ -6,7 +6,7 @@ msgtype,connectctl_init,2000 msgdata,connectctl_init,chainparams,chainparams, -msgdata,connectctl_init,feature_set,feature_set, +msgdata,connectctl_init,our_features,feature_set, msgdata,connectctl_init,id,node_id, msgdata,connectctl_init,num_wireaddrs,u16, msgdata,connectctl_init,wireaddrs,wireaddr_internal,num_wireaddrs diff --git a/connectd/connectd.c b/connectd/connectd.c index c6bb4eca6..68e35637e 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -156,7 +156,7 @@ struct daemon { bool use_v3_autotor; /* Our features, as lightningd told us */ - struct feature_set *fset; + struct feature_set *our_features; }; /* Peers we're trying to reach: we iterate through addrs until we succeed @@ -294,7 +294,7 @@ static void connected_to_peer(struct daemon *daemon, */ static bool get_gossipfds(struct daemon *daemon, const struct node_id *id, - const u8 *features, + const u8 *their_features, struct per_peer_state *pps) { bool gossip_queries_feature, initial_routing_sync, success; @@ -303,13 +303,14 @@ static bool get_gossipfds(struct daemon *daemon, /*~ The way features generally work is that both sides need to offer it; * we always offer `gossip_queries`, but this check is explicit. */ gossip_queries_feature - = feature_negotiated(daemon->fset, features, OPT_GOSSIP_QUERIES); + = feature_negotiated(daemon->our_features, their_features, + OPT_GOSSIP_QUERIES); /*~ `initial_routing_sync` is supported by every node, since it was in * the initial lightning specification: it means the peer wants the * backlog of existing gossip. */ initial_routing_sync - = feature_offered(features, OPT_INITIAL_ROUTING_SYNC); + = feature_offered(their_features, OPT_INITIAL_ROUTING_SYNC); /*~ We do this communication sync, since gossipd is our friend and * it's easier. If gossipd fails, we fail. */ @@ -348,7 +349,7 @@ struct peer_reconnected { struct node_id id; struct wireaddr_internal addr; struct crypto_state cs; - const u8 *features; + const u8 *their_features; }; /*~ For simplicity, lightningd only ever deals with a single connection per @@ -365,7 +366,7 @@ static struct io_plan *retry_peer_connected(struct io_conn *conn, /*~ Usually the pattern is to return this directly, but we have to free * our temporary structure. */ plan = peer_connected(conn, pr->daemon, &pr->id, &pr->addr, &pr->cs, - take(pr->features)); + take(pr->their_features)); tal_free(pr); return plan; } @@ -377,7 +378,7 @@ static struct io_plan *peer_reconnected(struct io_conn *conn, const struct node_id *id, const struct wireaddr_internal *addr, const struct crypto_state *cs, - const u8 *features TAKES) + const u8 *their_features TAKES) { u8 *msg; struct peer_reconnected *pr; @@ -397,7 +398,7 @@ static struct io_plan *peer_reconnected(struct io_conn *conn, /*~ Note that tal_dup_talarr() will do handle the take() of features * (turning it into a simply tal_steal() in those cases). */ - pr->features = tal_dup_talarr(pr, u8, features); + pr->their_features = tal_dup_talarr(pr, u8, their_features); /*~ ccan/io supports waiting on an address: in this case, the key in * the peer set. When someone calls `io_wake()` on that address, it @@ -417,18 +418,19 @@ struct io_plan *peer_connected(struct io_conn *conn, const struct node_id *id, const struct wireaddr_internal *addr, struct crypto_state *cs, - const u8 *features TAKES) + const u8 *their_features TAKES) { u8 *msg; struct per_peer_state *pps; int unsup; if (node_set_get(&daemon->peers, id)) - return peer_reconnected(conn, daemon, id, addr, cs, features); + return peer_reconnected(conn, daemon, id, addr, cs, + their_features); /* We promised we'd take it by marking it TAKEN above; prepare to free it. */ - if (taken(features)) - tal_steal(tmpctx, features); + if (taken(their_features)) + tal_steal(tmpctx, their_features); /* BOLT #1: * @@ -439,7 +441,8 @@ struct io_plan *peer_connected(struct io_conn *conn, * - upon receiving unknown _even_ feature bits that are non-zero: * - MUST fail the connection. */ - unsup = features_unsupported(daemon->fset, features, INIT_FEATURE); + unsup = features_unsupported(daemon->our_features, their_features, + INIT_FEATURE); if (unsup != -1) { msg = towire_errorfmt(NULL, NULL, "Unsupported feature %u", unsup); @@ -454,11 +457,11 @@ struct io_plan *peer_connected(struct io_conn *conn, pps = new_per_peer_state(tmpctx, cs); /* If gossipd can't give us a file descriptor, we give up connecting. */ - if (!get_gossipfds(daemon, id, features, pps)) + if (!get_gossipfds(daemon, id, their_features, pps)) return io_close(conn); /* Create message to tell master peer has connected. */ - msg = towire_connect_peer_connected(NULL, id, addr, pps, features); + msg = towire_connect_peer_connected(NULL, id, addr, pps, their_features); /*~ daemon_conn is a message queue for inter-daemon communication: we * queue up the `connect_peer_connected` message to tell lightningd @@ -493,7 +496,8 @@ static struct io_plan *handshake_in_success(struct io_conn *conn, struct node_id id; node_id_from_pubkey(&id, id_key); status_peer_debug(&id, "Connect IN"); - return peer_exchange_initmsg(conn, daemon, daemon->fset, cs, &id, addr); + return peer_exchange_initmsg(conn, daemon, daemon->our_features, + cs, &id, addr); } /*~ When we get a connection in we set up its network address then call @@ -554,7 +558,8 @@ static struct io_plan *handshake_out_success(struct io_conn *conn, connect->connstate = "Exchanging init messages"; status_peer_debug(&id, "Connect OUT"); return peer_exchange_initmsg(conn, connect->daemon, - connect->daemon->fset, cs, &id, addr); + connect->daemon->our_features, + cs, &id, addr); } struct io_plan *connection_out(struct io_conn *conn, struct connecting *connect) @@ -1211,7 +1216,7 @@ static struct io_plan *connect_init(struct io_conn *conn, if (!fromwire_connectctl_init( daemon, msg, &chainparams, - &daemon->fset, + &daemon->our_features, &daemon->id, &proposed_wireaddr, &proposed_listen_announce, diff --git a/connectd/connectd.h b/connectd/connectd.h index a66b768da..e5fbd35b4 100644 --- a/connectd/connectd.h +++ b/connectd/connectd.h @@ -19,6 +19,6 @@ struct io_plan *peer_connected(struct io_conn *conn, const struct node_id *id, const struct wireaddr_internal *addr, struct crypto_state *cs, - const u8 *features TAKES); + const u8 *their_features TAKES); #endif /* LIGHTNING_CONNECTD_CONNECTD_H */ diff --git a/connectd/peer_exchange_initmsg.c b/connectd/peer_exchange_initmsg.c index a8c96f19d..7c7427e5d 100644 --- a/connectd/peer_exchange_initmsg.c +++ b/connectd/peer_exchange_initmsg.c @@ -135,7 +135,7 @@ static struct io_plan *peer_write_postclose(struct io_conn *conn, struct io_plan *peer_exchange_initmsg(struct io_conn *conn, struct daemon *daemon, - const struct feature_set *fset, + const struct feature_set *our_features, const struct crypto_state *cs, const struct node_id *id, const struct wireaddr_internal *addr) @@ -182,8 +182,8 @@ struct io_plan *peer_exchange_initmsg(struct io_conn *conn, * Finally, we agreed that bits below 13 could be put in both, but * from now on they'll all go in initfeatures. */ peer->msg = towire_init(NULL, - fset->bits[GLOBAL_INIT_FEATURE], - fset->bits[INIT_FEATURE], + our_features->bits[GLOBAL_INIT_FEATURE], + our_features->bits[INIT_FEATURE], tlvs); status_peer_io(LOG_IO_OUT, &peer->id, peer->msg); peer->msg = cryptomsg_encrypt_msg(peer, &peer->cs, take(peer->msg)); diff --git a/connectd/peer_exchange_initmsg.h b/connectd/peer_exchange_initmsg.h index ee7c5ae09..9948ba349 100644 --- a/connectd/peer_exchange_initmsg.h +++ b/connectd/peer_exchange_initmsg.h @@ -12,7 +12,7 @@ struct wireaddr_internal; /* If successful, calls peer_connected() */ struct io_plan *peer_exchange_initmsg(struct io_conn *conn, struct daemon *daemon, - const struct feature_set *fset, + const struct feature_set *our_features, const struct crypto_state *cs, const struct node_id *id, const struct wireaddr_internal *addr); diff --git a/gossipd/gossip_generation.c b/gossipd/gossip_generation.c index 3fab950e2..773f8f5b5 100644 --- a/gossipd/gossip_generation.c +++ b/gossipd/gossip_generation.c @@ -39,7 +39,8 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon, announcement = towire_node_announcement(ctx, sig, - daemon->fset->bits[NODE_ANNOUNCE_FEATURE], + daemon->our_features->bits + [NODE_ANNOUNCE_FEATURE], timestamp, &daemon->id, daemon->rgb, daemon->alias, addresses); diff --git a/gossipd/gossip_wire.csv b/gossipd/gossip_wire.csv index 706faae6a..60a638fa5 100644 --- a/gossipd/gossip_wire.csv +++ b/gossipd/gossip_wire.csv @@ -6,7 +6,7 @@ # Initialize the gossip daemon. msgtype,gossipctl_init,3000 msgdata,gossipctl_init,chainparams,chainparams, -msgdata,gossipctl_init,feature_set,feature_set, +msgdata,gossipctl_init,our_features,feature_set, msgdata,gossipctl_init,id,node_id, msgdata,gossipctl_init,rgb,u8,3 msgdata,gossipctl_init,alias,u8,32 diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index 46a10f584..73d225cec 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -834,7 +834,7 @@ static struct io_plan *gossip_init(struct io_conn *conn, if (!fromwire_gossipctl_init(daemon, msg, &chainparams, - &daemon->fset, + &daemon->our_features, &daemon->id, daemon->rgb, daemon->alias, diff --git a/gossipd/gossipd.h b/gossipd/gossipd.h index 14ae9f736..66da99adf 100644 --- a/gossipd/gossipd.h +++ b/gossipd/gossipd.h @@ -59,7 +59,7 @@ struct daemon { struct seeker *seeker; /* Features lightningd told us to set. */ - struct feature_set *fset; + struct feature_set *our_features; }; /* This represents each peer we're gossiping with */ diff --git a/lightningd/channel_control.c b/lightningd/channel_control.c index 01abc3303..699173aa6 100644 --- a/lightningd/channel_control.c +++ b/lightningd/channel_control.c @@ -471,7 +471,7 @@ void peer_start_channeld(struct channel *channel, initmsg = towire_channel_init(tmpctx, chainparams, - ld->feature_set, + ld->our_features, &channel->funding_txid, channel->funding_outnum, channel->funding, @@ -517,7 +517,7 @@ void peer_start_channeld(struct channel *channel, funding_signed, reached_announce_depth, &last_remote_per_commit_secret, - channel->peer->features, + channel->peer->their_features, channel->remote_upfront_shutdown_script, remote_ann_node_sig, remote_ann_bitcoin_sig, diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index 5e5d119ee..3229e3d29 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -72,7 +72,7 @@ static struct command_result *connect_cmd_succeed(struct command *cmd, { struct json_stream *response = json_stream_success(cmd); json_add_node_id(response, "id", &peer->id); - json_add_hex_talarr(response, "features", peer->features); + json_add_hex_talarr(response, "features", peer->their_features); return command_success(cmd, response); } @@ -365,7 +365,7 @@ int connectd_init(struct lightningd *ld) msg = towire_connectctl_init( tmpctx, chainparams, - ld->feature_set, + ld->our_features, &ld->id, wireaddrs, listen_announce, diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index 0b6760fa6..4018d0699 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -209,7 +209,7 @@ void gossip_init(struct lightningd *ld, int connectd_fd) msg = towire_gossipctl_init( tmpctx, chainparams, - ld->feature_set, + ld->our_features, &ld->id, ld->rgb, ld->alias, diff --git a/lightningd/invoice.c b/lightningd/invoice.c index 2edeb92d1..43153e256 100644 --- a/lightningd/invoice.c +++ b/lightningd/invoice.c @@ -1014,7 +1014,7 @@ static struct command_result *json_invoice(struct command *cmd, info->b11->payment_secret = tal_dup(info->b11, struct secret, &payment_secret); info->b11->features = tal_dup_talarr(info->b11, u8, - cmd->ld->feature_set + cmd->ld->our_features ->bits[BOLT11_FEATURE]); #if DEVELOPER @@ -1321,7 +1321,7 @@ static struct command_result *json_decodepay(struct command *cmd, NULL)) return command_param_failed(); - b11 = bolt11_decode(cmd, str, cmd->ld->feature_set, desc, &fail); + b11 = bolt11_decode(cmd, str, cmd->ld->our_features, desc, &fail); if (!b11) { return command_fail(cmd, LIGHTNINGD, "Invalid bolt11: %s", fail); diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index 649fd5099..31e6ec999 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -785,7 +785,7 @@ int main(int argc, char *argv[]) errx(1, "Could not find daemons"); /* Set up the feature bits for what we support */ - ld->feature_set = default_features(ld); + ld->our_features = default_features(ld); /*~ Handle early options; this moves us into --lightning-dir. * Plugins may add new options, which is why we are splitting diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index 75f6c145d..a239122df 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -120,7 +120,7 @@ struct lightningd { struct node_id id; /* Feature set we offer. */ - struct feature_set *feature_set; + struct feature_set *our_features; /* My name is... my favorite color is... */ u8 *alias; /* At least 32 bytes (zero-filled) */ diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index 622b9522c..fe8067ca3 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -220,8 +220,9 @@ wallet_commit_channel(struct lightningd *ld, */ /* i.e. We set it now for the channel permanently. */ option_static_remotekey - = feature_negotiated(ld->feature_set, - uc->peer->features, OPT_STATIC_REMOTEKEY); + = feature_negotiated(ld->our_features, + uc->peer->their_features, + OPT_STATIC_REMOTEKEY); channel = new_channel(uc->peer, uc->dbid, NULL, /* No shachain yet */ @@ -1000,7 +1001,7 @@ void peer_start_openingd(struct peer *peer, msg = towire_opening_init(NULL, chainparams, - peer->ld->feature_set, + peer->ld->our_features, &uc->our_config, max_to_self_delay, min_effective_htlc_capacity, @@ -1009,9 +1010,9 @@ void peer_start_openingd(struct peer *peer, uc->minimum_depth, feerate_min(peer->ld, NULL), feerate_max(peer->ld, NULL), - peer->features, - feature_negotiated(peer->ld->feature_set, - peer->features, + peer->their_features, + feature_negotiated(peer->ld->our_features, + peer->their_features, OPT_STATIC_REMOTEKEY), send_msg, IFDEV(peer->ld->dev_force_tmp_channel_id, NULL), @@ -1199,8 +1200,8 @@ static struct command_result *json_fund_channel_start(struct command *cmd, * - otherwise: * - MUST set `funding_satoshis` to less than 2^24 satoshi. */ - if (!feature_negotiated(cmd->ld->feature_set, - peer->features, OPT_LARGE_CHANNELS) + if (!feature_negotiated(cmd->ld->our_features, + peer->their_features, OPT_LARGE_CHANNELS) && amount_sat_greater(*amount, chainparams->max_funding)) return command_fail(cmd, FUND_MAX_EXCEEDED, "Amount exceeded %s", diff --git a/lightningd/options.c b/lightningd/options.c index 9289e6e96..1cc9bd9d7 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -692,7 +692,7 @@ static char *test_subdaemons_and_exit(struct lightningd *ld) static char *list_features_and_exit(struct lightningd *ld) { - const char **features = list_supported_features(tmpctx, ld->feature_set); + const char **features = list_supported_features(tmpctx, ld->our_features); for (size_t i = 0; i < tal_count(features); i++) printf("%s\n", features[i]); exit(0); @@ -744,7 +744,7 @@ static char *opt_start_daemon(struct lightningd *ld) static char *opt_set_wumbo(struct lightningd *ld) { - feature_set_or(ld->feature_set, + feature_set_or(ld->our_features, take(feature_set_for_feature(NULL, OPTIONAL_FEATURE(OPT_LARGE_CHANNELS)))); return NULL; @@ -1203,7 +1203,8 @@ static void add_config(struct lightningd *ld, json_add_bool(response, "encrypted-hsm", ld->encrypted_hsm); } else if (opt->cb == (void *)opt_set_wumbo) { json_add_bool(response, "wumbo", - feature_offered(ld->feature_set->bits[INIT_FEATURE], + feature_offered(ld->our_features + ->bits[INIT_FEATURE], OPT_LARGE_CHANNELS)); } else { /* Insert more decodes here! */ diff --git a/lightningd/pay.c b/lightningd/pay.c index ff926c281..38e2e7171 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -1406,7 +1406,7 @@ static struct command_result *json_listsendpays(struct command *cmd, struct bolt11 *b11; char *fail; - b11 = bolt11_decode(cmd, b11str, cmd->ld->feature_set, NULL, &fail); + b11 = bolt11_decode(cmd, b11str, cmd->ld->our_features, NULL, &fail); if (!b11) { return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid bolt11: %s", fail); diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index a860312bc..61c6cc911 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -74,10 +74,11 @@ static void destroy_peer(struct peer *peer) list_del_from(&peer->ld->peers, &peer->list); } -static void peer_update_features(struct peer *peer, const u8 *features TAKES) +static void peer_update_features(struct peer *peer, + const u8 *their_features TAKES) { - tal_free(peer->features); - peer->features = tal_dup_talarr(peer, u8, features); + tal_free(peer->their_features); + peer->their_features = tal_dup_talarr(peer, u8, their_features); } struct peer *new_peer(struct lightningd *ld, u64 dbid, @@ -92,7 +93,7 @@ struct peer *new_peer(struct lightningd *ld, u64 dbid, peer->id = *id; peer->uncommitted_channel = NULL; peer->addr = *addr; - peer->features = NULL; + peer->their_features = NULL; list_head_init(&peer->channels); peer->direction = node_id_idx(&peer->ld->id, &peer->id); #if DEVELOPER @@ -851,7 +852,7 @@ peer_connected_serialize(struct peer_connected_hook_payload *payload, json_add_string( stream, "addr", type_to_string(stream, struct wireaddr_internal, &payload->addr)); - json_add_hex_talarr(stream, "features", p->features); + json_add_hex_talarr(stream, "features", p->their_features); json_object_end(stream); /* .peer */ } @@ -980,7 +981,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg, int peer_fd, int gossip_fd, int gossip_store_fd) { struct node_id id; - u8 *features; + u8 *their_features; struct peer *peer; struct peer_connected_hook_payload *hook_payload; @@ -989,7 +990,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg, if (!fromwire_connect_peer_connected(hook_payload, msg, &id, &hook_payload->addr, &hook_payload->pps, - &features)) + &their_features)) fatal("Connectd gave bad CONNECT_PEER_CONNECTED message %s", tal_hex(msg, msg)); @@ -1005,7 +1006,7 @@ void peer_connected(struct lightningd *ld, const u8 *msg, tal_steal(peer, hook_payload); hook_payload->peer = peer; - peer_update_features(peer, features); + peer_update_features(peer, their_features); /* Complete any outstanding connect commands. */ connect_succeeded(ld, peer); @@ -1173,7 +1174,7 @@ static void json_add_peer(struct lightningd *ld, struct wireaddr_internal, &p->addr)); json_array_end(response); - json_add_hex_talarr(response, "features", p->features); + json_add_hex_talarr(response, "features", p->their_features); } json_array_start(response, "channels"); diff --git a/lightningd/peer_control.h b/lightningd/peer_control.h index 0d53760a9..58261f16f 100644 --- a/lightningd/peer_control.h +++ b/lightningd/peer_control.h @@ -40,7 +40,7 @@ struct peer { struct wireaddr_internal addr; /* We keep a copy of their feature bits */ - const u8 *features; + const u8 *their_features; /* If we open a channel our direction will be this */ u8 direction; diff --git a/lightningd/plugin.c b/lightningd/plugin.c index a40f878fd..52e82ce0c 100644 --- a/lightningd/plugin.c +++ b/lightningd/plugin.c @@ -916,7 +916,7 @@ bool plugin_parse_getmanifest_response(const char *buffer, return true; } - if (!feature_set_or(plugin->plugins->ld->feature_set, fset)) { + if (!feature_set_or(plugin->plugins->ld->our_features, fset)) { plugin_kill(plugin, "Custom featurebits already present"); return true; @@ -1174,7 +1174,7 @@ plugin_populate_init_request(struct plugin *plugin, struct jsonrpc_request *req) if (plugin_feature_place_names[fp]) { json_add_hex_talarr(req->stream, plugin_feature_place_names[fp], - ld->feature_set->bits[fp]); + ld->our_features->bits[fp]); } } json_object_end(req->stream); diff --git a/openingd/opening_wire.csv b/openingd/opening_wire.csv index 8c5254cd5..ef1adb13f 100644 --- a/openingd/opening_wire.csv +++ b/openingd/opening_wire.csv @@ -7,7 +7,7 @@ msgtype,opening_init,6000 # Which network are we configured for? msgdata,opening_init,chainparams,chainparams, -msgdata,opening_init,feature_set,feature_set, +msgdata,opening_init,our_features,feature_set, # Base configuration we'll offer (channel reserve will vary with amount) msgdata,opening_init,our_config,channel_config, # Minimum/maximum configuration values we'll accept diff --git a/openingd/openingd.c b/openingd/openingd.c index aed7ce18c..46e33f315 100644 --- a/openingd/openingd.c +++ b/openingd/openingd.c @@ -67,7 +67,7 @@ struct state { struct per_peer_state *pps; /* Features they offered */ - u8 *features; + u8 *their_features; /* Constraints on a channel they open. */ u32 minimum_depth; @@ -114,7 +114,7 @@ struct state { bool option_static_remotekey; - struct feature_set *fset; + struct feature_set *our_features; }; static u8 *dev_upfront_shutdown_script(const tal_t *ctx) @@ -492,7 +492,8 @@ static bool setup_channel_funder(struct state *state) * - otherwise: * - MUST set `funding_satoshis` to less than 2^24 satoshi. */ - if (!feature_negotiated(state->fset, state->features, OPT_LARGE_CHANNELS) + if (!feature_negotiated(state->our_features, + state->their_features, OPT_LARGE_CHANNELS) && amount_sat_greater(state->funding, chainparams->max_funding)) { status_failed(STATUS_FAIL_MASTER_IO, "funding_satoshis must be < %s, not %s", @@ -569,7 +570,7 @@ static u8 *funder_channel_start(struct state *state, u8 channel_flags) * `payment_basepoint`, or `delayed_payment_basepoint` are not * valid secp256k1 pubkeys in compressed format. */ - if (feature_negotiated(state->fset, state->features, + if (feature_negotiated(state->our_features, state->their_features, OPT_UPFRONT_SHUTDOWN_SCRIPT)) { if (!fromwire_accept_channel_option_upfront_shutdown_script(state, msg, &id_in, @@ -650,8 +651,8 @@ static u8 *funder_channel_start(struct state *state, u8 channel_flags) return towire_opening_funder_start_reply(state, funding_output_script, feature_negotiated( - state->fset, - state->features, + state->our_features, + state->their_features, OPT_UPFRONT_SHUTDOWN_SCRIPT)); } @@ -911,7 +912,7 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg) * `payment_basepoint`, or `delayed_payment_basepoint` are not valid * secp256k1 pubkeys in compressed format. */ - if (feature_negotiated(state->fset, state->features, + if (feature_negotiated(state->our_features, state->their_features, OPT_UPFRONT_SHUTDOWN_SCRIPT)) { if (!fromwire_open_channel_option_upfront_shutdown_script(state, open_channel_msg, &chain_hash, @@ -980,7 +981,8 @@ static u8 *fundee_channel(struct state *state, const u8 *open_channel_msg) * - `funding_satoshis` is greater than or equal to 2^24 and the receiver does not support * `option_support_large_channel`. */ /* We choose to require *negotiation*, not just support! */ - if (!feature_negotiated(state->fset, state->features, OPT_LARGE_CHANNELS) + if (!feature_negotiated(state->our_features, state->their_features, + OPT_LARGE_CHANNELS) && amount_sat_greater(state->funding, chainparams->max_funding)) { negotiation_failed(state, false, "funding_satoshis %s too large", @@ -1503,7 +1505,7 @@ int main(int argc, char *argv[]) msg = wire_sync_read(tmpctx, REQ_FD); if (!fromwire_opening_init(state, msg, &chainparams, - &state->fset, + &state->our_features, &state->localconf, &state->max_to_self_delay, &state->min_effective_htlc_capacity, @@ -1512,7 +1514,7 @@ int main(int argc, char *argv[]) &state->our_funding_pubkey, &state->minimum_depth, &state->min_feerate, &state->max_feerate, - &state->features, + &state->their_features, &state->option_static_remotekey, &inner, &force_tmp_channel_id, diff --git a/plugins/fundchannel.c b/plugins/fundchannel.c index 594cb0f00..10b9206cc 100644 --- a/plugins/fundchannel.c +++ b/plugins/fundchannel.c @@ -27,7 +27,7 @@ struct funding_req { struct amount_msat *push_msat; /* Features offered by this peer. */ - const u8 *features; + const u8 *their_features; bool *announce_channel; u32 *minconf; @@ -335,7 +335,7 @@ static struct command_result *post_dryrun(struct command *cmd, /* Update funding to actual amount */ if (fr->funding_all && !feature_negotiated(plugin_feature_set(cmd->plugin), - fr->features, OPT_LARGE_CHANNELS) + fr->their_features, OPT_LARGE_CHANNELS) && amount_sat_greater(funding, chainparams->max_funding)) funding = chainparams->max_funding; @@ -355,8 +355,8 @@ static struct command_result *exec_dryrun(struct command *cmd, t = json_get_member(buf, result, "features"); if (!t) plugin_err(cmd->plugin, "No features found in connect response?"); - fr->features = json_tok_bin_from_hex(fr, buf, t); - if (!fr->features) + fr->their_features = json_tok_bin_from_hex(fr, buf, t); + if (!fr->their_features) plugin_err(cmd->plugin, "Bad features '%.*s' in connect response?", t->end - t->start, buf + t->start); diff --git a/plugins/libplugin.c b/plugins/libplugin.c index 201768195..02cb0dd12 100644 --- a/plugins/libplugin.c +++ b/plugins/libplugin.c @@ -85,7 +85,7 @@ struct plugin { size_t in_timer; /* Feature set for lightningd */ - struct feature_set *fset; + struct feature_set *our_features; }; @@ -154,7 +154,7 @@ jsonrpc_request_start_(struct plugin *plugin, struct command *cmd, const struct feature_set *plugin_feature_set(const struct plugin *p) { - return p->fset; + return p->our_features; } static void jsonrpc_finish_and_send(struct plugin *p, struct json_stream *js) @@ -770,7 +770,7 @@ static struct command_result *handle_init(struct command *cmd, chainparams = chainparams_for_network(network); fsettok = json_delve(buf, configtok, ".feature_set"); - p->fset = json_to_feature_set(p, buf, fsettok); + p->our_features = json_to_feature_set(p, buf, fsettok); rpctok = json_delve(buf, configtok, ".rpc-file"); p->rpc_conn->fd = socket(AF_UNIX, SOCK_STREAM, 0);