* [PATCH 00/16] xdrgen: Emit maxsize macros
@ 2024-10-03 15:01 cel
2024-10-03 15:01 ` [PATCH 01/16] xdrgen: Refactor transformer arms cel
` (8 more replies)
0 siblings, 9 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
This series implements the generation of "maxsize" values for each
XDR data type defined in a specification. These are emitted as C
pre-processor macros, following the lead of existing XDR functions
in the kernel. The macros are added to the header file containing
C type definitions.
This facility takes xdrgen a step closer to the generation of all
XDR code needed for each RPC protocol implementation in the kernel.
Chuck Lever (16):
xdrgen: Refactor transformer arms
xdrgen: Track constant values
xdrgen: Keep track of on-the-wire data type widths
xdrgen: XDR widths for enum types
xdrgen: XDR width for fixed-length opaque
xdrgen: XDR width for variable-length opaque
xdrgen: XDR width for a string
xdrgen: XDR width for fixed-length array
xdrgen: XDR width for variable-length array
xdrgen: XDR width for optional_data type
xdrgen: XDR width for typedef
xdrgen: XDR width for struct types
xdrgen: XDR width for pointer types
xdrgen: XDR width for union types
xdrgen: Add generator code for XDR width macros
xdrgen: emit maxsize macros
include/linux/sunrpc/xdrgen/_defs.h | 9 +
.../net/sunrpc/xdrgen/generators/__init__.py | 4 +
tools/net/sunrpc/xdrgen/generators/enum.py | 13 +-
tools/net/sunrpc/xdrgen/generators/pointer.py | 18 +-
tools/net/sunrpc/xdrgen/generators/struct.py | 18 +-
tools/net/sunrpc/xdrgen/generators/typedef.py | 18 +-
tools/net/sunrpc/xdrgen/generators/union.py | 20 +-
.../net/sunrpc/xdrgen/subcmds/definitions.py | 24 +-
tools/net/sunrpc/xdrgen/subcmds/source.py | 3 +-
.../xdrgen/templates/C/enum/maxsize/enum.j2 | 2 +
.../templates/C/pointer/maxsize/pointer.j2 | 3 +
.../templates/C/struct/maxsize/struct.j2 | 3 +
.../templates/C/typedef/maxsize/basic.j2 | 3 +
.../C/typedef/maxsize/fixed_length_opaque.j2 | 2 +
.../templates/C/typedef/maxsize/string.j2 | 2 +
.../typedef/maxsize/variable_length_array.j2 | 2 +
.../typedef/maxsize/variable_length_opaque.j2 | 2 +
.../xdrgen/templates/C/union/maxsize/union.j2 | 3 +
tools/net/sunrpc/xdrgen/xdr_ast.py | 292 ++++++++++++++++--
19 files changed, 406 insertions(+), 35 deletions(-)
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/enum/maxsize/enum.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/pointer/maxsize/pointer.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/struct/maxsize/struct.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/basic.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/fixed_length_opaque.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/string.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/variable_length_array.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/typedef/maxsize/variable_length_opaque.j2
create mode 100644 tools/net/sunrpc/xdrgen/templates/C/union/maxsize/union.j2
--
2.46.2
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 01/16] xdrgen: Refactor transformer arms
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 02/16] xdrgen: Track constant values cel
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
Clean up: Add a __post_init__ function to the data classes that
need to update the "structs" and "pass_by_reference" sets.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 57 +++++++++++++++++-------------
1 file changed, 33 insertions(+), 24 deletions(-)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index d5f0535ec84c..68f09945f2c4 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -51,13 +51,17 @@ class _XdrTypeSpecifier(_XdrAst):
"""Corresponds to 'type_specifier' in the XDR language grammar"""
type_name: str
- c_classifier: str
+ c_classifier: str = ""
@dataclass
class _XdrDefinedType(_XdrTypeSpecifier):
"""Corresponds to a type defined by the input specification"""
+ def __post_init__(self):
+ if self.type_name in structs:
+ self.c_classifier = "struct "
+
@dataclass
class _XdrBuiltInType(_XdrTypeSpecifier):
@@ -124,6 +128,10 @@ class _XdrOptionalData(_XdrDeclaration):
spec: _XdrTypeSpecifier
template: str = "optional_data"
+ def __post_init__(self):
+ structs.add(self.name)
+ pass_by_reference.add(self.name)
+
@dataclass
class _XdrBasic(_XdrDeclaration):
@@ -174,6 +182,10 @@ class _XdrStruct(_XdrAst):
name: str
fields: List[_XdrDeclaration]
+ def __post_init__(self):
+ structs.add(self.name)
+ pass_by_reference.add(self.name)
+
@dataclass
class _XdrPointer(_XdrAst):
@@ -182,6 +194,10 @@ class _XdrPointer(_XdrAst):
name: str
fields: List[_XdrDeclaration]
+ def __post_init__(self):
+ structs.add(self.name)
+ pass_by_reference.add(self.name)
+
@dataclass
class _XdrTypedef(_XdrAst):
@@ -189,6 +205,15 @@ class _XdrTypedef(_XdrAst):
declaration: _XdrDeclaration
+ def __post_init__(self):
+ if not isinstance(self.declaration, _XdrBasic):
+ return
+
+ new_type = self.declaration
+ if isinstance(new_type.spec, _XdrDefinedType):
+ if new_type.spec.type_name in pass_by_reference:
+ pass_by_reference.add(new_type.name)
+
@dataclass
class _XdrCaseSpec(_XdrAst):
@@ -216,6 +241,10 @@ class _XdrUnion(_XdrAst):
cases: List[_XdrCaseSpec]
default: _XdrDeclaration
+ def __post_init__(self):
+ structs.add(self.name)
+ pass_by_reference.add(self.name)
+
@dataclass
class _RpcProcedure(_XdrAst):
@@ -290,22 +319,13 @@ class ParseToAst(Transformer):
return _XdrConstantValue(value)
def type_specifier(self, children):
- """Instantiate one type_specifier object"""
- c_classifier = ""
+ """Instantiate one _XdrTypeSpecifier object"""
if isinstance(children[0], _XdrIdentifier):
name = children[0].symbol
- if name in structs:
- c_classifier = "struct "
- return _XdrDefinedType(
- type_name=name,
- c_classifier=c_classifier,
- )
+ return _XdrDefinedType(type_name=name)
name = children[0].data.value
- return _XdrBuiltInType(
- type_name=name,
- c_classifier=c_classifier,
- )
+ return _XdrBuiltInType(type_name=name)
def constant_def(self, children):
"""Instantiate one _XdrConstant object"""
@@ -380,8 +400,6 @@ class ParseToAst(Transformer):
"""Instantiate one _XdrOptionalData declaration object"""
spec = children[0]
name = children[1].symbol
- structs.add(name)
- pass_by_reference.add(name)
return _XdrOptionalData(name, spec)
@@ -400,8 +418,6 @@ class ParseToAst(Transformer):
def struct(self, children):
"""Instantiate one _XdrStruct object"""
name = children[0].symbol
- structs.add(name)
- pass_by_reference.add(name)
fields = children[1].children
last_field = fields[-1]
@@ -416,11 +432,6 @@ class ParseToAst(Transformer):
def typedef(self, children):
"""Instantiate one _XdrTypedef object"""
new_type = children[0]
- if isinstance(new_type, _XdrBasic) and isinstance(
- new_type.spec, _XdrDefinedType
- ):
- if new_type.spec.type_name in pass_by_reference:
- pass_by_reference.add(new_type.name)
return _XdrTypedef(new_type)
@@ -442,8 +453,6 @@ class ParseToAst(Transformer):
def union(self, children):
"""Instantiate one _XdrUnion object"""
name = children[0].symbol
- structs.add(name)
- pass_by_reference.add(name)
body = children[1]
discriminant = body.children[0].children[0]
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 02/16] xdrgen: Track constant values
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
2024-10-03 15:01 ` [PATCH 01/16] xdrgen: Refactor transformer arms cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 03/16] xdrgen: Keep track of on-the-wire data type widths cel
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
In order to compute the numeric on-the-wire width of XDR types,
xdrgen needs to keep track of the numeric value of constants that
are defined in the input specification so it can perform
calculations with those values.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index 68f09945f2c4..b7df45f47707 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -19,6 +19,8 @@ public_apis = []
structs = set()
pass_by_reference = set()
+constants = {}
+
@dataclass
class _XdrAst(ast_utils.Ast):
@@ -156,6 +158,10 @@ class _XdrConstant(_XdrAst):
name: str
value: str
+ def __post_init__(self):
+ if self.value not in constants:
+ constants[self.name] = int(self.value, 0)
+
@dataclass
class _XdrEnumerator(_XdrAst):
@@ -164,6 +170,10 @@ class _XdrEnumerator(_XdrAst):
name: str
value: str
+ def __post_init__(self):
+ if self.value not in constants:
+ constants[self.name] = int(self.value, 0)
+
@dataclass
class _XdrEnum(_XdrAst):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 03/16] xdrgen: Keep track of on-the-wire data type widths
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
2024-10-03 15:01 ` [PATCH 01/16] xdrgen: Refactor transformer arms cel
2024-10-03 15:01 ` [PATCH 02/16] xdrgen: Track constant values cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 04/16] xdrgen: XDR widths for enum types cel
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
The generic parts of the RPC layer need to know the widths (in
XDR_UNIT increments) of the XDR data types defined for each
protocol.
As a first step, add dictionaries to keep track of the symbolic and
actual maximum XDR width of XDR types.
This makes it straightforward to look up the width of a type by its
name. The built-in dictionaries are pre-loaded with the widths of
the built-in XDR types as defined in RFC 4506.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
include/linux/sunrpc/xdrgen/_defs.h | 9 ++++++
tools/net/sunrpc/xdrgen/xdr_ast.py | 43 +++++++++++++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/include/linux/sunrpc/xdrgen/_defs.h b/include/linux/sunrpc/xdrgen/_defs.h
index be9e62371758..20c7270aa64d 100644
--- a/include/linux/sunrpc/xdrgen/_defs.h
+++ b/include/linux/sunrpc/xdrgen/_defs.h
@@ -23,4 +23,13 @@ typedef struct {
u8 *data;
} opaque;
+#define XDR_void (0)
+#define XDR_bool (1)
+#define XDR_int (1)
+#define XDR_unsigned_int (1)
+#define XDR_long (1)
+#define XDR_unsigned_long (1)
+#define XDR_hyper (2)
+#define XDR_unsigned_hyper (2)
+
#endif /* _SUNRPC_XDRGEN__DEFS_H_ */
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index b7df45f47707..f1d93a1d0ed8 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -21,6 +21,31 @@ pass_by_reference = set()
constants = {}
+symbolic_widths = {
+ "void": ["XDR_void"],
+ "bool": ["XDR_bool"],
+ "int": ["XDR_int"],
+ "unsigned_int": ["XDR_unsigned_int"],
+ "long": ["XDR_long"],
+ "unsigned_long": ["XDR_unsigned_long"],
+ "hyper": ["XDR_hyper"],
+ "unsigned_hyper": ["XDR_unsigned_hyper"],
+}
+
+# Numeric XDR widths are tracked in a dictionary that is keyed
+# by type_name because sometimes a caller has nothing more than
+# the type_name to use to figure out the numeric width.
+max_widths = {
+ "void": 0,
+ "bool": 1,
+ "int": 1,
+ "unsigned_int": 1,
+ "long": 1,
+ "unsigned_long": 1,
+ "hyper": 2,
+ "unsigned_hyper": 2,
+}
+
@dataclass
class _XdrAst(ast_utils.Ast):
@@ -60,15 +85,24 @@ class _XdrTypeSpecifier(_XdrAst):
class _XdrDefinedType(_XdrTypeSpecifier):
"""Corresponds to a type defined by the input specification"""
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ return [get_header_name().upper() + "_" + self.type_name + "_sz"]
+
def __post_init__(self):
if self.type_name in structs:
self.c_classifier = "struct "
+ symbolic_widths[self.type_name] = self.symbolic_width()
@dataclass
class _XdrBuiltInType(_XdrTypeSpecifier):
"""Corresponds to a built-in XDR type"""
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ return symbolic_widths[self.type_name]
+
@dataclass
class _XdrDeclaration(_XdrAst):
@@ -148,8 +182,17 @@ class _XdrBasic(_XdrDeclaration):
class _XdrVoid(_XdrDeclaration):
"""A void declaration"""
+ name: str = "void"
template: str = "void"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return 0
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ return []
+
@dataclass
class _XdrConstant(_XdrAst):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 04/16] xdrgen: XDR widths for enum types
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (2 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 03/16] xdrgen: Keep track of on-the-wire data type widths cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 05/16] xdrgen: XDR width for fixed-length opaque cel
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
RFC 4506 says that an XDR enum is represented as a signed integer
on the wire; thus its width is 1 XDR_UNIT.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index f1d93a1d0ed8..fbee954c7f70 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -227,6 +227,18 @@ class _XdrEnum(_XdrAst):
maximum: int
enumerators: List[_XdrEnumerator]
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return 1
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ return ["XDR_int"]
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrStruct(_XdrAst):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 05/16] xdrgen: XDR width for fixed-length opaque
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (3 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 04/16] xdrgen: XDR widths for enum types cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 06/16] xdrgen: XDR width for variable-length opaque cel
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
The XDR width for a fixed-length opaque is the byte size of the
opaque rounded up to the next XDR_UNIT, divided by XDR_UNIT.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index fbee954c7f70..9fe7fa688caa 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -21,6 +21,16 @@ pass_by_reference = set()
constants = {}
+
+def xdr_quadlen(val: str) -> int:
+ """Return integer XDR width of an XDR type"""
+ if val in constants:
+ octets = constants[val]
+ else:
+ octets = int(val)
+ return int((octets + 3) / 4)
+
+
symbolic_widths = {
"void": ["XDR_void"],
"bool": ["XDR_bool"],
@@ -117,6 +127,18 @@ class _XdrFixedLengthOpaque(_XdrDeclaration):
size: str
template: str = "fixed_length_opaque"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return xdr_quadlen(self.size)
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ return ["XDR_QUADLEN(" + self.size + ")"]
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrVariableLengthOpaque(_XdrDeclaration):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 06/16] xdrgen: XDR width for variable-length opaque
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (4 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 05/16] xdrgen: XDR width for fixed-length opaque cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 07/16] xdrgen: XDR width for a string cel
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
The byte size of a variable-length opaque is conveyed in an unsigned
integer. If there is a specified maximum size, that is included in
the type's widths list.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index 9fe7fa688caa..94cdcfb36e77 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -148,6 +148,21 @@ class _XdrVariableLengthOpaque(_XdrDeclaration):
maxsize: str
template: str = "variable_length_opaque"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return 1 + xdr_quadlen(self.maxsize)
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ widths = ["XDR_unsigned_int"]
+ if self.maxsize != "0":
+ widths.append("XDR_QUADLEN(" + self.maxsize + ")")
+ return widths
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrString(_XdrDeclaration):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 07/16] xdrgen: XDR width for a string
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (5 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 06/16] xdrgen: XDR width for variable-length opaque cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 08/16] xdrgen: XDR width for fixed-length array cel
2024-10-03 15:01 ` [PATCH 09/16] xdrgen: XDR width for variable-length array cel
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
A string works like a variable-length opaque. See Section 4.11 of
RFC 4506.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index 94cdcfb36e77..d5f48c094729 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -172,6 +172,21 @@ class _XdrString(_XdrDeclaration):
maxsize: str
template: str = "string"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return 1 + xdr_quadlen(self.maxsize)
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ widths = ["XDR_unsigned_int"]
+ if self.maxsize != "0":
+ widths.append("XDR_QUADLEN(" + self.maxsize + ")")
+ return widths
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrFixedLengthArray(_XdrDeclaration):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 08/16] xdrgen: XDR width for fixed-length array
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (6 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 07/16] xdrgen: XDR width for a string cel
@ 2024-10-03 15:01 ` cel
2024-10-03 15:01 ` [PATCH 09/16] xdrgen: XDR width for variable-length array cel
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index d5f48c094729..e9bc81e83b48 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -197,6 +197,19 @@ class _XdrFixedLengthArray(_XdrDeclaration):
size: str
template: str = "fixed_length_array"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return xdr_quadlen(self.size) * max_widths[self.spec.type_name]
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ item_width = " + ".join(symbolic_widths[self.spec.type_name])
+ return ["(" + self.size + " * (" + item_width + "))"]
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrVariableLengthArray(_XdrDeclaration):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 09/16] xdrgen: XDR width for variable-length array
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
` (7 preceding siblings ...)
2024-10-03 15:01 ` [PATCH 08/16] xdrgen: XDR width for fixed-length array cel
@ 2024-10-03 15:01 ` cel
8 siblings, 0 replies; 10+ messages in thread
From: cel @ 2024-10-03 15:01 UTC (permalink / raw)
To: Neil Brown, Jeff Layton, Olga Kornievskaia, Dai Ngo, Tom Talpey
Cc: linux-nfs, Chuck Lever
From: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
tools/net/sunrpc/xdrgen/xdr_ast.py | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/tools/net/sunrpc/xdrgen/xdr_ast.py b/tools/net/sunrpc/xdrgen/xdr_ast.py
index e9bc81e83b48..cb89d5d9987c 100644
--- a/tools/net/sunrpc/xdrgen/xdr_ast.py
+++ b/tools/net/sunrpc/xdrgen/xdr_ast.py
@@ -220,6 +220,22 @@ class _XdrVariableLengthArray(_XdrDeclaration):
maxsize: str
template: str = "variable_length_array"
+ def max_width(self) -> int:
+ """Return width of type in XDR_UNITS"""
+ return 1 + (xdr_quadlen(self.maxsize) * max_widths[self.spec.type_name])
+
+ def symbolic_width(self) -> List:
+ """Return list containing XDR width of type's components"""
+ widths = ["XDR_unsigned_int"]
+ if self.maxsize != "0":
+ item_width = " + ".join(symbolic_widths[self.spec.type_name])
+ widths.append("(" + self.maxsize + " * (" + item_width + "))")
+ return widths
+
+ def __post_init__(self):
+ max_widths[self.name] = self.max_width()
+ symbolic_widths[self.name] = self.symbolic_width()
+
@dataclass
class _XdrOptionalData(_XdrDeclaration):
--
2.46.2
^ permalink raw reply related [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-10-03 15:02 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-03 15:01 [PATCH 00/16] xdrgen: Emit maxsize macros cel
2024-10-03 15:01 ` [PATCH 01/16] xdrgen: Refactor transformer arms cel
2024-10-03 15:01 ` [PATCH 02/16] xdrgen: Track constant values cel
2024-10-03 15:01 ` [PATCH 03/16] xdrgen: Keep track of on-the-wire data type widths cel
2024-10-03 15:01 ` [PATCH 04/16] xdrgen: XDR widths for enum types cel
2024-10-03 15:01 ` [PATCH 05/16] xdrgen: XDR width for fixed-length opaque cel
2024-10-03 15:01 ` [PATCH 06/16] xdrgen: XDR width for variable-length opaque cel
2024-10-03 15:01 ` [PATCH 07/16] xdrgen: XDR width for a string cel
2024-10-03 15:01 ` [PATCH 08/16] xdrgen: XDR width for fixed-length array cel
2024-10-03 15:01 ` [PATCH 09/16] xdrgen: XDR width for variable-length array cel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox