Browse Source

gossipd: gossip_get_update / gossip_get_update_reply from channeld.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
committed by Christian Decker
parent
commit
933c1794a1
  1. 49
      gossipd/gossip.c
  2. 11
      gossipd/gossip_wire.csv
  3. 2
      lightningd/gossip_control.c

49
gossipd/gossip.c

@ -599,6 +599,51 @@ static struct io_plan *peer_start_gossip(struct io_conn *conn, struct peer *peer
peer_pkt_out(conn, peer)); peer_pkt_out(conn, peer));
} }
static void handle_get_update(struct peer *peer, const u8 *msg)
{
struct short_channel_id schanid;
struct node *us;
size_t i;
const u8 *update;
if (!fromwire_gossip_get_update(msg, NULL, &schanid)) {
status_trace("peer %s sent bad gossip_get_update %s",
type_to_string(trc, struct pubkey, &peer->id),
tal_hex(trc, msg));
return;
}
/* We want update than comes from our end. */
us = node_map_get(peer->daemon->rstate->nodes, &peer->daemon->id.pubkey);
if (!us) {
status_trace("peer %s schanid %s but can't find ourselves",
type_to_string(trc, struct pubkey, &peer->id),
type_to_string(trc, struct short_channel_id,
&schanid));
update = NULL;
goto reply;
}
for (i = 0; i < tal_count(us->out); i++) {
if (!short_channel_id_eq(&us->out[i]->short_channel_id,
&schanid))
continue;
update = us->out[i]->channel_update;
status_trace("peer %s schanid %s: %s update",
type_to_string(trc, struct pubkey, &peer->id),
type_to_string(trc, struct short_channel_id,
&schanid),
update ? "got" : "no");
goto reply;
}
update = NULL;
reply:
msg = towire_gossip_get_update_reply(msg, update);
msg_enqueue(&peer->peer_out, take(msg));
}
/** /**
* owner_msg_in - Called by the `peer->owner_conn` upon receiving a * owner_msg_in - Called by the `peer->owner_conn` upon receiving a
* message * message
@ -613,6 +658,8 @@ static struct io_plan *owner_msg_in(struct io_conn *conn,
if (type == WIRE_CHANNEL_ANNOUNCEMENT || type == WIRE_CHANNEL_UPDATE || if (type == WIRE_CHANNEL_ANNOUNCEMENT || type == WIRE_CHANNEL_UPDATE ||
type == WIRE_NODE_ANNOUNCEMENT) { type == WIRE_NODE_ANNOUNCEMENT) {
handle_gossip_msg(peer->daemon->rstate, dc->msg_in); handle_gossip_msg(peer->daemon->rstate, dc->msg_in);
} else if (type == WIRE_GOSSIP_GET_UPDATE) {
handle_get_update(peer, dc->msg_in);
} }
return daemon_conn_read_next(conn, dc); return daemon_conn_read_next(conn, dc);
} }
@ -1380,6 +1427,8 @@ static struct io_plan *recv_req(struct io_conn *conn, struct daemon_conn *master
case WIRE_GOSSIP_RESOLVE_CHANNEL_REPLY: case WIRE_GOSSIP_RESOLVE_CHANNEL_REPLY:
case WIRE_GOSSIP_PEER_CONNECTED: case WIRE_GOSSIP_PEER_CONNECTED:
case WIRE_GOSSIP_PEER_NONGOSSIP: case WIRE_GOSSIP_PEER_NONGOSSIP:
case WIRE_GOSSIP_GET_UPDATE:
case WIRE_GOSSIP_GET_UPDATE_REPLY:
break; break;
} }

11
gossipd/gossip_wire.csv

@ -131,3 +131,14 @@ gossip_getpeers_reply,3111
gossip_getpeers_reply,,num,u16 gossip_getpeers_reply,,num,u16
gossip_getpeers_reply,,id,num*struct pubkey gossip_getpeers_reply,,id,num*struct pubkey
gossip_getpeers_reply,,addr,num*struct wireaddr gossip_getpeers_reply,,addr,num*struct wireaddr
# Channel daemon can ask for updates for a specific channel, for sending
# errors. Must be distinct from WIRE_CHANNEL_ANNOUNCEMENT etc. gossip msgs!
gossip_get_update,3012
gossip_get_update,,short_channel_id,struct short_channel_id
# If channel isn't known, update will be empty.
gossip_get_update_reply,3112
gossip_get_update_reply,,len,u16
gossip_get_update_reply,,update,len*u8

Can't render this file because it has a wrong number of fields in line 5.

2
lightningd/gossip_control.c

@ -68,7 +68,9 @@ static unsigned gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)
case WIRE_GOSSIPCTL_HANDLE_PEER: case WIRE_GOSSIPCTL_HANDLE_PEER:
case WIRE_GOSSIPCTL_RELEASE_PEER: case WIRE_GOSSIPCTL_RELEASE_PEER:
case WIRE_GOSSIPCTL_PEER_ADDRHINT: case WIRE_GOSSIPCTL_PEER_ADDRHINT:
case WIRE_GOSSIP_GET_UPDATE:
/* This is a reply, so never gets through to here. */ /* This is a reply, so never gets through to here. */
case WIRE_GOSSIP_GET_UPDATE_REPLY:
case WIRE_GOSSIP_GETNODES_REPLY: case WIRE_GOSSIP_GETNODES_REPLY:
case WIRE_GOSSIP_GETROUTE_REPLY: case WIRE_GOSSIP_GETROUTE_REPLY:
case WIRE_GOSSIP_GETCHANNELS_REPLY: case WIRE_GOSSIP_GETCHANNELS_REPLY:

Loading…
Cancel
Save