mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 06:41:44 +01:00
tlv: use var_int
s for size of messages
TLV's use var_int's for messages sizes, both internally and in the top level (you should really stack a var_int inside a var_int!!) this updates our automagick generator code to understand 'var_ints'
This commit is contained in:
parent
74ae9f09ac
commit
bad0ac6ed6
1 changed files with 27 additions and 14 deletions
|
@ -28,7 +28,8 @@ type2size = {
|
||||||
'u32': 4,
|
'u32': 4,
|
||||||
'u16': 2,
|
'u16': 2,
|
||||||
'u8': 1,
|
'u8': 1,
|
||||||
'bool': 1
|
'bool': 1,
|
||||||
|
'var_int': 8,
|
||||||
}
|
}
|
||||||
|
|
||||||
# These struct array helpers require a context to allocate from.
|
# These struct array helpers require a context to allocate from.
|
||||||
|
@ -46,8 +47,11 @@ class FieldType(object):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
|
def is_var_int(self):
|
||||||
|
return self.name == 'var_int'
|
||||||
|
|
||||||
def is_assignable(self):
|
def is_assignable(self):
|
||||||
return self.name in ['u8', 'u16', 'u32', 'u64', 'bool', 'struct amount_msat', 'struct amount_sat'] or self.name.startswith('enum ')
|
return self.name in ['u8', 'u16', 'u32', 'u64', 'bool', 'struct amount_msat', 'struct amount_sat', 'var_int'] or self.name.startswith('enum ')
|
||||||
|
|
||||||
# We only accelerate the u8 case: it's common and trivial.
|
# We only accelerate the u8 case: it's common and trivial.
|
||||||
def has_array_helper(self):
|
def has_array_helper(self):
|
||||||
|
@ -59,6 +63,8 @@ class FieldType(object):
|
||||||
basetype = basetype[7:]
|
basetype = basetype[7:]
|
||||||
elif basetype.startswith('enum '):
|
elif basetype.startswith('enum '):
|
||||||
basetype = basetype[5:]
|
basetype = basetype[5:]
|
||||||
|
elif self.name == 'var_int':
|
||||||
|
return 'u64'
|
||||||
return basetype
|
return basetype
|
||||||
|
|
||||||
# Returns base size
|
# Returns base size
|
||||||
|
@ -160,8 +166,12 @@ class Field(object):
|
||||||
|
|
||||||
# Bolts use just a number: Guess type based on size.
|
# Bolts use just a number: Guess type based on size.
|
||||||
if options.bolt:
|
if options.bolt:
|
||||||
base_size = int(size)
|
if size == 'var_int':
|
||||||
self.fieldtype = Field._guess_type(message, self.name, base_size)
|
base_size = 8
|
||||||
|
self.fieldtype = FieldType(size)
|
||||||
|
else:
|
||||||
|
base_size = int(size)
|
||||||
|
self.fieldtype = Field._guess_type(message, self.name, base_size)
|
||||||
# There are some arrays which we have to guess, based on sizes.
|
# There are some arrays which we have to guess, based on sizes.
|
||||||
tsize = FieldType._typesize(self.fieldtype.name)
|
tsize = FieldType._typesize(self.fieldtype.name)
|
||||||
if base_size % tsize != 0:
|
if base_size % tsize != 0:
|
||||||
|
@ -352,8 +362,8 @@ class Message(object):
|
||||||
return
|
return
|
||||||
for f in self.fields:
|
for f in self.fields:
|
||||||
if f.name == field.lenvar:
|
if f.name == field.lenvar:
|
||||||
if f.fieldtype.name != 'u16' and options.bolt:
|
if not (f.fieldtype.name == 'u16' or f.fieldtype.name == 'var_int') and options.bolt:
|
||||||
raise ValueError('Field {} has non-u16 length variable {} (type {})'
|
raise ValueError('Field {} has non-u16 and non-var_int length variable {} (type {})'
|
||||||
.format(field.name, field.lenvar, f.fieldtype.name))
|
.format(field.name, field.lenvar, f.fieldtype.name))
|
||||||
|
|
||||||
if f.is_array() or f.needs_ptr_to_ptr():
|
if f.is_array() or f.needs_ptr_to_ptr():
|
||||||
|
@ -399,7 +409,7 @@ class Message(object):
|
||||||
to populate, instead of fields, as well as a length to read in
|
to populate, instead of fields, as well as a length to read in
|
||||||
"""
|
"""
|
||||||
ctx_arg = 'const tal_t *ctx, ' if self.has_variable_fields else ''
|
ctx_arg = 'const tal_t *ctx, ' if self.has_variable_fields else ''
|
||||||
args = 'const u8 **cursor, size_t *plen, const u16 len, struct tlv_msg_{name} *{name}'.format(name=self.name)
|
args = 'const u8 **cursor, size_t *plen, const u64 len, struct tlv_msg_{name} *{name}'.format(name=self.name)
|
||||||
fields = ['\t{} {};\n'.format(f.fieldtype.name, f.name) for f in self.fields if f.is_len_var]
|
fields = ['\t{} {};\n'.format(f.fieldtype.name, f.name) for f in self.fields if f.is_len_var]
|
||||||
subcalls = CCode()
|
subcalls = CCode()
|
||||||
for f in self.fields:
|
for f in self.fields:
|
||||||
|
@ -482,11 +492,13 @@ class Message(object):
|
||||||
args.append(', {} {}{}'.format(f.fieldtype.name, ptrs, f.name))
|
args.append(', {} {}{}'.format(f.fieldtype.name, ptrs, f.name))
|
||||||
|
|
||||||
template = fromwire_header_templ if is_header else fromwire_impl_templ
|
template = fromwire_header_templ if is_header else fromwire_impl_templ
|
||||||
fields = ['\t{} {};\n'.format(f.fieldtype.name, f.name) for f in self.fields if f.is_len_var]
|
fields = ['\t{} {};\n'.format(f.fieldtype.base(), f.name) for f in self.fields if f.is_len_var]
|
||||||
|
|
||||||
subcalls = CCode()
|
subcalls = CCode()
|
||||||
for f in self.fields:
|
for f in self.fields:
|
||||||
basetype = f.fieldtype.base()
|
basetype = f.fieldtype.base()
|
||||||
|
if f.fieldtype.is_var_int():
|
||||||
|
basetype = 'var_int'
|
||||||
|
|
||||||
for c in f.comments:
|
for c in f.comments:
|
||||||
subcalls.append('/*{} */'.format(c))
|
subcalls.append('/*{} */'.format(c))
|
||||||
|
@ -636,7 +648,7 @@ class Message(object):
|
||||||
if f.is_len_var:
|
if f.is_len_var:
|
||||||
if f.lenvar_for.is_tlv:
|
if f.lenvar_for.is_tlv:
|
||||||
# used below...
|
# used below...
|
||||||
field_decls.append('\t{0} {1};'.format(f.fieldtype.name, f.name))
|
field_decls.append('\t{0} {1};'.format(f.fieldtype.base(), f.name))
|
||||||
else:
|
else:
|
||||||
field_decls.append('\t{0} {1} = tal_count({2});'.format(
|
field_decls.append('\t{0} {1} = tal_count({2});'.format(
|
||||||
f.fieldtype.name, f.name, f.lenvar_for.name
|
f.fieldtype.name, f.name, f.lenvar_for.name
|
||||||
|
@ -833,20 +845,21 @@ tlv__type_impl_towire_fields = """\tif ({tlv_name}->{name}) {{
|
||||||
\t\ttowire_u8(p, {enum});
|
\t\ttowire_u8(p, {enum});
|
||||||
\t\ttowire_{tlv_name}_{name}(&tlv_msg, {tlv_name}->{name});
|
\t\ttowire_{tlv_name}_{name}(&tlv_msg, {tlv_name}->{name});
|
||||||
\t\tmsg_len = tal_count(tlv_msg);
|
\t\tmsg_len = tal_count(tlv_msg);
|
||||||
\t\ttowire_u8(p, msg_len);
|
\t\ttowire_var_int(p, msg_len);
|
||||||
\t\ttowire_u8_array(p, tlv_msg, msg_len);
|
\t\ttowire_u8_array(p, tlv_msg, msg_len);
|
||||||
\t\ttal_free(tlv_msg);
|
\t\ttal_free(tlv_msg);
|
||||||
\t}}
|
\t}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
tlv__type_impl_towire_template = """static void towire__{tlv_name}(const tal_t *ctx, u8 **p, const struct {tlv_name} *{tlv_name}) {{
|
tlv__type_impl_towire_template = """static void towire__{tlv_name}(const tal_t *ctx, u8 **p, const struct {tlv_name} *{tlv_name}) {{
|
||||||
\tu8 msg_len;
|
\tu64 msg_len;
|
||||||
\tu8 *tlv_msg;
|
\tu8 *tlv_msg;
|
||||||
{fields}}}
|
{fields}}}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
tlv__type_impl_fromwire_template = """static struct {tlv_name} *fromwire__{tlv_name}(const tal_t *ctx, const u8 **p, size_t *plen, const u16 *len) {{
|
tlv__type_impl_fromwire_template = """static struct {tlv_name} *fromwire__{tlv_name}(const tal_t *ctx, const u8 **p, size_t *plen, const u64 *len) {{
|
||||||
\tu8 msg_type, msg_len;
|
\tu8 msg_type;
|
||||||
|
\tu64 msg_len;
|
||||||
\tsize_t start_len = *plen;
|
\tsize_t start_len = *plen;
|
||||||
\tif (*plen < *len)
|
\tif (*plen < *len)
|
||||||
\t\treturn NULL;
|
\t\treturn NULL;
|
||||||
|
@ -855,7 +868,7 @@ tlv__type_impl_fromwire_template = """static struct {tlv_name} *fromwire__{tlv_n
|
||||||
|
|
||||||
\twhile (*plen) {{
|
\twhile (*plen) {{
|
||||||
\t\tmsg_type = fromwire_u8(p, plen);
|
\t\tmsg_type = fromwire_u8(p, plen);
|
||||||
\t\tmsg_len = fromwire_u8(p, plen);
|
\t\tmsg_len = fromwire_var_int(p, plen);
|
||||||
\t\tif (*plen < msg_len) {{
|
\t\tif (*plen < msg_len) {{
|
||||||
\t\t\tfromwire_fail(p, plen);
|
\t\t\tfromwire_fail(p, plen);
|
||||||
\t\t\tbreak;
|
\t\t\tbreak;
|
||||||
|
|
Loading…
Add table
Reference in a new issue