'i32' : 'i',
'u64' : 'Q',
'f64' : 'd',
+ 'vl_api_fib_path_t' : 'IIBBBBBBBBBBBBBBBBBBBBB',
'vl_api_ip4_fib_counter_t' : 'IBQQ',
'vl_api_ip6_fib_counter_t' : 'QQBQQ',
+ 'vl_api_lisp_adjacency_t' : 'B' * 35
};
#
# NB: If new types are introduced in vpe.api, these must be updated.
'i32' : 4,
'u64' : 8,
'f64' : 8,
+ 'vl_api_fib_path_t' : 29,
'vl_api_ip4_fib_counter_t' : 21,
'vl_api_ip6_fib_counter_t' : 33,
+ 'vl_api_lisp_adjacency_t' : 35
};
def eprint(*args, **kwargs):
bytecount = 0
pack = ''
elements = 1
- if len(f) is 3 or len(f) is 4: # TODO: add support for variable length arrays (VPP-162)
+ if len(f) is 3 or len(f) is 4:
size = type_size[f[0]]
bytecount += size * int(f[2])
# Check if we have a zero length array
print('api_name_to_id["' + msg_id_in + '"] =', i)
print('')
+
def encode_print(name, id, t):
- total = 0
args = get_args(t)
- pack = '>'
- for i, f in enumerate(t):
- p, elements, size = get_pack(f)
- pack += p
- total += size
if name.find('_dump') > 0:
multipart = True
if multipart == True:
print(u" results_more_set(context)")
- ### TODO deal with zeroarray!!!
- #if zeroarray == True:
- # print(u" vpp_api.write(pack('" + pack + "', " + id + ", 0, context, " + ', '.join(args[3:-1]) + ") + " + args[-1] + ")")
- #else:
- print(u" vpp_api.write(pack('" + pack + "', base + " + id + ", 0, context, " + ', '.join(args[3:]) + "))")
+ t = list(t)
+
+ # only the last field can be a variable-length-array
+ # it can either be 0, or a string
+ # first, deal with all the other fields
+ pack = '>' + ''.join([get_pack(f)[0] for f in t[:-1]])
+
+ # named variable-length-array
+ if len(t[-1]) == 4 and t[-1][2] == '0' and t[-1][3] == t[-2][1]:
+ print(u" vpp_api.write(pack('" + pack + "', base + "
+ + id + ", 0, context, " + ', '.join(args[3:-2] + ["len(" + args[-1] + ")"])
+ + ") + " + args[-1] + ")")
+
+ # unnamed variable-length-array
+ elif len(t[-1]) >= 3 and t[-1][2] == '0':
+ print(u" vpp_api.write(pack('" + pack + "', base + " +
+ id + ", 0, context, " + ', '.join(args[3:-1]) + ") + "
+ + args[-1] + ")")
+
+
+ # not a variable-length-array
+ else:
+ pack += get_pack(t[-1])[0]
+ print(u" vpp_api.write(pack('" + pack + "', base + " + id +
+ ", 0, context, " + ', '.join(args[3:]) + "))")
if multipart == True:
- print(u" vpp_api.write(pack('>HII', VL_API_CONTROL_PING, 0, context))")
+ print(
+ u" vpp_api.write(pack('>HII', VL_API_CONTROL_PING, 0, context))")
print('''
if not async:
api_name_to_id = {}
''')
- for i, a in enumerate(vppapidef):
+ for i, a in enumerate(messages):
name = a[0]
encode_print(name, str(i), a[1:])
decode_print(name, a[1:])