Browse Source

routing: Added channel_id and directions to connections

The gossip protocol spec refers to channels by their `channel_id` and
a direction. Furthermore, inbetween the `channel_announcement` and the
`channel_update` for either direction, the channel direction is in an
undefined state and cannot be used, so added the `half_add_connection`
function and an `active` flag to differentiate usable connections from
unusable ones.
ppa-0.6.1
Christian Decker 8 years ago
committed by Rusty Russell
parent
commit
57d5ae96a4
  1. 72
      daemon/routing.c
  2. 43
      daemon/routing.h
  3. 1
      daemon/secrets.h

72
daemon/routing.c

@ -66,6 +66,7 @@ struct node *new_node(struct lightningd_state *dstate,
n->out = tal_arr(n, struct node_connection *, 0); n->out = tal_arr(n, struct node_connection *, 0);
n->port = 0; n->port = 0;
n->alias = NULL; n->alias = NULL;
n->hostname = NULL;
node_map_add(dstate->nodes, n); node_map_add(dstate->nodes, n);
tal_add_destructor(n, destroy_node); tal_add_destructor(n, destroy_node);
@ -116,6 +117,48 @@ static void destroy_connection(struct node_connection *nc)
fatal("Connection not found in array?!"); fatal("Connection not found in array?!");
} }
struct node_connection * get_connection(struct lightningd_state *dstate,
const struct pubkey *from_id,
const struct pubkey *to_id)
{
int i, n;
struct node *from, *to;
from = get_node(dstate, from_id);
to = get_node(dstate, to_id);
if (!from || ! to)
return NULL;
n = tal_count(to->in);
for (i = 0; i < n; i++) {
if (to->in[i]->src == from)
return to->in[i];
}
return NULL;
}
struct node_connection *get_connection_by_cid(const struct lightningd_state *dstate,
const struct channel_id *chanid,
const u8 direction)
{
struct node *n;
int i, num_conn;
struct node_map *nodes = dstate->nodes;
struct node_connection *c;
struct node_map_iter it;
//FIXME(cdecker) We probably want to speed this up by indexing by chanid.
for (n = node_map_first(nodes, &it); n; n = node_map_next(nodes, &it)) {
num_conn = tal_count(n->out);
for (i = 0; i < num_conn; i++){
c = n->out[i];
if (memcmp(&c->channel_id, chanid, sizeof(*chanid)) == 0 &&
(c->flags&0x1) == direction)
return c;
}
}
return NULL;
}
static struct node_connection * static struct node_connection *
get_or_make_connection(struct lightningd_state *dstate, get_or_make_connection(struct lightningd_state *dstate,
const struct pubkey *from_id, const struct pubkey *from_id,
@ -151,6 +194,7 @@ get_or_make_connection(struct lightningd_state *dstate,
nc = tal(dstate, struct node_connection); nc = tal(dstate, struct node_connection);
nc->src = from; nc->src = from;
nc->dst = to; nc->dst = to;
memset(&nc->channel_id, 0, sizeof(nc->channel_id));
log_add(dstate->base_log, " = %p (%p->%p)", nc, from, to); log_add(dstate->base_log, " = %p (%p->%p)", nc, from, to);
/* Hook it into in/out arrays. */ /* Hook it into in/out arrays. */
@ -165,6 +209,28 @@ get_or_make_connection(struct lightningd_state *dstate,
return nc; return nc;
} }
struct node_connection *half_add_connection(struct lightningd_state *dstate,
const struct pubkey *from,
const struct pubkey *to,
const struct channel_id *chanid,
const u16 flags
)
{
struct node_connection *nc;
nc = get_or_make_connection(dstate, from, to);
memcpy(&nc->channel_id, chanid, sizeof(nc->channel_id));
nc->active = false;
nc->last_timestamp = 0;
nc->flags = flags;
nc->min_blocks = 0;
nc->proportional_fee = 0;
nc->base_fee = 0;
nc->delay = 0;
return nc;
}
/* Updates existing route if required. */ /* Updates existing route if required. */
struct node_connection *add_connection(struct lightningd_state *dstate, struct node_connection *add_connection(struct lightningd_state *dstate,
const struct pubkey *from, const struct pubkey *from,
@ -177,6 +243,10 @@ struct node_connection *add_connection(struct lightningd_state *dstate,
c->proportional_fee = proportional_fee; c->proportional_fee = proportional_fee;
c->delay = delay; c->delay = delay;
c->min_blocks = min_blocks; c->min_blocks = min_blocks;
c->active = true;
c->last_timestamp = 0;
memset(&c->channel_id, 0, sizeof(c->channel_id));
c->flags = pubkey_cmp(from, to) > 0;
return c; return c;
} }
@ -507,6 +577,8 @@ static void json_getchannels(struct command *cmd,
json_add_pubkey(response, "to", &c->dst->id); json_add_pubkey(response, "to", &c->dst->id);
json_add_num(response, "base_fee", c->base_fee); json_add_num(response, "base_fee", c->base_fee);
json_add_num(response, "proportional_fee", c->proportional_fee); json_add_num(response, "proportional_fee", c->proportional_fee);
json_add_num(response, "expiry", c->delay);
json_add_bool(response, "active", c->active);
json_object_end(response); json_object_end(response);
} }
} }

