core-lightning/lightningd/htlc_end.h
Rusty Russell 1ca97a7913 channeld: don't unpack union, leave that to master.
We still get the shared secret, since that requires a round trip to the HSM
(why waste the master daemon's time?) but it does the processing, which
simplifies the message passing and things like realm handling which
have nothing to do with this particular channeld.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2017-06-23 09:29:42 +09:30

67 lines
1.8 KiB
C

#ifndef LIGHTNING_LIGHTNINGD_HTLC_END_H
#define LIGHTNING_LIGHTNINGD_HTLC_END_H
#include "config.h"
#include <ccan/htable/htable_type.h>
#include <ccan/short_types/short_types.h>
#include <lightningd/sphinx.h>
/* A HTLC has a source and destination: if other is NULL, it's this node.
*
* The main daemon simply shuffles them back and forth.
*/
enum htlc_end_type { HTLC_SRC, HTLC_DST };
struct htlc_end {
enum htlc_end_type which_end;
struct peer *peer;
u64 htlc_id;
u64 msatoshis;
struct htlc_end *other_end;
/* If this is driven by a command. */
struct pay_command *pay_command;
/* Temporary information, while we resolve the next hop */
u8 *next_onion;
struct short_channel_id next_channel;
u64 amt_to_forward;
u32 outgoing_cltv_value;
u32 cltv_expiry;
struct sha256 payment_hash;
/* If we failed HTLC, here's the message. */
const u8 *fail_msg;
/* If we are forwarding, remember the shared secret for an
* eventual reply */
struct secret *shared_secret;
/* If we are the origin, remember all shared secrets, so we
* can unwrap an eventual reply */
struct secret *path_secrets;
};
static inline const struct htlc_end *keyof_htlc_end(const struct htlc_end *e)
{
return e;
}
size_t hash_htlc_end(const struct htlc_end *e);
static inline bool htlc_end_eq(const struct htlc_end *a,
const struct htlc_end *b)
{
return a->peer == b->peer
&& a->htlc_id == b->htlc_id
&& a->which_end == b->which_end;
}
HTABLE_DEFINE_TYPE(struct htlc_end, keyof_htlc_end, hash_htlc_end, htlc_end_eq,
htlc_end_map);
struct htlc_end *find_htlc_end(const struct htlc_end_map *map,
const struct peer *peer,
u64 htlc_id,
enum htlc_end_type which_end);
void connect_htlc_end(struct htlc_end_map *map, struct htlc_end *hend);
#endif /* LIGHTNING_LIGHTNINGD_HTLC_END_H */