gossipd: Add handling of channel_update to routing failures.
This commit is contained in:
parent
299b280f78
commit
67e2275383
|
@ -1890,17 +1890,21 @@ static struct io_plan *handle_routing_failure(struct io_conn *conn,
|
||||||
struct pubkey erring_node;
|
struct pubkey erring_node;
|
||||||
struct short_channel_id erring_channel;
|
struct short_channel_id erring_channel;
|
||||||
u16 failcode;
|
u16 failcode;
|
||||||
|
u8 *channel_update;
|
||||||
|
|
||||||
if (!fromwire_gossip_routing_failure(msg, NULL,
|
if (!fromwire_gossip_routing_failure(msg,
|
||||||
|
msg, NULL,
|
||||||
&erring_node,
|
&erring_node,
|
||||||
&erring_channel,
|
&erring_channel,
|
||||||
&failcode))
|
&failcode,
|
||||||
|
&channel_update))
|
||||||
master_badmsg(WIRE_GOSSIP_ROUTING_FAILURE, msg);
|
master_badmsg(WIRE_GOSSIP_ROUTING_FAILURE, msg);
|
||||||
|
|
||||||
routing_failure(daemon->rstate,
|
routing_failure(daemon->rstate,
|
||||||
&erring_node,
|
&erring_node,
|
||||||
&erring_channel,
|
&erring_channel,
|
||||||
(enum onion_type) failcode);
|
(enum onion_type) failcode,
|
||||||
|
channel_update);
|
||||||
|
|
||||||
return daemon_conn_read_next(conn, &daemon->master);
|
return daemon_conn_read_next(conn, &daemon->master);
|
||||||
}
|
}
|
||||||
|
|
|
@ -202,3 +202,5 @@ gossip_routing_failure,3021
|
||||||
gossip_routing_failure,,erring_node,struct pubkey
|
gossip_routing_failure,,erring_node,struct pubkey
|
||||||
gossip_routing_failure,,erring_channel,struct short_channel_id
|
gossip_routing_failure,,erring_channel,struct short_channel_id
|
||||||
gossip_routing_failure,,failcode,u16
|
gossip_routing_failure,,failcode,u16
|
||||||
|
gossip_routing_failure,,len,u16
|
||||||
|
gossip_routing_failure,,channel_update,len*u8
|
||||||
|
|
|
|
@ -1054,12 +1054,14 @@ static void routing_failure_on_nc(struct routing_state *rstate,
|
||||||
void routing_failure(struct routing_state *rstate,
|
void routing_failure(struct routing_state *rstate,
|
||||||
const struct pubkey *erring_node_pubkey,
|
const struct pubkey *erring_node_pubkey,
|
||||||
const struct short_channel_id *scid,
|
const struct short_channel_id *scid,
|
||||||
enum onion_type failcode)
|
enum onion_type failcode,
|
||||||
|
const u8 *channel_update)
|
||||||
{
|
{
|
||||||
const tal_t *tmpctx = tal_tmpctx(rstate);
|
const tal_t *tmpctx = tal_tmpctx(rstate);
|
||||||
struct node *node;
|
struct node *node;
|
||||||
struct node_connection *nc;
|
struct node_connection *nc;
|
||||||
int i;
|
int i;
|
||||||
|
enum wire_type t;
|
||||||
|
|
||||||
status_trace("Received routing failure 0x%04x (%s), "
|
status_trace("Received routing failure 0x%04x (%s), "
|
||||||
"erring node %s, "
|
"erring node %s, "
|
||||||
|
@ -1106,7 +1108,35 @@ void routing_failure(struct routing_state *rstate,
|
||||||
erring_node_pubkey));
|
erring_node_pubkey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: if UPDATE is set, apply the channel update. */
|
/* Update the channel if UPDATE failcode. Do
|
||||||
|
* this after deactivating, so that if the
|
||||||
|
* channel_update is newer it will be
|
||||||
|
* reactivated. */
|
||||||
|
if (failcode & UPDATE) {
|
||||||
|
if (tal_len(channel_update) == 0) {
|
||||||
|
status_trace("UNUSUAL routing_failure: "
|
||||||
|
"UPDATE bit set, no channel_update. "
|
||||||
|
"failcode: 0x%04x",
|
||||||
|
(int) failcode);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
t = fromwire_peektype(channel_update);
|
||||||
|
if (t != WIRE_CHANNEL_UPDATE) {
|
||||||
|
status_trace("UNUSUAL routing_failure: "
|
||||||
|
"not a channel_update. "
|
||||||
|
"type: %d",
|
||||||
|
(int) t);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
handle_channel_update(rstate, channel_update);
|
||||||
|
} else {
|
||||||
|
if (tal_len(channel_update) != 0)
|
||||||
|
status_trace("UNUSUAL routing_failure: "
|
||||||
|
"UPDATE bit clear, channel_update given. "
|
||||||
|
"failcode: 0x%04x",
|
||||||
|
(int) failcode);
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
tal_free(tmpctx);
|
tal_free(tmpctx);
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,8 @@ struct route_hop *get_route(tal_t *ctx, struct routing_state *rstate,
|
||||||
void routing_failure(struct routing_state *rstate,
|
void routing_failure(struct routing_state *rstate,
|
||||||
const struct pubkey *erring_node,
|
const struct pubkey *erring_node,
|
||||||
const struct short_channel_id *erring_channel,
|
const struct short_channel_id *erring_channel,
|
||||||
enum onion_type failcode);
|
enum onion_type failcode,
|
||||||
|
const u8 *channel_update);
|
||||||
|
|
||||||
/* Utility function that, given a source and a destination, gives us
|
/* Utility function that, given a source and a destination, gives us
|
||||||
* the direction bit the matching channel should get */
|
* the direction bit the matching channel should get */
|
||||||
|
|
|
@ -57,6 +57,9 @@ bool fromwire_channel_update(const void *p UNNEEDED, size_t *plen UNNEEDED, secp
|
||||||
/* Generated stub for fromwire_node_announcement */
|
/* Generated stub for fromwire_node_announcement */
|
||||||
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
||||||
|
/* Generated stub for fromwire_peektype */
|
||||||
|
int fromwire_peektype(const u8 *cursor UNNEEDED)
|
||||||
|
{ fprintf(stderr, "fromwire_peektype called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_u8 */
|
/* Generated stub for fromwire_u8 */
|
||||||
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
||||||
|
|
|
@ -28,6 +28,9 @@ bool fromwire_channel_update(const void *p UNNEEDED, size_t *plen UNNEEDED, secp
|
||||||
/* Generated stub for fromwire_node_announcement */
|
/* Generated stub for fromwire_node_announcement */
|
||||||
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
||||||
|
/* Generated stub for fromwire_peektype */
|
||||||
|
int fromwire_peektype(const u8 *cursor UNNEEDED)
|
||||||
|
{ fprintf(stderr, "fromwire_peektype called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_u8 */
|
/* Generated stub for fromwire_u8 */
|
||||||
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
||||||
|
|
|
@ -21,6 +21,9 @@ bool fromwire_channel_update(const void *p UNNEEDED, size_t *plen UNNEEDED, secp
|
||||||
/* Generated stub for fromwire_node_announcement */
|
/* Generated stub for fromwire_node_announcement */
|
||||||
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
bool fromwire_node_announcement(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, size_t *plen UNNEEDED, secp256k1_ecdsa_signature *signature UNNEEDED, u8 **features UNNEEDED, u32 *timestamp UNNEEDED, struct pubkey *node_id UNNEEDED, u8 rgb_color[3] UNNEEDED, u8 alias[32] UNNEEDED, u8 **addresses UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_node_announcement called!\n"); abort(); }
|
||||||
|
/* Generated stub for fromwire_peektype */
|
||||||
|
int fromwire_peektype(const u8 *cursor UNNEEDED)
|
||||||
|
{ fprintf(stderr, "fromwire_peektype called!\n"); abort(); }
|
||||||
/* Generated stub for fromwire_u8 */
|
/* Generated stub for fromwire_u8 */
|
||||||
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
u8 fromwire_u8(const u8 **cursor UNNEEDED, size_t *max UNNEEDED)
|
||||||
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
{ fprintf(stderr, "fromwire_u8 called!\n"); abort(); }
|
||||||
|
|
Loading…
Reference in New Issue