mirror of
https://github.com/openvswitch/ovs
synced 2025-08-30 13:58:14 +00:00
build-aux: Generate ofp field decoders.
Based on meta-field information extracted by extract_ofp_fields, autogenerate the right decoder to be used. Acked-by: Eelco Chaudron <echaudro@redhat.com> Signed-off-by: Adrian Moreno <amorenoz@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
committed by
Ilya Maximets
parent
d542f0ea85
commit
61e040fc23
@@ -5,6 +5,7 @@ EXTRA_DIST += \
|
|||||||
build-aux/dist-docs \
|
build-aux/dist-docs \
|
||||||
build-aux/dpdkstrip.py \
|
build-aux/dpdkstrip.py \
|
||||||
build-aux/generate-dhparams-c \
|
build-aux/generate-dhparams-c \
|
||||||
|
build-aux/gen_ofp_field_decoders \
|
||||||
build-aux/initial-tab-allowed-files \
|
build-aux/initial-tab-allowed-files \
|
||||||
build-aux/sodepends.py \
|
build-aux/sodepends.py \
|
||||||
build-aux/soexpand.py \
|
build-aux/soexpand.py \
|
||||||
@@ -12,7 +13,8 @@ EXTRA_DIST += \
|
|||||||
build-aux/xml2nroff
|
build-aux/xml2nroff
|
||||||
|
|
||||||
FLAKE8_PYFILES += \
|
FLAKE8_PYFILES += \
|
||||||
$(srcdir)/build-aux/xml2nroff \
|
|
||||||
build-aux/dpdkstrip.py \
|
build-aux/dpdkstrip.py \
|
||||||
|
build-aux/gen_ofp_field_decoders \
|
||||||
build-aux/sodepends.py \
|
build-aux/sodepends.py \
|
||||||
build-aux/soexpand.py
|
build-aux/soexpand.py \
|
||||||
|
build-aux/xml2nroff
|
||||||
|
67
build-aux/gen_ofp_field_decoders
Executable file
67
build-aux/gen_ofp_field_decoders
Executable file
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/env python
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
import build.extract_ofp_fields as extract_fields
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Tool to generate python ofproto field decoders from"
|
||||||
|
"meta-flow information"
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"metaflow",
|
||||||
|
metavar="FILE",
|
||||||
|
type=str,
|
||||||
|
help="Read meta-flow info from file",
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
fields = extract_fields.extract_ofp_fields(args.metaflow)
|
||||||
|
|
||||||
|
field_decoders = {}
|
||||||
|
for field in fields:
|
||||||
|
decoder = get_decoder(field)
|
||||||
|
field_decoders[field.get("name")] = decoder
|
||||||
|
if field.get("extra_name"):
|
||||||
|
field_decoders[field.get("extra_name")] = decoder
|
||||||
|
|
||||||
|
code = """
|
||||||
|
# This file is auto-generated. Do not edit!
|
||||||
|
|
||||||
|
from ovs.flow import decoders
|
||||||
|
|
||||||
|
field_decoders = {{
|
||||||
|
{decoders}
|
||||||
|
}}""".format(
|
||||||
|
decoders="\n".join(
|
||||||
|
[
|
||||||
|
" '{name}': {decoder},".format(name=name, decoder=decoder)
|
||||||
|
for name, decoder in field_decoders.items()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
print(code)
|
||||||
|
|
||||||
|
|
||||||
|
def get_decoder(field):
|
||||||
|
formatting = field.get("formatting")
|
||||||
|
if formatting in ["decimal", "hexadecimal"]:
|
||||||
|
if field.get("mask") == "MFM_NONE":
|
||||||
|
return "decoders.decode_int"
|
||||||
|
else:
|
||||||
|
if field.get("n_bits") in [8, 16, 32, 64, 128, 992]:
|
||||||
|
return "decoders.Mask{}".format(field.get("n_bits"))
|
||||||
|
return "decoders.decode_mask({})".format(field.get("n_bits"))
|
||||||
|
elif formatting in ["IPv4", "IPv6"]:
|
||||||
|
return "decoders.IPMask"
|
||||||
|
elif formatting == "Ethernet":
|
||||||
|
return "decoders.EthMask"
|
||||||
|
else:
|
||||||
|
return "decoders.decode_default"
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
@@ -30,6 +30,7 @@ ovs_pyfiles = \
|
|||||||
python/ovs/flow/decoders.py \
|
python/ovs/flow/decoders.py \
|
||||||
python/ovs/flow/kv.py \
|
python/ovs/flow/kv.py \
|
||||||
python/ovs/flow/list.py \
|
python/ovs/flow/list.py \
|
||||||
|
python/ovs/flow/ofp_fields.py \
|
||||||
python/ovs/json.py \
|
python/ovs/json.py \
|
||||||
python/ovs/jsonrpc.py \
|
python/ovs/jsonrpc.py \
|
||||||
python/ovs/ovsuuid.py \
|
python/ovs/ovsuuid.py \
|
||||||
@@ -127,3 +128,9 @@ EXTRA_DIST += python/ovs/dirs.py.template
|
|||||||
CLEANFILES += python/ovs/dirs.py
|
CLEANFILES += python/ovs/dirs.py
|
||||||
|
|
||||||
EXTRA_DIST += python/TODO.rst
|
EXTRA_DIST += python/TODO.rst
|
||||||
|
|
||||||
|
$(srcdir)/python/ovs/flow/ofp_fields.py: $(srcdir)/build-aux/gen_ofp_field_decoders include/openvswitch/meta-flow.h
|
||||||
|
$(AM_V_GEN)$(run_python) $< $(srcdir)/include/openvswitch/meta-flow.h > $@.tmp
|
||||||
|
$(AM_V_at)mv $@.tmp $@
|
||||||
|
EXTRA_DIST += python/ovs/flow/ofp_fields.py
|
||||||
|
CLEANFILES += python/ovs/flow/ofp_fields.py
|
||||||
|
3
python/ovs/.gitignore
vendored
3
python/ovs/.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
version.py
|
|
||||||
dirs.py
|
dirs.py
|
||||||
|
flow/ofp_fields.py
|
||||||
|
version.py
|
||||||
|
Reference in New Issue
Block a user