43
daemon/routing.h

@ -2,6 +2,7 @@
#define LIGHTNING_DAEMON_ROUTING_H #define LIGHTNING_DAEMON_ROUTING_H
#include "config.h" #include "config.h"
#include "bitcoin/pubkey.h" #include "bitcoin/pubkey.h"
#include "wire/wire.h"
#define ROUTING_MAX_HOPS 20 #define ROUTING_MAX_HOPS 20
@ -16,6 +17,21 @@ struct node_connection {
u32 delay; u32 delay;
/* Minimum allowable HTLC expiry in blocks. */ /* Minimum allowable HTLC expiry in blocks. */
u32 min_blocks; u32 min_blocks;
/* Is this connection active? */
bool active;
u32 last_timestamp;
/* Minimum number of msatoshi in an HTLC */
u32 htlc_minimum_msat;
/* The channel ID, as determined by the anchor transaction */
struct channel_id channel_id;
/* Flags as specified by the `channel_update`s, among other
* things indicated direction wrt the `channel_id` */
u16 flags;
}; };
struct node { struct node {
@ -25,6 +41,8 @@ struct node {
char *hostname; char *hostname;
int port; int port;
u32 last_timestamp;
/* Routes connecting to us, from us. */ /* Routes connecting to us, from us. */
struct node_connection **in, **out; struct node_connection **in, **out;
@ -40,6 +58,9 @@ struct node {
/* UTF-8 encoded alias as tal_arr, not zero terminated */ /* UTF-8 encoded alias as tal_arr, not zero terminated */
u8 *alias; u8 *alias;
/* Color to be used when displaying the name */
u8 rgb_color[3];
}; };
struct lightningd_state; struct lightningd_state;
@ -67,6 +88,28 @@ struct node_connection *add_connection(struct lightningd_state *dstate,
u32 base_fee, s32 proportional_fee, u32 base_fee, s32 proportional_fee,
u32 delay, u32 min_blocks); u32 delay, u32 min_blocks);
/* Add a connection to the routing table, but do not mark it as usable
* yet. Used by channel_announcements before the channel_update comes
* in. */
struct node_connection *half_add_connection(struct lightningd_state *dstate,
const struct pubkey *from,
const struct pubkey *to,
const struct channel_id *chanid,
const u16 flags);
/* Get an existing connection between `from` and `to`, NULL if no such
* connection exists. */
struct node_connection *get_connection(struct lightningd_state *dstate,
const struct pubkey *from,
const struct pubkey *to);
/* Given a channel_id, retrieve the matching connection, or NULL if it is
* unknown. */
struct node_connection *get_connection_by_cid(const struct lightningd_state *dstate,
const struct channel_id *chanid,
const u8 direction);
void remove_connection(struct lightningd_state *dstate, void remove_connection(struct lightningd_state *dstate,
const struct pubkey *src, const struct pubkey *dst); const struct pubkey *src, const struct pubkey *dst);

1
daemon/secrets.h

@ -3,6 +3,7 @@
/* Routines to handle private keys. */ /* Routines to handle private keys. */
#include "config.h" #include "config.h"
#include <ccan/short_types/short_types.h> #include <ccan/short_types/short_types.h>
#include <ccan/tal/tal.h>
struct peer; struct peer;
struct lightningd_state; struct lightningd_state;

Loading…
Cancel
Save