committed by
Christian Decker
7 changed files with 86 additions and 69 deletions
@ -0,0 +1,62 @@ |
|||||
|
#include "features.h" |
||||
|
#include <wire/peer_wire.h> |
||||
|
|
||||
|
static const u8 supported_local_features[] |
||||
|
= {LOCALFEATURES_INITIAL_ROUTING_SYNC}; |
||||
|
static const u8 supported_global_features[] |
||||
|
= {}; |
||||
|
|
||||
|
u8 *get_supported_global_features(const tal_t *ctx) |
||||
|
{ |
||||
|
return tal_dup_arr(ctx, u8, supported_global_features, |
||||
|
sizeof(supported_global_features), 0); |
||||
|
} |
||||
|
|
||||
|
u8 *get_supported_local_features(const tal_t *ctx) |
||||
|
{ |
||||
|
return tal_dup_arr(ctx, u8, supported_local_features, |
||||
|
sizeof(supported_local_features), 0); |
||||
|
} |
||||
|
|
||||
|
/**
|
||||
|
* requires_unsupported_features - Check if we support what's being asked |
||||
|
* |
||||
|
* Given the features vector that the remote connection is expecting |
||||
|
* from us, we check to see if we support all even bit features, i.e., |
||||
|
* the required features. We do so by subtracting our own features in |
||||
|
* the provided positions and see if even bits remain. |
||||
|
* |
||||
|
* @bitmap: the features bitmap the peer is asking for |
||||
|
* @supportmap: what do we support |
||||
|
* @smlen: how long is our supportmap |
||||
|
*/ |
||||
|
static bool requires_unsupported_features(const u8 *bitmap, |
||||
|
const u8 *supportmap, |
||||
|
size_t smlen) |
||||
|
{ |
||||
|
size_t len = tal_count(bitmap); |
||||
|
u8 support; |
||||
|
for (size_t i=0; i<len; i++) { |
||||
|
/* Find matching bitmap byte in supportmap, 0x00 if none */ |
||||
|
if (len > smlen) { |
||||
|
support = 0x00; |
||||
|
} else { |
||||
|
support = supportmap[smlen-1]; |
||||
|
} |
||||
|
|
||||
|
/* Cancel out supported bits, check for even bits */ |
||||
|
if ((~support & bitmap[i]) & 0x55) |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
bool unsupported_features(const u8 *gfeatures, const u8 *lfeatures) |
||||
|
{ |
||||
|
return requires_unsupported_features(gfeatures, |
||||
|
supported_global_features, |
||||
|
sizeof(supported_global_features)) |
||||
|
|| requires_unsupported_features(lfeatures, |
||||
|
supported_local_features, |
||||
|
sizeof(supported_local_features)); |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
#ifndef LIGHTNING_COMMON_FEATURES_H |
||||
|
#define LIGHTNING_COMMON_FEATURES_H |
||||
|
#include "config.h" |
||||
|
#include <ccan/short_types/short_types.h> |
||||
|
#include <ccan/tal/tal.h> |
||||
|
|
||||
|
/* Returns true if these contain any unsupported features. */ |
||||
|
bool unsupported_features(const u8 *gfeatures, const u8 *lfeatures); |
||||
|
|
||||
|
/* For sending our features: tal_len() returns length. */ |
||||
|
u8 *get_supported_global_features(const tal_t *ctx); |
||||
|
u8 *get_supported_local_features(const tal_t *ctx); |
||||
|
|
||||
|
#endif /* LIGHTNING_COMMON_FEATURES_H */ |
Loading…
Reference in new issue