Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'tools-ynl-handful-of-forward-looking-updates'

Jakub Kicinski says:

====================
tools: ynl: handful of forward looking updates

Small YNL improvements, mostly for work-in-progress families.
====================

Link: https://lore.kernel.org/r/20230824003056.1436637-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+38 -13
+9 -9
Documentation/netlink/specs/fou.yaml
··· 107 107 flags: [ admin-perm ] 108 108 109 109 do: 110 - request: &select_attrs 110 + request: &select_attrs 111 111 attributes: 112 - - af 113 - - ifindex 114 - - port 115 - - peer_port 116 - - local_v4 117 - - peer_v4 118 - - local_v6 119 - - peer_v6 112 + - af 113 + - ifindex 114 + - port 115 + - peer_port 116 + - local_v4 117 + - peer_v4 118 + - local_v6 119 + - peer_v6 120 120 121 121 - 122 122 name: get
+4
tools/net/ynl/generated/ethtool-user.h
··· 1422 1422 const void *sopass, size_t len) 1423 1423 { 1424 1424 free(req->sopass); 1425 + req->_present.sopass_len = len; 1425 1426 req->sopass = malloc(req->_present.sopass_len); 1426 1427 memcpy(req->sopass, sopass, req->_present.sopass_len); 1427 1428 } ··· 4072 4071 const void *corrected, size_t len) 4073 4072 { 4074 4073 free(req->stats.corrected); 4074 + req->stats._present.corrected_len = len; 4075 4075 req->stats.corrected = malloc(req->stats._present.corrected_len); 4076 4076 memcpy(req->stats.corrected, corrected, req->stats._present.corrected_len); 4077 4077 } ··· 4081 4079 const void *uncorr, size_t len) 4082 4080 { 4083 4081 free(req->stats.uncorr); 4082 + req->stats._present.uncorr_len = len; 4084 4083 req->stats.uncorr = malloc(req->stats._present.uncorr_len); 4085 4084 memcpy(req->stats.uncorr, uncorr, req->stats._present.uncorr_len); 4086 4085 } ··· 4090 4087 const void *corr_bits, size_t len) 4091 4088 { 4092 4089 free(req->stats.corr_bits); 4090 + req->stats._present.corr_bits_len = len; 4093 4091 req->stats.corr_bits = malloc(req->stats._present.corr_bits_len); 4094 4092 memcpy(req->stats.corr_bits, corr_bits, req->stats._present.corr_bits_len); 4095 4093 }
+6
tools/net/ynl/generated/fou-user.h
··· 91 91 size_t len) 92 92 { 93 93 free(req->local_v6); 94 + req->_present.local_v6_len = len; 94 95 req->local_v6 = malloc(req->_present.local_v6_len); 95 96 memcpy(req->local_v6, local_v6, req->_present.local_v6_len); 96 97 } ··· 100 99 size_t len) 101 100 { 102 101 free(req->peer_v6); 102 + req->_present.peer_v6_len = len; 103 103 req->peer_v6 = malloc(req->_present.peer_v6_len); 104 104 memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); 105 105 } ··· 194 192 size_t len) 195 193 { 196 194 free(req->local_v6); 195 + req->_present.local_v6_len = len; 197 196 req->local_v6 = malloc(req->_present.local_v6_len); 198 197 memcpy(req->local_v6, local_v6, req->_present.local_v6_len); 199 198 } ··· 203 200 size_t len) 204 201 { 205 202 free(req->peer_v6); 203 + req->_present.peer_v6_len = len; 206 204 req->peer_v6 = malloc(req->_present.peer_v6_len); 207 205 memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); 208 206 } ··· 284 280 size_t len) 285 281 { 286 282 free(req->local_v6); 283 + req->_present.local_v6_len = len; 287 284 req->local_v6 = malloc(req->_present.local_v6_len); 288 285 memcpy(req->local_v6, local_v6, req->_present.local_v6_len); 289 286 } ··· 293 288 size_t len) 294 289 { 295 290 free(req->peer_v6); 291 + req->_present.peer_v6_len = len; 296 292 req->peer_v6 = malloc(req->_present.peer_v6_len); 297 293 memcpy(req->peer_v6, peer_v6, req->_present.peer_v6_len); 298 294 }
+6 -1
tools/net/ynl/lib/ynl.py
··· 410 410 elif attr["type"] == 'string': 411 411 attr_payload = str(value).encode('ascii') + b'\x00' 412 412 elif attr["type"] == 'binary': 413 - attr_payload = bytes.fromhex(value) 413 + if isinstance(value, bytes): 414 + attr_payload = value 415 + elif isinstance(value, str): 416 + attr_payload = bytes.fromhex(value) 417 + else: 418 + raise Exception(f'Unknown type for binary attribute, value: {value}') 414 419 elif attr['type'] in NlAttr.type_formats: 415 420 format = NlAttr.get_format(attr['type'], attr.byte_order) 416 421 attr_payload = format.pack(int(value))
+13 -3
tools/net/ynl/ynl-gen-c.py
··· 428 428 429 429 def _setter_lines(self, ri, member, presence): 430 430 return [f"free({member});", 431 + f"{presence}_len = len;", 431 432 f"{member} = malloc({presence}_len);", 432 433 f'memcpy({member}, {self.c_name}, {presence}_len);'] 433 434 ··· 615 614 616 615 self.attr_list = [] 617 616 self.attrs = dict() 618 - if type_list: 617 + if type_list is not None: 619 618 for t in type_list: 620 619 self.attr_list.append((t, self.attr_set[t]),) 621 620 else: ··· 978 977 979 978 for op_mode in ['do', 'dump']: 980 979 if op_mode in op: 981 - global_set.update(op[op_mode].get('request', [])) 980 + req = op[op_mode].get('request') 981 + if req: 982 + global_set.update(req.get('attributes', [])) 982 983 983 984 self.global_policy = [] 984 985 self.global_policy_set = attr_set_name ··· 1543 1540 1544 1541 ri.cw.write_func_prot('int', f'{op_prefix(ri, "reply", deref=deref)}_parse', func_args) 1545 1542 1546 - _multi_parse(ri, ri.struct["reply"], init_lines, local_vars) 1543 + if ri.struct["reply"].member_list(): 1544 + _multi_parse(ri, ri.struct["reply"], init_lines, local_vars) 1545 + else: 1546 + # Empty reply 1547 + ri.cw.block_start() 1548 + ri.cw.p('return MNL_CB_OK;') 1549 + ri.cw.block_end() 1550 + ri.cw.nl() 1547 1551 1548 1552 1549 1553 def print_req(ri):