From faf9478eb11a5c0de141a4c05feef6fb139694f9 Mon Sep 17 00:00:00 2001 From: Ondrej Fabry Date: Tue, 21 Jul 2020 08:38:36 +0200 Subject: [PATCH] feat: Add support for IPv6 ND address autoconfig (#1676) --- .../ifplugin/descriptor/adapter/interface.go | 2 +- .../descriptor/adapter/bdinterface.go | 2 +- .../descriptor/adapter/bridgedomain.go | 2 +- .../l2plugin/descriptor/adapter/fib.go | 2 +- .../descriptor/adapter/skeleton.go | 4 +- .../descriptor/adapter/skeleton.go | 2 +- .../05_kv-scheduler/adapter/interface.go | 2 +- .../05_kv-scheduler/adapter/route.go | 2 +- go.mod | 4 +- go.sum | 33 +- .../ifplugin/descriptor/adapter/interface.go | 2 +- .../vpp/abfplugin/descriptor/adapter/abf.go | 2 +- .../vpp/binapi/vpp2001/ip6_nd/ip6_nd.ba.go | 405 ++++++++++++++++++ plugins/vpp/binapi/vpp2001/rd_cp/rd_cp.ba.go | 119 +++++ .../vpp/binapi/vpp2005/ip6_nd/ip6_nd.ba.go | 405 ++++++++++++++++++ plugins/vpp/binapi/vpp2005/rd_cp/rd_cp.ba.go | 119 +++++ plugins/vpp/binapi/vpp2005/vpp2005.go | 19 +- .../vpp/ifplugin/descriptor/adapter/ip6nd.go | 233 ++++++++++ plugins/vpp/ifplugin/descriptor/interface.go | 11 + .../ifplugin/descriptor/interface_address.go | 2 +- plugins/vpp/ifplugin/descriptor/ip6nd.go | 137 ++++++ plugins/vpp/ifplugin/ifplugin.go | 6 +- .../vppcalls/interface_handler_api.go | 6 + .../vppcalls/vpp1904/ip6nd_vppcalls.go | 24 ++ .../vppcalls/vpp1908/ip6nd_vppcalls.go | 24 ++ .../vppcalls/vpp2001/ip6nd_vppcalls.go | 34 ++ .../vppcalls/vpp2001/vppcalls_handler.go | 6 + .../vpp2005/dump_interface_vppcalls.go | 1 + .../vppcalls/vpp2005/ip6nd_vppcalls.go | 34 ++ .../vppcalls/vpp2005/vppcalls_handler.go | 6 + .../descriptor/adapter/bridgedomain.go | 2 +- proto/ligato/vpp/interfaces/interface.pb.go | 382 ++++++++++------- proto/ligato/vpp/interfaces/interface.proto | 16 + proto/ligato/vpp/interfaces/models.go | 23 + proto/ligato/vpp/l3/l3.pb.go | 4 + proto/ligato/vpp/l3/l3.proto | 4 + scripts/make/buf.make | 4 +- tests/integration/vpp/032_ip6nd_test.go | 66 +++ tests/integration/vpp_integration.sh | 2 + 39 files changed, 1972 insertions(+), 181 deletions(-) create mode 100644 plugins/vpp/binapi/vpp2001/ip6_nd/ip6_nd.ba.go create mode 100644 plugins/vpp/binapi/vpp2001/rd_cp/rd_cp.ba.go create mode 100644 plugins/vpp/binapi/vpp2005/ip6_nd/ip6_nd.ba.go create mode 100644 plugins/vpp/binapi/vpp2005/rd_cp/rd_cp.ba.go create mode 100644 plugins/vpp/ifplugin/descriptor/adapter/ip6nd.go create mode 100644 plugins/vpp/ifplugin/descriptor/ip6nd.go create mode 100644 plugins/vpp/ifplugin/vppcalls/vpp1904/ip6nd_vppcalls.go create mode 100644 plugins/vpp/ifplugin/vppcalls/vpp1908/ip6nd_vppcalls.go create mode 100644 plugins/vpp/ifplugin/vppcalls/vpp2001/ip6nd_vppcalls.go create mode 100644 plugins/vpp/ifplugin/vppcalls/vpp2005/ip6nd_vppcalls.go create mode 100644 tests/integration/vpp/032_ip6nd_test.go diff --git a/examples/kvscheduler/mock_plugins/ifplugin/descriptor/adapter/interface.go b/examples/kvscheduler/mock_plugins/ifplugin/descriptor/adapter/interface.go index 08ee42d516..d146d5dc97 100644 --- a/examples/kvscheduler/mock_plugins/ifplugin/descriptor/adapter/interface.go +++ b/examples/kvscheduler/mock_plugins/ifplugin/descriptor/adapter/interface.go @@ -4,9 +4,9 @@ package adapter import ( "github.com/golang/protobuf/proto" + . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/ifplugin/model" "go.ligato.io/vpp-agent/v3/pkg/idxvpp" - . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bdinterface.go b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bdinterface.go index 5df01c1760..e6aba14b5d 100644 --- a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bdinterface.go +++ b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bdinterface.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/l2plugin/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/l2plugin/model" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bridgedomain.go b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bridgedomain.go index 01c6bd3367..cd8b554588 100644 --- a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bridgedomain.go +++ b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/bridgedomain.go @@ -4,9 +4,9 @@ package adapter import ( "github.com/golang/protobuf/proto" + . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/l2plugin/model" "go.ligato.io/vpp-agent/v3/pkg/idxvpp" - . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/fib.go b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/fib.go index b0b94adf26..16cf79fe24 100644 --- a/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/fib.go +++ b/examples/kvscheduler/mock_plugins/l2plugin/descriptor/adapter/fib.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/l2plugin/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/kvscheduler/mock_plugins/l2plugin/model" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/kvscheduler/plugin_skeleton/with_metadata/descriptor/adapter/skeleton.go b/examples/kvscheduler/plugin_skeleton/with_metadata/descriptor/adapter/skeleton.go index 82d3a07bdf..0cf6336907 100644 --- a/examples/kvscheduler/plugin_skeleton/with_metadata/descriptor/adapter/skeleton.go +++ b/examples/kvscheduler/plugin_skeleton/with_metadata/descriptor/adapter/skeleton.go @@ -4,9 +4,9 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/with_metadata/metaidx" - "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/with_metadata/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/with_metadata/model" + "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/with_metadata/metaidx" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/kvscheduler/plugin_skeleton/without_metadata/descriptor/adapter/skeleton.go b/examples/kvscheduler/plugin_skeleton/without_metadata/descriptor/adapter/skeleton.go index d2c992499c..da6e7dc291 100644 --- a/examples/kvscheduler/plugin_skeleton/without_metadata/descriptor/adapter/skeleton.go +++ b/examples/kvscheduler/plugin_skeleton/without_metadata/descriptor/adapter/skeleton.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/without_metadata/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/kvscheduler/plugin_skeleton/without_metadata/model" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/tutorials/05_kv-scheduler/adapter/interface.go b/examples/tutorials/05_kv-scheduler/adapter/interface.go index 9a1754ff70..edf15bca2d 100644 --- a/examples/tutorials/05_kv-scheduler/adapter/interface.go +++ b/examples/tutorials/05_kv-scheduler/adapter/interface.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/model" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/examples/tutorials/05_kv-scheduler/adapter/route.go b/examples/tutorials/05_kv-scheduler/adapter/route.go index c484e14101..ea6522e27b 100644 --- a/examples/tutorials/05_kv-scheduler/adapter/route.go +++ b/examples/tutorials/05_kv-scheduler/adapter/route.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/model" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/examples/tutorials/05_kv-scheduler/model" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/go.mod b/go.mod index 81a0d8623f..f4e67550aa 100644 --- a/go.mod +++ b/go.mod @@ -23,7 +23,7 @@ require ( github.com/fsouza/go-dockerclient v1.2.2 github.com/ghodss/yaml v1.0.0 github.com/go-errors/errors v1.0.1 - github.com/golang/protobuf v1.3.3 + github.com/golang/protobuf v1.4.2 github.com/gorilla/mux v1.6.2 github.com/gorilla/websocket v1.4.1 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 @@ -56,6 +56,8 @@ require ( golang.org/x/net v0.0.0-20190620200207-3b0461eec859 golang.org/x/sys v0.0.0-20200501145240-bc7a7d42d5c3 golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 // indirect + google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df // indirect google.golang.org/grpc v1.27.1 + google.golang.org/protobuf v1.25.0 // indirect gotest.tools v2.2.0+incompatible // indirect ) diff --git a/go.sum b/go.sum index 8fbcd63ca9..ab7d19e128 100644 --- a/go.sum +++ b/go.sum @@ -141,8 +141,15 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -153,8 +160,12 @@ github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2 h1:Pgr17XVTNXAk3q/r4CpKzC5xBM/qW1uVLV+IhRZpIIk= @@ -443,6 +454,8 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= @@ -453,14 +466,30 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20181101192439-c830210a61df/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df h1:HWF6nM8ruGdu1K8IXFR+i2oT3YP+iBfZzCbC9zUfcWo= +google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/plugins/linux/ifplugin/descriptor/adapter/interface.go b/plugins/linux/ifplugin/descriptor/adapter/interface.go index e5c79e2eca..3e9e2859c8 100644 --- a/plugins/linux/ifplugin/descriptor/adapter/interface.go +++ b/plugins/linux/ifplugin/descriptor/adapter/interface.go @@ -5,8 +5,8 @@ package adapter import ( "github.com/golang/protobuf/proto" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" - "go.ligato.io/vpp-agent/v3/plugins/linux/ifplugin/ifaceidx" "go.ligato.io/vpp-agent/v3/proto/ligato/linux/interfaces" + "go.ligato.io/vpp-agent/v3/plugins/linux/ifplugin/ifaceidx" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/plugins/vpp/abfplugin/descriptor/adapter/abf.go b/plugins/vpp/abfplugin/descriptor/adapter/abf.go index 7dc43fafbb..732d06ba83 100644 --- a/plugins/vpp/abfplugin/descriptor/adapter/abf.go +++ b/plugins/vpp/abfplugin/descriptor/adapter/abf.go @@ -6,7 +6,7 @@ import ( "github.com/golang/protobuf/proto" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" "go.ligato.io/vpp-agent/v3/plugins/vpp/abfplugin/abfidx" - vpp_abf "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/abf" + "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/abf" ) ////////// type-safe key-value pair with metadata ////////// diff --git a/plugins/vpp/binapi/vpp2001/ip6_nd/ip6_nd.ba.go b/plugins/vpp/binapi/vpp2001/ip6_nd/ip6_nd.ba.go new file mode 100644 index 0000000000..501ef4e129 --- /dev/null +++ b/plugins/vpp/binapi/vpp2001/ip6_nd/ip6_nd.ba.go @@ -0,0 +1,405 @@ +// Code generated by GoVPP's binapi-generator. DO NOT EDIT. +// source: /usr/share/vpp/api/core/ip6_nd.api.json + +/* +Package ip6_nd is a generated VPP binary API for 'ip6_nd' module. + +It consists of: + 10 enums + 6 aliases + 7 types + 1 union + 13 messages + 6 services +*/ +package ip6_nd + +import ( + "bytes" + "context" + "io" + "strconv" + + api "git.fd.io/govpp.git/api" + struc "github.com/lunixbochs/struc" + + interface_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/interface_types" + ip_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/ip_types" +) + +const ( + // ModuleName is the name of this module. + ModuleName = "ip6_nd" + // APIVersion is the API version of this module. + APIVersion = "1.0.0" + // VersionCrc is the CRC of this module. + VersionCrc = 0xbb8ff0e9 +) + +type AddressFamily = ip_types.AddressFamily + +type IfStatusFlags = interface_types.IfStatusFlags + +type IfType = interface_types.IfType + +type IPDscp = ip_types.IPDscp + +type IPEcn = ip_types.IPEcn + +type IPProto = ip_types.IPProto + +type LinkDuplex = interface_types.LinkDuplex + +type MtuProto = interface_types.MtuProto + +type RxMode = interface_types.RxMode + +type SubIfFlags = interface_types.SubIfFlags + +type AddressWithPrefix = ip_types.AddressWithPrefix + +type InterfaceIndex = interface_types.InterfaceIndex + +type IP4Address = ip_types.IP4Address + +type IP4AddressWithPrefix = ip_types.IP4AddressWithPrefix + +type IP6Address = ip_types.IP6Address + +type IP6AddressWithPrefix = ip_types.IP6AddressWithPrefix + +type Address = ip_types.Address + +type IP4Prefix = ip_types.IP4Prefix + +type IP6Prefix = ip_types.IP6Prefix + +// IP6RaPrefixInfo represents VPP binary API type 'ip6_ra_prefix_info'. +type IP6RaPrefixInfo struct { + Prefix Prefix + Flags uint8 + ValidTime uint32 + PreferredTime uint32 +} + +func (*IP6RaPrefixInfo) GetTypeName() string { return "ip6_ra_prefix_info" } + +type Mprefix = ip_types.Mprefix + +type Prefix = ip_types.Prefix + +type PrefixMatcher = ip_types.PrefixMatcher + +type AddressUnion = ip_types.AddressUnion + +// IP6RaEvent represents VPP binary API message 'ip6_ra_event'. +type IP6RaEvent struct { + PID uint32 + SwIfIndex InterfaceIndex + RouterAddr IP6Address + CurrentHopLimit uint8 + Flags uint8 + RouterLifetimeInSec uint16 + NeighborReachableTimeInMsec uint32 + TimeInMsecBetweenRetransmittedNeighborSolicitations uint32 + NPrefixes uint32 `struc:"sizeof=Prefixes"` + Prefixes []IP6RaPrefixInfo +} + +func (m *IP6RaEvent) Reset() { *m = IP6RaEvent{} } +func (*IP6RaEvent) GetMessageName() string { return "ip6_ra_event" } +func (*IP6RaEvent) GetCrcString() string { return "47e8cfbe" } +func (*IP6RaEvent) GetMessageType() api.MessageType { return api.EventMessage } + +// IP6ndProxyAddDel represents VPP binary API message 'ip6nd_proxy_add_del'. +type IP6ndProxyAddDel struct { + SwIfIndex InterfaceIndex + IsAdd bool + IP IP6Address +} + +func (m *IP6ndProxyAddDel) Reset() { *m = IP6ndProxyAddDel{} } +func (*IP6ndProxyAddDel) GetMessageName() string { return "ip6nd_proxy_add_del" } +func (*IP6ndProxyAddDel) GetCrcString() string { return "3fdf6659" } +func (*IP6ndProxyAddDel) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndProxyAddDelReply represents VPP binary API message 'ip6nd_proxy_add_del_reply'. +type IP6ndProxyAddDelReply struct { + Retval int32 +} + +func (m *IP6ndProxyAddDelReply) Reset() { *m = IP6ndProxyAddDelReply{} } +func (*IP6ndProxyAddDelReply) GetMessageName() string { return "ip6nd_proxy_add_del_reply" } +func (*IP6ndProxyAddDelReply) GetCrcString() string { return "e8d4e804" } +func (*IP6ndProxyAddDelReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// IP6ndProxyDetails represents VPP binary API message 'ip6nd_proxy_details'. +type IP6ndProxyDetails struct { + SwIfIndex InterfaceIndex + IP IP6Address +} + +func (m *IP6ndProxyDetails) Reset() { *m = IP6ndProxyDetails{} } +func (*IP6ndProxyDetails) GetMessageName() string { return "ip6nd_proxy_details" } +func (*IP6ndProxyDetails) GetCrcString() string { return "d35be8ff" } +func (*IP6ndProxyDetails) GetMessageType() api.MessageType { return api.ReplyMessage } + +// IP6ndProxyDump represents VPP binary API message 'ip6nd_proxy_dump'. +type IP6ndProxyDump struct{} + +func (m *IP6ndProxyDump) Reset() { *m = IP6ndProxyDump{} } +func (*IP6ndProxyDump) GetMessageName() string { return "ip6nd_proxy_dump" } +func (*IP6ndProxyDump) GetCrcString() string { return "51077d14" } +func (*IP6ndProxyDump) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndSendRouterSolicitation represents VPP binary API message 'ip6nd_send_router_solicitation'. +type IP6ndSendRouterSolicitation struct { + Irt uint32 + Mrt uint32 + Mrc uint32 + Mrd uint32 + SwIfIndex InterfaceIndex + Stop bool +} + +func (m *IP6ndSendRouterSolicitation) Reset() { *m = IP6ndSendRouterSolicitation{} } +func (*IP6ndSendRouterSolicitation) GetMessageName() string { return "ip6nd_send_router_solicitation" } +func (*IP6ndSendRouterSolicitation) GetCrcString() string { return "e5de609c" } +func (*IP6ndSendRouterSolicitation) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndSendRouterSolicitationReply represents VPP binary API message 'ip6nd_send_router_solicitation_reply'. +type IP6ndSendRouterSolicitationReply struct { + Retval int32 +} + +func (m *IP6ndSendRouterSolicitationReply) Reset() { *m = IP6ndSendRouterSolicitationReply{} } +func (*IP6ndSendRouterSolicitationReply) GetMessageName() string { + return "ip6nd_send_router_solicitation_reply" +} +func (*IP6ndSendRouterSolicitationReply) GetCrcString() string { return "e8d4e804" } +func (*IP6ndSendRouterSolicitationReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// SwInterfaceIP6ndRaConfig represents VPP binary API message 'sw_interface_ip6nd_ra_config'. +type SwInterfaceIP6ndRaConfig struct { + SwIfIndex InterfaceIndex + Suppress uint8 + Managed uint8 + Other uint8 + LlOption uint8 + SendUnicast uint8 + Cease uint8 + IsNo bool + DefaultRouter uint8 + MaxInterval uint32 + MinInterval uint32 + Lifetime uint32 + InitialCount uint32 + InitialInterval uint32 +} + +func (m *SwInterfaceIP6ndRaConfig) Reset() { *m = SwInterfaceIP6ndRaConfig{} } +func (*SwInterfaceIP6ndRaConfig) GetMessageName() string { return "sw_interface_ip6nd_ra_config" } +func (*SwInterfaceIP6ndRaConfig) GetCrcString() string { return "3eb00b1c" } +func (*SwInterfaceIP6ndRaConfig) GetMessageType() api.MessageType { return api.RequestMessage } + +// SwInterfaceIP6ndRaConfigReply represents VPP binary API message 'sw_interface_ip6nd_ra_config_reply'. +type SwInterfaceIP6ndRaConfigReply struct { + Retval int32 +} + +func (m *SwInterfaceIP6ndRaConfigReply) Reset() { *m = SwInterfaceIP6ndRaConfigReply{} } +func (*SwInterfaceIP6ndRaConfigReply) GetMessageName() string { + return "sw_interface_ip6nd_ra_config_reply" +} +func (*SwInterfaceIP6ndRaConfigReply) GetCrcString() string { return "e8d4e804" } +func (*SwInterfaceIP6ndRaConfigReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// SwInterfaceIP6ndRaPrefix represents VPP binary API message 'sw_interface_ip6nd_ra_prefix'. +type SwInterfaceIP6ndRaPrefix struct { + SwIfIndex InterfaceIndex + Prefix Prefix + UseDefault bool + NoAdvertise bool + OffLink bool + NoAutoconfig bool + NoOnlink bool + IsNo bool + ValLifetime uint32 + PrefLifetime uint32 +} + +func (m *SwInterfaceIP6ndRaPrefix) Reset() { *m = SwInterfaceIP6ndRaPrefix{} } +func (*SwInterfaceIP6ndRaPrefix) GetMessageName() string { return "sw_interface_ip6nd_ra_prefix" } +func (*SwInterfaceIP6ndRaPrefix) GetCrcString() string { return "e098785f" } +func (*SwInterfaceIP6ndRaPrefix) GetMessageType() api.MessageType { return api.RequestMessage } + +// SwInterfaceIP6ndRaPrefixReply represents VPP binary API message 'sw_interface_ip6nd_ra_prefix_reply'. +type SwInterfaceIP6ndRaPrefixReply struct { + Retval int32 +} + +func (m *SwInterfaceIP6ndRaPrefixReply) Reset() { *m = SwInterfaceIP6ndRaPrefixReply{} } +func (*SwInterfaceIP6ndRaPrefixReply) GetMessageName() string { + return "sw_interface_ip6nd_ra_prefix_reply" +} +func (*SwInterfaceIP6ndRaPrefixReply) GetCrcString() string { return "e8d4e804" } +func (*SwInterfaceIP6ndRaPrefixReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// WantIP6RaEvents represents VPP binary API message 'want_ip6_ra_events'. +type WantIP6RaEvents struct { + Enable bool + PID uint32 +} + +func (m *WantIP6RaEvents) Reset() { *m = WantIP6RaEvents{} } +func (*WantIP6RaEvents) GetMessageName() string { return "want_ip6_ra_events" } +func (*WantIP6RaEvents) GetCrcString() string { return "3ec6d6c2" } +func (*WantIP6RaEvents) GetMessageType() api.MessageType { return api.RequestMessage } + +// WantIP6RaEventsReply represents VPP binary API message 'want_ip6_ra_events_reply'. +type WantIP6RaEventsReply struct { + Retval int32 +} + +func (m *WantIP6RaEventsReply) Reset() { *m = WantIP6RaEventsReply{} } +func (*WantIP6RaEventsReply) GetMessageName() string { return "want_ip6_ra_events_reply" } +func (*WantIP6RaEventsReply) GetCrcString() string { return "e8d4e804" } +func (*WantIP6RaEventsReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +func init() { + api.RegisterMessage((*IP6RaEvent)(nil), "ip6_nd.IP6RaEvent") + api.RegisterMessage((*IP6ndProxyAddDel)(nil), "ip6_nd.IP6ndProxyAddDel") + api.RegisterMessage((*IP6ndProxyAddDelReply)(nil), "ip6_nd.IP6ndProxyAddDelReply") + api.RegisterMessage((*IP6ndProxyDetails)(nil), "ip6_nd.IP6ndProxyDetails") + api.RegisterMessage((*IP6ndProxyDump)(nil), "ip6_nd.IP6ndProxyDump") + api.RegisterMessage((*IP6ndSendRouterSolicitation)(nil), "ip6_nd.IP6ndSendRouterSolicitation") + api.RegisterMessage((*IP6ndSendRouterSolicitationReply)(nil), "ip6_nd.IP6ndSendRouterSolicitationReply") + api.RegisterMessage((*SwInterfaceIP6ndRaConfig)(nil), "ip6_nd.SwInterfaceIP6ndRaConfig") + api.RegisterMessage((*SwInterfaceIP6ndRaConfigReply)(nil), "ip6_nd.SwInterfaceIP6ndRaConfigReply") + api.RegisterMessage((*SwInterfaceIP6ndRaPrefix)(nil), "ip6_nd.SwInterfaceIP6ndRaPrefix") + api.RegisterMessage((*SwInterfaceIP6ndRaPrefixReply)(nil), "ip6_nd.SwInterfaceIP6ndRaPrefixReply") + api.RegisterMessage((*WantIP6RaEvents)(nil), "ip6_nd.WantIP6RaEvents") + api.RegisterMessage((*WantIP6RaEventsReply)(nil), "ip6_nd.WantIP6RaEventsReply") +} + +// Messages returns list of all messages in this module. +func AllMessages() []api.Message { + return []api.Message{ + (*IP6RaEvent)(nil), + (*IP6ndProxyAddDel)(nil), + (*IP6ndProxyAddDelReply)(nil), + (*IP6ndProxyDetails)(nil), + (*IP6ndProxyDump)(nil), + (*IP6ndSendRouterSolicitation)(nil), + (*IP6ndSendRouterSolicitationReply)(nil), + (*SwInterfaceIP6ndRaConfig)(nil), + (*SwInterfaceIP6ndRaConfigReply)(nil), + (*SwInterfaceIP6ndRaPrefix)(nil), + (*SwInterfaceIP6ndRaPrefixReply)(nil), + (*WantIP6RaEvents)(nil), + (*WantIP6RaEventsReply)(nil), + } +} + +// RPCService represents RPC service API for ip6_nd module. +type RPCService interface { + DumpIP6ndProxy(ctx context.Context, in *IP6ndProxyDump) (RPCService_DumpIP6ndProxyClient, error) + IP6ndProxyAddDel(ctx context.Context, in *IP6ndProxyAddDel) (*IP6ndProxyAddDelReply, error) + IP6ndSendRouterSolicitation(ctx context.Context, in *IP6ndSendRouterSolicitation) (*IP6ndSendRouterSolicitationReply, error) + SwInterfaceIP6ndRaConfig(ctx context.Context, in *SwInterfaceIP6ndRaConfig) (*SwInterfaceIP6ndRaConfigReply, error) + SwInterfaceIP6ndRaPrefix(ctx context.Context, in *SwInterfaceIP6ndRaPrefix) (*SwInterfaceIP6ndRaPrefixReply, error) + WantIP6RaEvents(ctx context.Context, in *WantIP6RaEvents) (*WantIP6RaEventsReply, error) +} + +type serviceClient struct { + ch api.Channel +} + +func NewServiceClient(ch api.Channel) RPCService { + return &serviceClient{ch} +} + +func (c *serviceClient) DumpIP6ndProxy(ctx context.Context, in *IP6ndProxyDump) (RPCService_DumpIP6ndProxyClient, error) { + stream := c.ch.SendMultiRequest(in) + x := &serviceClient_DumpIP6ndProxyClient{stream} + return x, nil +} + +type RPCService_DumpIP6ndProxyClient interface { + Recv() (*IP6ndProxyDetails, error) +} + +type serviceClient_DumpIP6ndProxyClient struct { + api.MultiRequestCtx +} + +func (c *serviceClient_DumpIP6ndProxyClient) Recv() (*IP6ndProxyDetails, error) { + m := new(IP6ndProxyDetails) + stop, err := c.MultiRequestCtx.ReceiveReply(m) + if err != nil { + return nil, err + } + if stop { + return nil, io.EOF + } + return m, nil +} + +func (c *serviceClient) IP6ndProxyAddDel(ctx context.Context, in *IP6ndProxyAddDel) (*IP6ndProxyAddDelReply, error) { + out := new(IP6ndProxyAddDelReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) IP6ndSendRouterSolicitation(ctx context.Context, in *IP6ndSendRouterSolicitation) (*IP6ndSendRouterSolicitationReply, error) { + out := new(IP6ndSendRouterSolicitationReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) SwInterfaceIP6ndRaConfig(ctx context.Context, in *SwInterfaceIP6ndRaConfig) (*SwInterfaceIP6ndRaConfigReply, error) { + out := new(SwInterfaceIP6ndRaConfigReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) SwInterfaceIP6ndRaPrefix(ctx context.Context, in *SwInterfaceIP6ndRaPrefix) (*SwInterfaceIP6ndRaPrefixReply, error) { + out := new(SwInterfaceIP6ndRaPrefixReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) WantIP6RaEvents(ctx context.Context, in *WantIP6RaEvents) (*WantIP6RaEventsReply, error) { + out := new(WantIP6RaEventsReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the GoVPP api package it is being compiled against. +// A compilation error at this line likely means your copy of the +// GoVPP api package needs to be updated. +const _ = api.GoVppAPIPackageIsVersion1 // please upgrade the GoVPP api package + +// Reference imports to suppress errors if they are not otherwise used. +var _ = api.RegisterMessage +var _ = bytes.NewBuffer +var _ = context.Background +var _ = io.Copy +var _ = strconv.Itoa +var _ = struc.Pack diff --git a/plugins/vpp/binapi/vpp2001/rd_cp/rd_cp.ba.go b/plugins/vpp/binapi/vpp2001/rd_cp/rd_cp.ba.go new file mode 100644 index 0000000000..e5be342ba1 --- /dev/null +++ b/plugins/vpp/binapi/vpp2001/rd_cp/rd_cp.ba.go @@ -0,0 +1,119 @@ +// Code generated by GoVPP's binapi-generator. DO NOT EDIT. +// source: /usr/share/vpp/api/core/rd_cp.api.json + +/* +Package rd_cp is a generated VPP binary API for 'rd_cp' module. + +It consists of: + 6 enums + 1 alias + 2 messages + 1 service +*/ +package rd_cp + +import ( + "bytes" + "context" + "io" + "strconv" + + api "git.fd.io/govpp.git/api" + struc "github.com/lunixbochs/struc" + + interface_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/interface_types" +) + +const ( + // ModuleName is the name of this module. + ModuleName = "rd_cp" + // APIVersion is the API version of this module. + APIVersion = "1.0.1" + // VersionCrc is the CRC of this module. + VersionCrc = 0x5269dfb9 +) + +type IfStatusFlags = interface_types.IfStatusFlags + +type IfType = interface_types.IfType + +type LinkDuplex = interface_types.LinkDuplex + +type MtuProto = interface_types.MtuProto + +type RxMode = interface_types.RxMode + +type SubIfFlags = interface_types.SubIfFlags + +type InterfaceIndex = interface_types.InterfaceIndex + +// IP6NdAddressAutoconfig represents VPP binary API message 'ip6_nd_address_autoconfig'. +type IP6NdAddressAutoconfig struct { + SwIfIndex InterfaceIndex + Enable bool + InstallDefaultRoutes bool +} + +func (m *IP6NdAddressAutoconfig) Reset() { *m = IP6NdAddressAutoconfig{} } +func (*IP6NdAddressAutoconfig) GetMessageName() string { return "ip6_nd_address_autoconfig" } +func (*IP6NdAddressAutoconfig) GetCrcString() string { return "9e14a4a7" } +func (*IP6NdAddressAutoconfig) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6NdAddressAutoconfigReply represents VPP binary API message 'ip6_nd_address_autoconfig_reply'. +type IP6NdAddressAutoconfigReply struct { + Retval int32 +} + +func (m *IP6NdAddressAutoconfigReply) Reset() { *m = IP6NdAddressAutoconfigReply{} } +func (*IP6NdAddressAutoconfigReply) GetMessageName() string { return "ip6_nd_address_autoconfig_reply" } +func (*IP6NdAddressAutoconfigReply) GetCrcString() string { return "e8d4e804" } +func (*IP6NdAddressAutoconfigReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +func init() { + api.RegisterMessage((*IP6NdAddressAutoconfig)(nil), "rd_cp.IP6NdAddressAutoconfig") + api.RegisterMessage((*IP6NdAddressAutoconfigReply)(nil), "rd_cp.IP6NdAddressAutoconfigReply") +} + +// Messages returns list of all messages in this module. +func AllMessages() []api.Message { + return []api.Message{ + (*IP6NdAddressAutoconfig)(nil), + (*IP6NdAddressAutoconfigReply)(nil), + } +} + +// RPCService represents RPC service API for rd_cp module. +type RPCService interface { + IP6NdAddressAutoconfig(ctx context.Context, in *IP6NdAddressAutoconfig) (*IP6NdAddressAutoconfigReply, error) +} + +type serviceClient struct { + ch api.Channel +} + +func NewServiceClient(ch api.Channel) RPCService { + return &serviceClient{ch} +} + +func (c *serviceClient) IP6NdAddressAutoconfig(ctx context.Context, in *IP6NdAddressAutoconfig) (*IP6NdAddressAutoconfigReply, error) { + out := new(IP6NdAddressAutoconfigReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the GoVPP api package it is being compiled against. +// A compilation error at this line likely means your copy of the +// GoVPP api package needs to be updated. +const _ = api.GoVppAPIPackageIsVersion1 // please upgrade the GoVPP api package + +// Reference imports to suppress errors if they are not otherwise used. +var _ = api.RegisterMessage +var _ = bytes.NewBuffer +var _ = context.Background +var _ = io.Copy +var _ = strconv.Itoa +var _ = struc.Pack diff --git a/plugins/vpp/binapi/vpp2005/ip6_nd/ip6_nd.ba.go b/plugins/vpp/binapi/vpp2005/ip6_nd/ip6_nd.ba.go new file mode 100644 index 0000000000..a1178d7250 --- /dev/null +++ b/plugins/vpp/binapi/vpp2005/ip6_nd/ip6_nd.ba.go @@ -0,0 +1,405 @@ +// Code generated by GoVPP's binapi-generator. DO NOT EDIT. +// source: /usr/share/vpp/api/core/ip6_nd.api.json + +/* +Package ip6_nd is a generated VPP binary API for 'ip6_nd' module. + +It consists of: + 10 enums + 6 aliases + 7 types + 1 union + 13 messages + 6 services +*/ +package ip6_nd + +import ( + "bytes" + "context" + "io" + "strconv" + + api "git.fd.io/govpp.git/api" + struc "github.com/lunixbochs/struc" + + interface_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/interface_types" + ip_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip_types" +) + +const ( + // ModuleName is the name of this module. + ModuleName = "ip6_nd" + // APIVersion is the API version of this module. + APIVersion = "1.0.0" + // VersionCrc is the CRC of this module. + VersionCrc = 0x877c10de +) + +type AddressFamily = ip_types.AddressFamily + +type IfStatusFlags = interface_types.IfStatusFlags + +type IfType = interface_types.IfType + +type IPDscp = ip_types.IPDscp + +type IPEcn = ip_types.IPEcn + +type IPProto = ip_types.IPProto + +type LinkDuplex = interface_types.LinkDuplex + +type MtuProto = interface_types.MtuProto + +type RxMode = interface_types.RxMode + +type SubIfFlags = interface_types.SubIfFlags + +type AddressWithPrefix = ip_types.AddressWithPrefix + +type InterfaceIndex = interface_types.InterfaceIndex + +type IP4Address = ip_types.IP4Address + +type IP4AddressWithPrefix = ip_types.IP4AddressWithPrefix + +type IP6Address = ip_types.IP6Address + +type IP6AddressWithPrefix = ip_types.IP6AddressWithPrefix + +type Address = ip_types.Address + +type IP4Prefix = ip_types.IP4Prefix + +type IP6Prefix = ip_types.IP6Prefix + +// IP6RaPrefixInfo represents VPP binary API type 'ip6_ra_prefix_info'. +type IP6RaPrefixInfo struct { + Prefix Prefix + Flags uint8 + ValidTime uint32 + PreferredTime uint32 +} + +func (*IP6RaPrefixInfo) GetTypeName() string { return "ip6_ra_prefix_info" } + +type Mprefix = ip_types.Mprefix + +type Prefix = ip_types.Prefix + +type PrefixMatcher = ip_types.PrefixMatcher + +type AddressUnion = ip_types.AddressUnion + +// IP6RaEvent represents VPP binary API message 'ip6_ra_event'. +type IP6RaEvent struct { + PID uint32 + SwIfIndex InterfaceIndex + RouterAddr IP6Address + CurrentHopLimit uint8 + Flags uint8 + RouterLifetimeInSec uint16 + NeighborReachableTimeInMsec uint32 + TimeInMsecBetweenRetransmittedNeighborSolicitations uint32 + NPrefixes uint32 `struc:"sizeof=Prefixes"` + Prefixes []IP6RaPrefixInfo +} + +func (m *IP6RaEvent) Reset() { *m = IP6RaEvent{} } +func (*IP6RaEvent) GetMessageName() string { return "ip6_ra_event" } +func (*IP6RaEvent) GetCrcString() string { return "47e8cfbe" } +func (*IP6RaEvent) GetMessageType() api.MessageType { return api.EventMessage } + +// IP6ndProxyAddDel represents VPP binary API message 'ip6nd_proxy_add_del'. +type IP6ndProxyAddDel struct { + SwIfIndex InterfaceIndex + IsAdd bool + IP IP6Address +} + +func (m *IP6ndProxyAddDel) Reset() { *m = IP6ndProxyAddDel{} } +func (*IP6ndProxyAddDel) GetMessageName() string { return "ip6nd_proxy_add_del" } +func (*IP6ndProxyAddDel) GetCrcString() string { return "3fdf6659" } +func (*IP6ndProxyAddDel) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndProxyAddDelReply represents VPP binary API message 'ip6nd_proxy_add_del_reply'. +type IP6ndProxyAddDelReply struct { + Retval int32 +} + +func (m *IP6ndProxyAddDelReply) Reset() { *m = IP6ndProxyAddDelReply{} } +func (*IP6ndProxyAddDelReply) GetMessageName() string { return "ip6nd_proxy_add_del_reply" } +func (*IP6ndProxyAddDelReply) GetCrcString() string { return "e8d4e804" } +func (*IP6ndProxyAddDelReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// IP6ndProxyDetails represents VPP binary API message 'ip6nd_proxy_details'. +type IP6ndProxyDetails struct { + SwIfIndex InterfaceIndex + IP IP6Address +} + +func (m *IP6ndProxyDetails) Reset() { *m = IP6ndProxyDetails{} } +func (*IP6ndProxyDetails) GetMessageName() string { return "ip6nd_proxy_details" } +func (*IP6ndProxyDetails) GetCrcString() string { return "d35be8ff" } +func (*IP6ndProxyDetails) GetMessageType() api.MessageType { return api.ReplyMessage } + +// IP6ndProxyDump represents VPP binary API message 'ip6nd_proxy_dump'. +type IP6ndProxyDump struct{} + +func (m *IP6ndProxyDump) Reset() { *m = IP6ndProxyDump{} } +func (*IP6ndProxyDump) GetMessageName() string { return "ip6nd_proxy_dump" } +func (*IP6ndProxyDump) GetCrcString() string { return "51077d14" } +func (*IP6ndProxyDump) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndSendRouterSolicitation represents VPP binary API message 'ip6nd_send_router_solicitation'. +type IP6ndSendRouterSolicitation struct { + Irt uint32 + Mrt uint32 + Mrc uint32 + Mrd uint32 + SwIfIndex InterfaceIndex + Stop bool +} + +func (m *IP6ndSendRouterSolicitation) Reset() { *m = IP6ndSendRouterSolicitation{} } +func (*IP6ndSendRouterSolicitation) GetMessageName() string { return "ip6nd_send_router_solicitation" } +func (*IP6ndSendRouterSolicitation) GetCrcString() string { return "e5de609c" } +func (*IP6ndSendRouterSolicitation) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6ndSendRouterSolicitationReply represents VPP binary API message 'ip6nd_send_router_solicitation_reply'. +type IP6ndSendRouterSolicitationReply struct { + Retval int32 +} + +func (m *IP6ndSendRouterSolicitationReply) Reset() { *m = IP6ndSendRouterSolicitationReply{} } +func (*IP6ndSendRouterSolicitationReply) GetMessageName() string { + return "ip6nd_send_router_solicitation_reply" +} +func (*IP6ndSendRouterSolicitationReply) GetCrcString() string { return "e8d4e804" } +func (*IP6ndSendRouterSolicitationReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// SwInterfaceIP6ndRaConfig represents VPP binary API message 'sw_interface_ip6nd_ra_config'. +type SwInterfaceIP6ndRaConfig struct { + SwIfIndex InterfaceIndex + Suppress uint8 + Managed uint8 + Other uint8 + LlOption uint8 + SendUnicast uint8 + Cease uint8 + IsNo bool + DefaultRouter uint8 + MaxInterval uint32 + MinInterval uint32 + Lifetime uint32 + InitialCount uint32 + InitialInterval uint32 +} + +func (m *SwInterfaceIP6ndRaConfig) Reset() { *m = SwInterfaceIP6ndRaConfig{} } +func (*SwInterfaceIP6ndRaConfig) GetMessageName() string { return "sw_interface_ip6nd_ra_config" } +func (*SwInterfaceIP6ndRaConfig) GetCrcString() string { return "3eb00b1c" } +func (*SwInterfaceIP6ndRaConfig) GetMessageType() api.MessageType { return api.RequestMessage } + +// SwInterfaceIP6ndRaConfigReply represents VPP binary API message 'sw_interface_ip6nd_ra_config_reply'. +type SwInterfaceIP6ndRaConfigReply struct { + Retval int32 +} + +func (m *SwInterfaceIP6ndRaConfigReply) Reset() { *m = SwInterfaceIP6ndRaConfigReply{} } +func (*SwInterfaceIP6ndRaConfigReply) GetMessageName() string { + return "sw_interface_ip6nd_ra_config_reply" +} +func (*SwInterfaceIP6ndRaConfigReply) GetCrcString() string { return "e8d4e804" } +func (*SwInterfaceIP6ndRaConfigReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// SwInterfaceIP6ndRaPrefix represents VPP binary API message 'sw_interface_ip6nd_ra_prefix'. +type SwInterfaceIP6ndRaPrefix struct { + SwIfIndex InterfaceIndex + Prefix Prefix + UseDefault bool + NoAdvertise bool + OffLink bool + NoAutoconfig bool + NoOnlink bool + IsNo bool + ValLifetime uint32 + PrefLifetime uint32 +} + +func (m *SwInterfaceIP6ndRaPrefix) Reset() { *m = SwInterfaceIP6ndRaPrefix{} } +func (*SwInterfaceIP6ndRaPrefix) GetMessageName() string { return "sw_interface_ip6nd_ra_prefix" } +func (*SwInterfaceIP6ndRaPrefix) GetCrcString() string { return "e098785f" } +func (*SwInterfaceIP6ndRaPrefix) GetMessageType() api.MessageType { return api.RequestMessage } + +// SwInterfaceIP6ndRaPrefixReply represents VPP binary API message 'sw_interface_ip6nd_ra_prefix_reply'. +type SwInterfaceIP6ndRaPrefixReply struct { + Retval int32 +} + +func (m *SwInterfaceIP6ndRaPrefixReply) Reset() { *m = SwInterfaceIP6ndRaPrefixReply{} } +func (*SwInterfaceIP6ndRaPrefixReply) GetMessageName() string { + return "sw_interface_ip6nd_ra_prefix_reply" +} +func (*SwInterfaceIP6ndRaPrefixReply) GetCrcString() string { return "e8d4e804" } +func (*SwInterfaceIP6ndRaPrefixReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +// WantIP6RaEvents represents VPP binary API message 'want_ip6_ra_events'. +type WantIP6RaEvents struct { + Enable bool + PID uint32 +} + +func (m *WantIP6RaEvents) Reset() { *m = WantIP6RaEvents{} } +func (*WantIP6RaEvents) GetMessageName() string { return "want_ip6_ra_events" } +func (*WantIP6RaEvents) GetCrcString() string { return "3ec6d6c2" } +func (*WantIP6RaEvents) GetMessageType() api.MessageType { return api.RequestMessage } + +// WantIP6RaEventsReply represents VPP binary API message 'want_ip6_ra_events_reply'. +type WantIP6RaEventsReply struct { + Retval int32 +} + +func (m *WantIP6RaEventsReply) Reset() { *m = WantIP6RaEventsReply{} } +func (*WantIP6RaEventsReply) GetMessageName() string { return "want_ip6_ra_events_reply" } +func (*WantIP6RaEventsReply) GetCrcString() string { return "e8d4e804" } +func (*WantIP6RaEventsReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +func init() { + api.RegisterMessage((*IP6RaEvent)(nil), "ip6_nd.IP6RaEvent") + api.RegisterMessage((*IP6ndProxyAddDel)(nil), "ip6_nd.IP6ndProxyAddDel") + api.RegisterMessage((*IP6ndProxyAddDelReply)(nil), "ip6_nd.IP6ndProxyAddDelReply") + api.RegisterMessage((*IP6ndProxyDetails)(nil), "ip6_nd.IP6ndProxyDetails") + api.RegisterMessage((*IP6ndProxyDump)(nil), "ip6_nd.IP6ndProxyDump") + api.RegisterMessage((*IP6ndSendRouterSolicitation)(nil), "ip6_nd.IP6ndSendRouterSolicitation") + api.RegisterMessage((*IP6ndSendRouterSolicitationReply)(nil), "ip6_nd.IP6ndSendRouterSolicitationReply") + api.RegisterMessage((*SwInterfaceIP6ndRaConfig)(nil), "ip6_nd.SwInterfaceIP6ndRaConfig") + api.RegisterMessage((*SwInterfaceIP6ndRaConfigReply)(nil), "ip6_nd.SwInterfaceIP6ndRaConfigReply") + api.RegisterMessage((*SwInterfaceIP6ndRaPrefix)(nil), "ip6_nd.SwInterfaceIP6ndRaPrefix") + api.RegisterMessage((*SwInterfaceIP6ndRaPrefixReply)(nil), "ip6_nd.SwInterfaceIP6ndRaPrefixReply") + api.RegisterMessage((*WantIP6RaEvents)(nil), "ip6_nd.WantIP6RaEvents") + api.RegisterMessage((*WantIP6RaEventsReply)(nil), "ip6_nd.WantIP6RaEventsReply") +} + +// Messages returns list of all messages in this module. +func AllMessages() []api.Message { + return []api.Message{ + (*IP6RaEvent)(nil), + (*IP6ndProxyAddDel)(nil), + (*IP6ndProxyAddDelReply)(nil), + (*IP6ndProxyDetails)(nil), + (*IP6ndProxyDump)(nil), + (*IP6ndSendRouterSolicitation)(nil), + (*IP6ndSendRouterSolicitationReply)(nil), + (*SwInterfaceIP6ndRaConfig)(nil), + (*SwInterfaceIP6ndRaConfigReply)(nil), + (*SwInterfaceIP6ndRaPrefix)(nil), + (*SwInterfaceIP6ndRaPrefixReply)(nil), + (*WantIP6RaEvents)(nil), + (*WantIP6RaEventsReply)(nil), + } +} + +// RPCService represents RPC service API for ip6_nd module. +type RPCService interface { + DumpIP6ndProxy(ctx context.Context, in *IP6ndProxyDump) (RPCService_DumpIP6ndProxyClient, error) + IP6ndProxyAddDel(ctx context.Context, in *IP6ndProxyAddDel) (*IP6ndProxyAddDelReply, error) + IP6ndSendRouterSolicitation(ctx context.Context, in *IP6ndSendRouterSolicitation) (*IP6ndSendRouterSolicitationReply, error) + SwInterfaceIP6ndRaConfig(ctx context.Context, in *SwInterfaceIP6ndRaConfig) (*SwInterfaceIP6ndRaConfigReply, error) + SwInterfaceIP6ndRaPrefix(ctx context.Context, in *SwInterfaceIP6ndRaPrefix) (*SwInterfaceIP6ndRaPrefixReply, error) + WantIP6RaEvents(ctx context.Context, in *WantIP6RaEvents) (*WantIP6RaEventsReply, error) +} + +type serviceClient struct { + ch api.Channel +} + +func NewServiceClient(ch api.Channel) RPCService { + return &serviceClient{ch} +} + +func (c *serviceClient) DumpIP6ndProxy(ctx context.Context, in *IP6ndProxyDump) (RPCService_DumpIP6ndProxyClient, error) { + stream := c.ch.SendMultiRequest(in) + x := &serviceClient_DumpIP6ndProxyClient{stream} + return x, nil +} + +type RPCService_DumpIP6ndProxyClient interface { + Recv() (*IP6ndProxyDetails, error) +} + +type serviceClient_DumpIP6ndProxyClient struct { + api.MultiRequestCtx +} + +func (c *serviceClient_DumpIP6ndProxyClient) Recv() (*IP6ndProxyDetails, error) { + m := new(IP6ndProxyDetails) + stop, err := c.MultiRequestCtx.ReceiveReply(m) + if err != nil { + return nil, err + } + if stop { + return nil, io.EOF + } + return m, nil +} + +func (c *serviceClient) IP6ndProxyAddDel(ctx context.Context, in *IP6ndProxyAddDel) (*IP6ndProxyAddDelReply, error) { + out := new(IP6ndProxyAddDelReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) IP6ndSendRouterSolicitation(ctx context.Context, in *IP6ndSendRouterSolicitation) (*IP6ndSendRouterSolicitationReply, error) { + out := new(IP6ndSendRouterSolicitationReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) SwInterfaceIP6ndRaConfig(ctx context.Context, in *SwInterfaceIP6ndRaConfig) (*SwInterfaceIP6ndRaConfigReply, error) { + out := new(SwInterfaceIP6ndRaConfigReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) SwInterfaceIP6ndRaPrefix(ctx context.Context, in *SwInterfaceIP6ndRaPrefix) (*SwInterfaceIP6ndRaPrefixReply, error) { + out := new(SwInterfaceIP6ndRaPrefixReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *serviceClient) WantIP6RaEvents(ctx context.Context, in *WantIP6RaEvents) (*WantIP6RaEventsReply, error) { + out := new(WantIP6RaEventsReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the GoVPP api package it is being compiled against. +// A compilation error at this line likely means your copy of the +// GoVPP api package needs to be updated. +const _ = api.GoVppAPIPackageIsVersion1 // please upgrade the GoVPP api package + +// Reference imports to suppress errors if they are not otherwise used. +var _ = api.RegisterMessage +var _ = bytes.NewBuffer +var _ = context.Background +var _ = io.Copy +var _ = strconv.Itoa +var _ = struc.Pack diff --git a/plugins/vpp/binapi/vpp2005/rd_cp/rd_cp.ba.go b/plugins/vpp/binapi/vpp2005/rd_cp/rd_cp.ba.go new file mode 100644 index 0000000000..921cc00637 --- /dev/null +++ b/plugins/vpp/binapi/vpp2005/rd_cp/rd_cp.ba.go @@ -0,0 +1,119 @@ +// Code generated by GoVPP's binapi-generator. DO NOT EDIT. +// source: /usr/share/vpp/api/core/rd_cp.api.json + +/* +Package rd_cp is a generated VPP binary API for 'rd_cp' module. + +It consists of: + 6 enums + 1 alias + 2 messages + 1 service +*/ +package rd_cp + +import ( + "bytes" + "context" + "io" + "strconv" + + api "git.fd.io/govpp.git/api" + struc "github.com/lunixbochs/struc" + + interface_types "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/interface_types" +) + +const ( + // ModuleName is the name of this module. + ModuleName = "rd_cp" + // APIVersion is the API version of this module. + APIVersion = "1.0.1" + // VersionCrc is the CRC of this module. + VersionCrc = 0x2caa616 +) + +type IfStatusFlags = interface_types.IfStatusFlags + +type IfType = interface_types.IfType + +type LinkDuplex = interface_types.LinkDuplex + +type MtuProto = interface_types.MtuProto + +type RxMode = interface_types.RxMode + +type SubIfFlags = interface_types.SubIfFlags + +type InterfaceIndex = interface_types.InterfaceIndex + +// IP6NdAddressAutoconfig represents VPP binary API message 'ip6_nd_address_autoconfig'. +type IP6NdAddressAutoconfig struct { + SwIfIndex InterfaceIndex + Enable bool + InstallDefaultRoutes bool +} + +func (m *IP6NdAddressAutoconfig) Reset() { *m = IP6NdAddressAutoconfig{} } +func (*IP6NdAddressAutoconfig) GetMessageName() string { return "ip6_nd_address_autoconfig" } +func (*IP6NdAddressAutoconfig) GetCrcString() string { return "9e14a4a7" } +func (*IP6NdAddressAutoconfig) GetMessageType() api.MessageType { return api.RequestMessage } + +// IP6NdAddressAutoconfigReply represents VPP binary API message 'ip6_nd_address_autoconfig_reply'. +type IP6NdAddressAutoconfigReply struct { + Retval int32 +} + +func (m *IP6NdAddressAutoconfigReply) Reset() { *m = IP6NdAddressAutoconfigReply{} } +func (*IP6NdAddressAutoconfigReply) GetMessageName() string { return "ip6_nd_address_autoconfig_reply" } +func (*IP6NdAddressAutoconfigReply) GetCrcString() string { return "e8d4e804" } +func (*IP6NdAddressAutoconfigReply) GetMessageType() api.MessageType { return api.ReplyMessage } + +func init() { + api.RegisterMessage((*IP6NdAddressAutoconfig)(nil), "rd_cp.IP6NdAddressAutoconfig") + api.RegisterMessage((*IP6NdAddressAutoconfigReply)(nil), "rd_cp.IP6NdAddressAutoconfigReply") +} + +// Messages returns list of all messages in this module. +func AllMessages() []api.Message { + return []api.Message{ + (*IP6NdAddressAutoconfig)(nil), + (*IP6NdAddressAutoconfigReply)(nil), + } +} + +// RPCService represents RPC service API for rd_cp module. +type RPCService interface { + IP6NdAddressAutoconfig(ctx context.Context, in *IP6NdAddressAutoconfig) (*IP6NdAddressAutoconfigReply, error) +} + +type serviceClient struct { + ch api.Channel +} + +func NewServiceClient(ch api.Channel) RPCService { + return &serviceClient{ch} +} + +func (c *serviceClient) IP6NdAddressAutoconfig(ctx context.Context, in *IP6NdAddressAutoconfig) (*IP6NdAddressAutoconfigReply, error) { + out := new(IP6NdAddressAutoconfigReply) + err := c.ch.SendRequest(in).ReceiveReply(out) + if err != nil { + return nil, err + } + return out, nil +} + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the GoVPP api package it is being compiled against. +// A compilation error at this line likely means your copy of the +// GoVPP api package needs to be updated. +const _ = api.GoVppAPIPackageIsVersion1 // please upgrade the GoVPP api package + +// Reference imports to suppress errors if they are not otherwise used. +var _ = api.RegisterMessage +var _ = bytes.NewBuffer +var _ = context.Background +var _ = io.Copy +var _ = strconv.Itoa +var _ = struc.Pack diff --git a/plugins/vpp/binapi/vpp2005/vpp2005.go b/plugins/vpp/binapi/vpp2005/vpp2005.go index 77b9d48cb2..e8a74bb66c 100644 --- a/plugins/vpp/binapi/vpp2005/vpp2005.go +++ b/plugins/vpp/binapi/vpp2005/vpp2005.go @@ -17,10 +17,10 @@ package vpp2005 import ( "go.ligato.io/vpp-agent/v3/plugins/vpp" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi" - "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/abf" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/acl" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/af_packet" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/arp" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/bond" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/dhcp" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/flowprobe" @@ -28,6 +28,8 @@ import ( "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/gtpu" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/interfaces" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip6_nd" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip_neighbor" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ipfix_export" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ipip" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ipsec" @@ -37,6 +39,7 @@ import ( "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/memif" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/nat" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/punt" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/rd_cp" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/span" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/sr" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/stn" @@ -55,15 +58,20 @@ func init() { binapi.Versions[Version] = binapi.VersionMsgs{ Core: vpp.Messages( af_packet.AllMessages, + arp.AllMessages, bond.AllMessages, gre.AllMessages, interfaces.AllMessages, ip.AllMessages, - ipsec.AllMessages, + ip6_nd.AllMessages, + ip_neighbor.AllMessages, ipfix_export.AllMessages, + ipip.AllMessages, + ipsec.AllMessages, l2.AllMessages, memclnt.AllMessages, punt.AllMessages, + rd_cp.AllMessages, span.AllMessages, sr.AllMessages, tapv2.AllMessages, @@ -71,7 +79,6 @@ func init() { vpe.AllMessages, vxlan.AllMessages, vxlan_gpe.AllMessages, - ipip.AllMessages, ), Plugins: vpp.Messages( abf.AllMessages, @@ -103,12 +110,15 @@ func init() { //go:generate binapigen --input-file=$VPP_API_DIR/core/gre.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/interface.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/ip.api.json +//go:generate binapigen --input-file=$VPP_API_DIR/core/ip6_nd.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/ip_neighbor.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/ipfix_export.api.json +//go:generate binapigen --input-file=$VPP_API_DIR/core/ipip.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/ipsec.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/l2.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/memclnt.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/punt.api.json +//go:generate binapigen --input-file=$VPP_API_DIR/core/rd_cp.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/span.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/sr.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/tapv2.api.json @@ -116,12 +126,11 @@ func init() { //go:generate binapigen --input-file=$VPP_API_DIR/core/vpe.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/vxlan.api.json //go:generate binapigen --input-file=$VPP_API_DIR/core/vxlan_gpe.api.json -//go:generate binapigen --input-file=$VPP_API_DIR/core/ipip.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/abf.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/acl.api.json -//go:generate binapigen --input-file=$VPP_API_DIR/plugins/gtpu.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/dhcp.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/flowprobe.api.json +//go:generate binapigen --input-file=$VPP_API_DIR/plugins/gtpu.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/l3xc.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/memif.api.json //go:generate binapigen --input-file=$VPP_API_DIR/plugins/nat.api.json diff --git a/plugins/vpp/ifplugin/descriptor/adapter/ip6nd.go b/plugins/vpp/ifplugin/descriptor/adapter/ip6nd.go new file mode 100644 index 0000000000..8d1ce8b8f3 --- /dev/null +++ b/plugins/vpp/ifplugin/descriptor/adapter/ip6nd.go @@ -0,0 +1,233 @@ +// Code generated by adapter-generator. DO NOT EDIT. + +package adapter + +import ( + "github.com/golang/protobuf/proto" + . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" +) + +////////// type-safe key-value pair with metadata ////////// + +type IP6NDKVWithMetadata struct { + Key string + Value *vpp_interfaces.Interface_IP6ND + Metadata interface{} + Origin ValueOrigin +} + +////////// type-safe Descriptor structure ////////// + +type IP6NDDescriptor struct { + Name string + KeySelector KeySelector + ValueTypeName string + KeyLabel func(key string) string + ValueComparator func(key string, oldValue, newValue *vpp_interfaces.Interface_IP6ND) bool + NBKeyPrefix string + WithMetadata bool + MetadataMapFactory MetadataMapFactory + Validate func(key string, value *vpp_interfaces.Interface_IP6ND) error + Create func(key string, value *vpp_interfaces.Interface_IP6ND) (metadata interface{}, err error) + Delete func(key string, value *vpp_interfaces.Interface_IP6ND, metadata interface{}) error + Update func(key string, oldValue, newValue *vpp_interfaces.Interface_IP6ND, oldMetadata interface{}) (newMetadata interface{}, err error) + UpdateWithRecreate func(key string, oldValue, newValue *vpp_interfaces.Interface_IP6ND, metadata interface{}) bool + Retrieve func(correlate []IP6NDKVWithMetadata) ([]IP6NDKVWithMetadata, error) + IsRetriableFailure func(err error) bool + DerivedValues func(key string, value *vpp_interfaces.Interface_IP6ND) []KeyValuePair + Dependencies func(key string, value *vpp_interfaces.Interface_IP6ND) []Dependency + RetrieveDependencies []string /* descriptor name */ +} + +////////// Descriptor adapter ////////// + +type IP6NDDescriptorAdapter struct { + descriptor *IP6NDDescriptor +} + +func NewIP6NDDescriptor(typedDescriptor *IP6NDDescriptor) *KVDescriptor { + adapter := &IP6NDDescriptorAdapter{descriptor: typedDescriptor} + descriptor := &KVDescriptor{ + Name: typedDescriptor.Name, + KeySelector: typedDescriptor.KeySelector, + ValueTypeName: typedDescriptor.ValueTypeName, + KeyLabel: typedDescriptor.KeyLabel, + NBKeyPrefix: typedDescriptor.NBKeyPrefix, + WithMetadata: typedDescriptor.WithMetadata, + MetadataMapFactory: typedDescriptor.MetadataMapFactory, + IsRetriableFailure: typedDescriptor.IsRetriableFailure, + RetrieveDependencies: typedDescriptor.RetrieveDependencies, + } + if typedDescriptor.ValueComparator != nil { + descriptor.ValueComparator = adapter.ValueComparator + } + if typedDescriptor.Validate != nil { + descriptor.Validate = adapter.Validate + } + if typedDescriptor.Create != nil { + descriptor.Create = adapter.Create + } + if typedDescriptor.Delete != nil { + descriptor.Delete = adapter.Delete + } + if typedDescriptor.Update != nil { + descriptor.Update = adapter.Update + } + if typedDescriptor.UpdateWithRecreate != nil { + descriptor.UpdateWithRecreate = adapter.UpdateWithRecreate + } + if typedDescriptor.Retrieve != nil { + descriptor.Retrieve = adapter.Retrieve + } + if typedDescriptor.Dependencies != nil { + descriptor.Dependencies = adapter.Dependencies + } + if typedDescriptor.DerivedValues != nil { + descriptor.DerivedValues = adapter.DerivedValues + } + return descriptor +} + +func (da *IP6NDDescriptorAdapter) ValueComparator(key string, oldValue, newValue proto.Message) bool { + typedOldValue, err1 := castIP6NDValue(key, oldValue) + typedNewValue, err2 := castIP6NDValue(key, newValue) + if err1 != nil || err2 != nil { + return false + } + return da.descriptor.ValueComparator(key, typedOldValue, typedNewValue) +} + +func (da *IP6NDDescriptorAdapter) Validate(key string, value proto.Message) (err error) { + typedValue, err := castIP6NDValue(key, value) + if err != nil { + return err + } + return da.descriptor.Validate(key, typedValue) +} + +func (da *IP6NDDescriptorAdapter) Create(key string, value proto.Message) (metadata Metadata, err error) { + typedValue, err := castIP6NDValue(key, value) + if err != nil { + return nil, err + } + return da.descriptor.Create(key, typedValue) +} + +func (da *IP6NDDescriptorAdapter) Update(key string, oldValue, newValue proto.Message, oldMetadata Metadata) (newMetadata Metadata, err error) { + oldTypedValue, err := castIP6NDValue(key, oldValue) + if err != nil { + return nil, err + } + newTypedValue, err := castIP6NDValue(key, newValue) + if err != nil { + return nil, err + } + typedOldMetadata, err := castIP6NDMetadata(key, oldMetadata) + if err != nil { + return nil, err + } + return da.descriptor.Update(key, oldTypedValue, newTypedValue, typedOldMetadata) +} + +func (da *IP6NDDescriptorAdapter) Delete(key string, value proto.Message, metadata Metadata) error { + typedValue, err := castIP6NDValue(key, value) + if err != nil { + return err + } + typedMetadata, err := castIP6NDMetadata(key, metadata) + if err != nil { + return err + } + return da.descriptor.Delete(key, typedValue, typedMetadata) +} + +func (da *IP6NDDescriptorAdapter) UpdateWithRecreate(key string, oldValue, newValue proto.Message, metadata Metadata) bool { + oldTypedValue, err := castIP6NDValue(key, oldValue) + if err != nil { + return true + } + newTypedValue, err := castIP6NDValue(key, newValue) + if err != nil { + return true + } + typedMetadata, err := castIP6NDMetadata(key, metadata) + if err != nil { + return true + } + return da.descriptor.UpdateWithRecreate(key, oldTypedValue, newTypedValue, typedMetadata) +} + +func (da *IP6NDDescriptorAdapter) Retrieve(correlate []KVWithMetadata) ([]KVWithMetadata, error) { + var correlateWithType []IP6NDKVWithMetadata + for _, kvpair := range correlate { + typedValue, err := castIP6NDValue(kvpair.Key, kvpair.Value) + if err != nil { + continue + } + typedMetadata, err := castIP6NDMetadata(kvpair.Key, kvpair.Metadata) + if err != nil { + continue + } + correlateWithType = append(correlateWithType, + IP6NDKVWithMetadata{ + Key: kvpair.Key, + Value: typedValue, + Metadata: typedMetadata, + Origin: kvpair.Origin, + }) + } + + typedValues, err := da.descriptor.Retrieve(correlateWithType) + if err != nil { + return nil, err + } + var values []KVWithMetadata + for _, typedKVWithMetadata := range typedValues { + kvWithMetadata := KVWithMetadata{ + Key: typedKVWithMetadata.Key, + Metadata: typedKVWithMetadata.Metadata, + Origin: typedKVWithMetadata.Origin, + } + kvWithMetadata.Value = typedKVWithMetadata.Value + values = append(values, kvWithMetadata) + } + return values, err +} + +func (da *IP6NDDescriptorAdapter) DerivedValues(key string, value proto.Message) []KeyValuePair { + typedValue, err := castIP6NDValue(key, value) + if err != nil { + return nil + } + return da.descriptor.DerivedValues(key, typedValue) +} + +func (da *IP6NDDescriptorAdapter) Dependencies(key string, value proto.Message) []Dependency { + typedValue, err := castIP6NDValue(key, value) + if err != nil { + return nil + } + return da.descriptor.Dependencies(key, typedValue) +} + +////////// Helper methods ////////// + +func castIP6NDValue(key string, value proto.Message) (*vpp_interfaces.Interface_IP6ND, error) { + typedValue, ok := value.(*vpp_interfaces.Interface_IP6ND) + if !ok { + return nil, ErrInvalidValueType(key, value) + } + return typedValue, nil +} + +func castIP6NDMetadata(key string, metadata Metadata) (interface{}, error) { + if metadata == nil { + return nil, nil + } + typedMetadata, ok := metadata.(interface{}) + if !ok { + return nil, ErrInvalidMetadataType(key) + } + return typedMetadata, nil +} diff --git a/plugins/vpp/ifplugin/descriptor/interface.go b/plugins/vpp/ifplugin/descriptor/interface.go index 5a25b85739..9f599e19df 100644 --- a/plugins/vpp/ifplugin/descriptor/interface.go +++ b/plugins/vpp/ifplugin/descriptor/interface.go @@ -273,6 +273,9 @@ func (d *InterfaceDescriptor) EquivalentInterfaces(key string, oldIntf, newIntf if !proto.Equal(oldIntf.Unnumbered, newIntf.Unnumbered) { return false } + if !proto.Equal(oldIntf.Ip6Nd, newIntf.Ip6Nd) { + return false + } // type-specific (defaults considered) if !d.equivalentTypeSpecificConfig(oldIntf, newIntf) { @@ -809,6 +812,14 @@ func (d *InterfaceDescriptor) DerivedValues(key string, intf *interfaces.Interfa }) } + // IP6ND config + if intf.GetIp6Nd() != nil { + derValues = append(derValues, kvs.KeyValuePair{ + Key: interfaces.IP6NDKey(intf.Name), + Value: intf.GetIp6Nd(), + }) + } + // IP addresses for _, ipAddr := range intf.IpAddresses { derValues = append(derValues, kvs.KeyValuePair{ diff --git a/plugins/vpp/ifplugin/descriptor/interface_address.go b/plugins/vpp/ifplugin/descriptor/interface_address.go index a158b7a993..1f51607302 100644 --- a/plugins/vpp/ifplugin/descriptor/interface_address.go +++ b/plugins/vpp/ifplugin/descriptor/interface_address.go @@ -64,7 +64,7 @@ func NewInterfaceAddressDescriptor(ifHandler vppcalls.InterfaceVppAPI, addrAlloc } } -// IsInterfaceVrfKey returns true if the key represents assignment of an IP address +// IsInterfaceAddressKey returns true if the key represents assignment of an IP address // to a VPP interface (that needs to be applied). KVs representing addresses // already allocated from netalloc plugin or obtained from a DHCP server are // excluded. diff --git a/plugins/vpp/ifplugin/descriptor/ip6nd.go b/plugins/vpp/ifplugin/descriptor/ip6nd.go new file mode 100644 index 0000000000..2a094aea7c --- /dev/null +++ b/plugins/vpp/ifplugin/descriptor/ip6nd.go @@ -0,0 +1,137 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package descriptor + +import ( + "context" + + "github.com/go-errors/errors" + "go.ligato.io/cn-infra/v2/logging" + + kvs "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/descriptor/adapter" + "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" + "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" + interfaces "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" +) + +const ( + // IP6ndDescriptorName is the name of the descriptor. + IP6ndDescriptorName = "vpp-ip6nd" +) + +// IP6ndDescriptor instructs KVScheduler how to configure VPP IP6ND entries. +type IP6ndDescriptor struct { + log logging.Logger + handler vppcalls.IP6ndVppAPI + scheduler kvs.KVScheduler + ifIndex ifaceidx.IfaceMetadataIndex +} + +// NewIP6ndDescriptor creates a new instance of the IP6ndDescriptor. +func NewIP6ndDescriptor(scheduler kvs.KVScheduler, handler vppcalls.IP6ndVppAPI, + ifIndex ifaceidx.IfaceMetadataIndex, log logging.PluginLogger) *kvs.KVDescriptor { + + ctx := &IP6ndDescriptor{ + scheduler: scheduler, + handler: handler, + ifIndex: ifIndex, + log: log.NewLogger("ip6nd-descriptor"), + } + + typedDescr := &adapter.IP6NDDescriptor{ + Name: IP6ndDescriptorName, + KeySelector: ctx.IsIP6NDRelatedKey, + KeyLabel: ctx.InterfaceNameFromKey, + Create: ctx.Create, + Delete: ctx.Delete, + //Retrieve: ctx.Retrieve, + RetrieveDependencies: []string{InterfaceDescriptorName}, + } + return adapter.NewIP6NDDescriptor(typedDescr) +} + +// IsIP6NDRelatedKey returns true if the key is identifying IP6ND config (derived value) +func (d *IP6ndDescriptor) IsIP6NDRelatedKey(key string) bool { + if _, isValid := interfaces.ParseNameFromIP6NDKey(key); isValid { + return true + } + return false +} + +// InterfaceNameFromKey returns interface name from IP6ND-related key. +func (d *IP6ndDescriptor) InterfaceNameFromKey(key string) string { + if iface, isValid := interfaces.ParseNameFromIP6NDKey(key); isValid { + return iface + } + return key +} + +// Create adds a VPP IP6ND entry. +func (d *IP6ndDescriptor) Create(key string, entry *interfaces.Interface_IP6ND) (metadata interface{}, err error) { + ifName, _ := interfaces.ParseNameFromIP6NDKey(key) + ifMeta, found := d.ifIndex.LookupByName(ifName) + if !found { + err = errors.Errorf("failed to find IP6ND-enabled interface %s", ifName) + d.log.Error(err) + return nil, err + } + + if err := d.handler.SetIP6ndAutoconfig(context.Background(), ifMeta.SwIfIndex, entry.AddressAutoconfig, entry.InstallDefaultRoutes); err != nil { + err = errors.Errorf("failed to enable IP6ND for interface %s", ifName) + d.log.Error(err) + return nil, err + } + + return nil, err +} + +// Delete removes a VPP IP6ND entry. +func (d *IP6ndDescriptor) Delete(key string, entry *interfaces.Interface_IP6ND, metadata interface{}) (err error) { + ifName, _ := interfaces.ParseNameFromIP6NDKey(key) + ifMeta, found := d.ifIndex.LookupByName(ifName) + if !found { + err = errors.Errorf("failed to find IP6ND-enabled interface %s", ifName) + d.log.Error(err) + return err + } + + if err := d.handler.SetIP6ndAutoconfig(context.Background(), ifMeta.SwIfIndex, false, false); err != nil { + err = errors.Errorf("failed to disable IP6ND for interface %s", ifName) + d.log.Error(err) + return err + } + + return nil +} + +// Retrieve returns all IP6ND entries. +// TODO: implement retrieve +/*func (d *IP6ndDescriptor) Retrieve(correlate []adapter.IP6NDKVWithMetadata) ( + retrieved []adapter.IP6NDKVWithMetadata, err error, +) { + entries, err := d.handler.DumpIP6ND() + if err != nil { + return nil, err + } + for _, entry := range entries { + retrieved = append(retrieved, adapter.IP6NDKVWithMetadata{ + Key: models.Key(entry), + Value: entry, + Origin: kvs.UnknownOrigin, + }) + } + return +}*/ diff --git a/plugins/vpp/ifplugin/ifplugin.go b/plugins/vpp/ifplugin/ifplugin.go index 55a1d17387..df131cf8ae 100644 --- a/plugins/vpp/ifplugin/ifplugin.go +++ b/plugins/vpp/ifplugin/ifplugin.go @@ -18,6 +18,7 @@ //go:generate descriptor-adapter --descriptor-name RxPlacement --value-type *vpp_interfaces.Interface_RxPlacement --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" --output-dir "descriptor" //go:generate descriptor-adapter --descriptor-name BondedInterface --value-type *vpp_interfaces.BondLink_BondedInterface --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" --output-dir "descriptor" //go:generate descriptor-adapter --descriptor-name Span --value-type *vpp_interfaces.Span --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" --output-dir "descriptor" +//go:generate descriptor-adapter --descriptor-name IP6ND --value-type *vpp_interfaces.Interface_IP6ND --import "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/interfaces" --output-dir "descriptor" package ifplugin @@ -26,13 +27,12 @@ import ( "sync" "time" - "go.ligato.io/cn-infra/v2/servicelabel" - "github.com/pkg/errors" "go.ligato.io/cn-infra/v2/datasync" "go.ligato.io/cn-infra/v2/health/statuscheck" "go.ligato.io/cn-infra/v2/idxmap" "go.ligato.io/cn-infra/v2/infra" + "go.ligato.io/cn-infra/v2/servicelabel" "go.ligato.io/cn-infra/v2/utils/safeclose" "go.ligato.io/vpp-agent/v3/plugins/govppmux" @@ -182,6 +182,7 @@ func (p *IfPlugin) Init() (err error) { withAddrDescriptor := descriptor.NewInterfaceWithAddrDescriptor(p.Log) spanDescriptor, spanDescriptorCtx := descriptor.NewSpanDescriptor(p.ifHandler, p.Log) spanDescriptorCtx.SetInterfaceIndex(p.intfIndex) + ip6ndDescriptor := descriptor.NewIP6ndDescriptor(p.KVScheduler, p.ifHandler, p.intfIndex, p.Log) err = p.KVScheduler.RegisterKVDescriptor( dhcpDescriptor, @@ -194,6 +195,7 @@ func (p *IfPlugin) Init() (err error) { vrfDescriptor, withAddrDescriptor, spanDescriptor, + ip6ndDescriptor, ) if err != nil { return err diff --git a/plugins/vpp/ifplugin/vppcalls/interface_handler_api.go b/plugins/vpp/ifplugin/vppcalls/interface_handler_api.go index e5c41e5cd3..57fedd9902 100644 --- a/plugins/vpp/ifplugin/vppcalls/interface_handler_api.go +++ b/plugins/vpp/ifplugin/vppcalls/interface_handler_api.go @@ -122,6 +122,7 @@ type InterfaceVppAPI interface { MemifAPI Wmxnet3API + IP6ndVppAPI // AddAfPacketInterface calls AfPacketCreate VPP binary API. AddAfPacketInterface(ifName, hwAddr, targetHostIfName string) (swIndex uint32, err error) @@ -274,6 +275,11 @@ type InterfaceVppRead interface { WatchDHCPLeases(ctx context.Context, leases chan<- *Lease) error } +// IP6ndVppAPI provides methods for managing IPv6 ND configuration. +type IP6ndVppAPI interface { + SetIP6ndAutoconfig(ctx context.Context, ifIdx uint32, enable, installDefaultRoutes bool) error +} + var Handler = vpp.RegisterHandler(vpp.HandlerDesc{ Name: "interface", HandlerAPI: (*InterfaceVppAPI)(nil), diff --git a/plugins/vpp/ifplugin/vppcalls/vpp1904/ip6nd_vppcalls.go b/plugins/vpp/ifplugin/vppcalls/vpp1904/ip6nd_vppcalls.go new file mode 100644 index 0000000000..cce67ecaba --- /dev/null +++ b/plugins/vpp/ifplugin/vppcalls/vpp1904/ip6nd_vppcalls.go @@ -0,0 +1,24 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpp1904 + +import ( + "context" + "fmt" +) + +func (h *InterfaceVppHandler) SetIP6ndAutoconfig(ctx context.Context, ifIdx uint32, enable, installDefaultRoutes bool) error { + return fmt.Errorf("not supported for this VPP version") +} diff --git a/plugins/vpp/ifplugin/vppcalls/vpp1908/ip6nd_vppcalls.go b/plugins/vpp/ifplugin/vppcalls/vpp1908/ip6nd_vppcalls.go new file mode 100644 index 0000000000..6463cb5ac4 --- /dev/null +++ b/plugins/vpp/ifplugin/vppcalls/vpp1908/ip6nd_vppcalls.go @@ -0,0 +1,24 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpp1908 + +import ( + "context" + "fmt" +) + +func (h *InterfaceVppHandler) SetIP6ndAutoconfig(ctx context.Context, ifIdx uint32, enable, installDefaultRoutes bool) error { + return fmt.Errorf("not supported for this VPP version") +} diff --git a/plugins/vpp/ifplugin/vppcalls/vpp2001/ip6nd_vppcalls.go b/plugins/vpp/ifplugin/vppcalls/vpp2001/ip6nd_vppcalls.go new file mode 100644 index 0000000000..1ea558292f --- /dev/null +++ b/plugins/vpp/ifplugin/vppcalls/vpp2001/ip6nd_vppcalls.go @@ -0,0 +1,34 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpp2001 + +import ( + "context" + + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/interface_types" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/rd_cp" +) + +func (h *InterfaceVppHandler) SetIP6ndAutoconfig(ctx context.Context, ifIdx uint32, enable, installDefaultRoutes bool) error { + _, err := h.rpcRdCp.IP6NdAddressAutoconfig(ctx, &rd_cp.IP6NdAddressAutoconfig{ + SwIfIndex: interface_types.InterfaceIndex(ifIdx), + Enable: enable, + InstallDefaultRoutes: installDefaultRoutes, + }) + if err != nil { + return err + } + return nil +} diff --git a/plugins/vpp/ifplugin/vppcalls/vpp2001/vppcalls_handler.go b/plugins/vpp/ifplugin/vppcalls/vpp2001/vppcalls_handler.go index e6742a8177..27800cbc27 100644 --- a/plugins/vpp/ifplugin/vppcalls/vpp2001/vppcalls_handler.go +++ b/plugins/vpp/ifplugin/vppcalls/vpp2001/vppcalls_handler.go @@ -34,6 +34,8 @@ import ( "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/tapv2" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/vmxnet3" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/vxlan" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/ip6_nd" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2001/rd_cp" "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" ) @@ -81,6 +83,8 @@ type InterfaceVppHandler struct { gtpu gtpu.RPCService memif memif.RPCService vmxnet3 vmxnet3.RPCService + rpcIP6nd ip6_nd.RPCService + rpcRdCp rd_cp.RPCService log logging.Logger } @@ -94,6 +98,8 @@ func NewInterfaceVppHandler(c vpp.Client, log logging.Logger) vppcalls.Interface callsChannel: ch, interfaces: interfaces.NewServiceClient(ch), ipsec: ipsec.NewServiceClient(ch), + rpcIP6nd: ip6_nd.NewServiceClient(ch), + rpcRdCp: rd_cp.NewServiceClient(ch), log: log, } if c.IsPluginLoaded(gtpu.ModuleName) { diff --git a/plugins/vpp/ifplugin/vppcalls/vpp2005/dump_interface_vppcalls.go b/plugins/vpp/ifplugin/vppcalls/vpp2005/dump_interface_vppcalls.go index 10daef613f..e2b53b509e 100644 --- a/plugins/vpp/ifplugin/vppcalls/vpp2005/dump_interface_vppcalls.go +++ b/plugins/vpp/ifplugin/vppcalls/vpp2005/dump_interface_vppcalls.go @@ -169,6 +169,7 @@ func (h *InterfaceVppHandler) dumpInterfaces(ifIdxs ...uint32) (map[uint32]*vppc } func (h *InterfaceVppHandler) DumpInterfaces(ctx context.Context) (map[uint32]*vppcalls.InterfaceDetails, error) { + // Dump all interfaces interfaces, err := h.dumpInterfaces() if err != nil { return nil, err diff --git a/plugins/vpp/ifplugin/vppcalls/vpp2005/ip6nd_vppcalls.go b/plugins/vpp/ifplugin/vppcalls/vpp2005/ip6nd_vppcalls.go new file mode 100644 index 0000000000..f8a07f3bfc --- /dev/null +++ b/plugins/vpp/ifplugin/vppcalls/vpp2005/ip6nd_vppcalls.go @@ -0,0 +1,34 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpp2005 + +import ( + "context" + + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/interface_types" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/rd_cp" +) + +func (h *InterfaceVppHandler) SetIP6ndAutoconfig(ctx context.Context, ifIdx uint32, enable, installDefaultRoutes bool) error { + _, err := h.rpcRdCp.IP6NdAddressAutoconfig(ctx, &rd_cp.IP6NdAddressAutoconfig{ + SwIfIndex: interface_types.InterfaceIndex(ifIdx), + Enable: enable, + InstallDefaultRoutes: installDefaultRoutes, + }) + if err != nil { + return err + } + return nil +} diff --git a/plugins/vpp/ifplugin/vppcalls/vpp2005/vppcalls_handler.go b/plugins/vpp/ifplugin/vppcalls/vpp2005/vppcalls_handler.go index 2e5f0f19da..2f4f30ed94 100644 --- a/plugins/vpp/ifplugin/vppcalls/vpp2005/vppcalls_handler.go +++ b/plugins/vpp/ifplugin/vppcalls/vpp2005/vppcalls_handler.go @@ -26,11 +26,13 @@ import ( "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/gre" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/gtpu" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/interfaces" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip6_nd" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ip" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/ipsec" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/l2" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/memif" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/span" + "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/rd_cp" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/tapv2" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/vmxnet3" "go.ligato.io/vpp-agent/v3/plugins/vpp/binapi/vpp2005/vxlan" @@ -81,6 +83,8 @@ type InterfaceVppHandler struct { gtpu gtpu.RPCService memif memif.RPCService vmxnet3 vmxnet3.RPCService + rpcIP6nd ip6_nd.RPCService + rpcRdCp rd_cp.RPCService log logging.Logger } @@ -94,6 +98,8 @@ func NewInterfaceVppHandler(c vpp.Client, log logging.Logger) vppcalls.Interface callsChannel: ch, interfaces: interfaces.NewServiceClient(ch), ipsec: ipsec.NewServiceClient(ch), + rpcIP6nd: ip6_nd.NewServiceClient(ch), + rpcRdCp: rd_cp.NewServiceClient(ch), log: log, } if c.IsPluginLoaded(gtpu.ModuleName) { diff --git a/plugins/vpp/l2plugin/descriptor/adapter/bridgedomain.go b/plugins/vpp/l2plugin/descriptor/adapter/bridgedomain.go index a1d4181b2b..8bc86ce63b 100644 --- a/plugins/vpp/l2plugin/descriptor/adapter/bridgedomain.go +++ b/plugins/vpp/l2plugin/descriptor/adapter/bridgedomain.go @@ -4,8 +4,8 @@ package adapter import ( "github.com/golang/protobuf/proto" - "go.ligato.io/vpp-agent/v3/pkg/idxvpp" . "go.ligato.io/vpp-agent/v3/plugins/kvscheduler/api" + "go.ligato.io/vpp-agent/v3/pkg/idxvpp" "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l2" ) diff --git a/proto/ligato/vpp/interfaces/interface.pb.go b/proto/ligato/vpp/interfaces/interface.pb.go index 1a3a252131..e1cd4a7955 100644 --- a/proto/ligato/vpp/interfaces/interface.pb.go +++ b/proto/ligato/vpp/interfaces/interface.pb.go @@ -115,7 +115,7 @@ func (x Interface_RxMode_Type) String() string { } func (Interface_RxMode_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_8b053108eedee97b, []int{0, 1, 0} + return fileDescriptor_8b053108eedee97b, []int{0, 2, 0} } type SubInterface_TagRewriteOptions int32 @@ -420,12 +420,16 @@ type Interface struct { // The VRF table must be explicitely configured (see api/models/vpp/l3/vrf.proto). // When using unnumbered interface the actual vrf is inherited from // the interface referenced by the numbered interface and this field is ignored. - Vrf uint32 `protobuf:"varint,6,opt,name=vrf,proto3" json:"vrf,omitempty"` - SetDhcpClient bool `protobuf:"varint,7,opt,name=set_dhcp_client,json=setDhcpClient,proto3" json:"set_dhcp_client,omitempty"` - Mtu uint32 `protobuf:"varint,8,opt,name=mtu,proto3" json:"mtu,omitempty"` - Unnumbered *Interface_Unnumbered `protobuf:"bytes,9,opt,name=unnumbered,proto3" json:"unnumbered,omitempty"` - RxModes []*Interface_RxMode `protobuf:"bytes,12,rep,name=rx_modes,json=rxModes,proto3" json:"rx_modes,omitempty"` - RxPlacements []*Interface_RxPlacement `protobuf:"bytes,13,rep,name=rx_placements,json=rxPlacements,proto3" json:"rx_placements,omitempty"` + Vrf uint32 `protobuf:"varint,6,opt,name=vrf,proto3" json:"vrf,omitempty"` + // SetDhcpClient enables DHCP client on interface. + SetDhcpClient bool `protobuf:"varint,7,opt,name=set_dhcp_client,json=setDhcpClient,proto3" json:"set_dhcp_client,omitempty"` + Ip6Nd *Interface_IP6ND `protobuf:"bytes,14,opt,name=ip6_nd,json=ip6Nd,proto3" json:"ip6_nd,omitempty"` + // Mtu sets MTU (Maximum Transmission Unit) for this interface. + // If set to zero, default MTU (usually 9216) will be used. + Mtu uint32 `protobuf:"varint,8,opt,name=mtu,proto3" json:"mtu,omitempty"` + Unnumbered *Interface_Unnumbered `protobuf:"bytes,9,opt,name=unnumbered,proto3" json:"unnumbered,omitempty"` + RxModes []*Interface_RxMode `protobuf:"bytes,12,rep,name=rx_modes,json=rxModes,proto3" json:"rx_modes,omitempty"` + RxPlacements []*Interface_RxPlacement `protobuf:"bytes,13,rep,name=rx_placements,json=rxPlacements,proto3" json:"rx_placements,omitempty"` // Link defines configuration for specific interface types. // It can be nil for some interfaces types like: loopback and DPDK. // @@ -521,6 +525,13 @@ func (m *Interface) GetSetDhcpClient() bool { return false } +func (m *Interface) GetIp6Nd() *Interface_IP6ND { + if m != nil { + return m.Ip6Nd + } + return nil +} + func (m *Interface) GetMtu() uint32 { if m != nil { return m.Mtu @@ -721,7 +732,60 @@ func (*Interface) XXX_OneofWrappers() []interface{} { } } +// Ip6Nd is used to enable/disable IPv6 ND address autoconfiguration +// and setting up default routes +type Interface_IP6ND struct { + // Enable IPv6 ND address autoconfiguration. + AddressAutoconfig bool `protobuf:"varint,1,opt,name=address_autoconfig,json=addressAutoconfig,proto3" json:"address_autoconfig,omitempty"` + // Enable installing default routes. + InstallDefaultRoutes bool `protobuf:"varint,2,opt,name=install_default_routes,json=installDefaultRoutes,proto3" json:"install_default_routes,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Interface_IP6ND) Reset() { *m = Interface_IP6ND{} } +func (m *Interface_IP6ND) String() string { return proto.CompactTextString(m) } +func (*Interface_IP6ND) ProtoMessage() {} +func (*Interface_IP6ND) Descriptor() ([]byte, []int) { + return fileDescriptor_8b053108eedee97b, []int{0, 0} +} + +func (m *Interface_IP6ND) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Interface_IP6ND.Unmarshal(m, b) +} +func (m *Interface_IP6ND) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Interface_IP6ND.Marshal(b, m, deterministic) +} +func (m *Interface_IP6ND) XXX_Merge(src proto.Message) { + xxx_messageInfo_Interface_IP6ND.Merge(m, src) +} +func (m *Interface_IP6ND) XXX_Size() int { + return xxx_messageInfo_Interface_IP6ND.Size(m) +} +func (m *Interface_IP6ND) XXX_DiscardUnknown() { + xxx_messageInfo_Interface_IP6ND.DiscardUnknown(m) +} + +var xxx_messageInfo_Interface_IP6ND proto.InternalMessageInfo + +func (m *Interface_IP6ND) GetAddressAutoconfig() bool { + if m != nil { + return m.AddressAutoconfig + } + return false +} + +func (m *Interface_IP6ND) GetInstallDefaultRoutes() bool { + if m != nil { + return m.InstallDefaultRoutes + } + return false +} + +// Unnumbered is used for inheriting IP address from another interface. type Interface_Unnumbered struct { + // InterfaceWithIp is the name of interface to inherit IP address from. InterfaceWithIp string `protobuf:"bytes,1,opt,name=interface_with_ip,json=interfaceWithIp,proto3" json:"interface_with_ip,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -732,7 +796,7 @@ func (m *Interface_Unnumbered) Reset() { *m = Interface_Unnumbered{} } func (m *Interface_Unnumbered) String() string { return proto.CompactTextString(m) } func (*Interface_Unnumbered) ProtoMessage() {} func (*Interface_Unnumbered) Descriptor() ([]byte, []int) { - return fileDescriptor_8b053108eedee97b, []int{0, 0} + return fileDescriptor_8b053108eedee97b, []int{0, 1} } func (m *Interface_Unnumbered) XXX_Unmarshal(b []byte) error { @@ -775,7 +839,7 @@ func (m *Interface_RxMode) Reset() { *m = Interface_RxMode{} } func (m *Interface_RxMode) String() string { return proto.CompactTextString(m) } func (*Interface_RxMode) ProtoMessage() {} func (*Interface_RxMode) Descriptor() ([]byte, []int) { - return fileDescriptor_8b053108eedee97b, []int{0, 1} + return fileDescriptor_8b053108eedee97b, []int{0, 2} } func (m *Interface_RxMode) XXX_Unmarshal(b []byte) error { @@ -834,7 +898,7 @@ func (m *Interface_RxPlacement) Reset() { *m = Interface_RxPlacement{} } func (m *Interface_RxPlacement) String() string { return proto.CompactTextString(m) } func (*Interface_RxPlacement) ProtoMessage() {} func (*Interface_RxPlacement) Descriptor() ([]byte, []int) { - return fileDescriptor_8b053108eedee97b, []int{0, 2} + return fileDescriptor_8b053108eedee97b, []int{0, 3} } func (m *Interface_RxPlacement) XXX_Unmarshal(b []byte) error { @@ -1907,6 +1971,7 @@ func init() { proto.RegisterEnum("ligato.vpp.interfaces.GtpuLink_NextNode", GtpuLink_NextNode_name, GtpuLink_NextNode_value) proto.RegisterEnum("ligato.vpp.interfaces.IPIPLink_Mode", IPIPLink_Mode_name, IPIPLink_Mode_value) proto.RegisterType((*Interface)(nil), "ligato.vpp.interfaces.Interface") + proto.RegisterType((*Interface_IP6ND)(nil), "ligato.vpp.interfaces.Interface.IP6ND") proto.RegisterType((*Interface_Unnumbered)(nil), "ligato.vpp.interfaces.Interface.Unnumbered") proto.RegisterType((*Interface_RxMode)(nil), "ligato.vpp.interfaces.Interface.RxMode") proto.RegisterType((*Interface_RxPlacement)(nil), "ligato.vpp.interfaces.Interface.RxPlacement") @@ -1930,151 +1995,156 @@ func init() { } var fileDescriptor_8b053108eedee97b = []byte{ - // 2329 bytes of a gzipped FileDescriptorProto + // 2410 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x58, 0xdd, 0x72, 0xdb, 0xc6, - 0xf5, 0x17, 0x48, 0x4a, 0x04, 0x0f, 0x3f, 0x04, 0xef, 0x3f, 0xc9, 0x1f, 0x51, 0xe2, 0x46, 0x65, - 0x9c, 0x46, 0x93, 0x26, 0x72, 0x45, 0x35, 0x1f, 0x6d, 0x3a, 0x4d, 0x40, 0x11, 0x92, 0x19, 0x53, - 0x20, 0x02, 0x82, 0x4e, 0xdc, 0x49, 0x07, 0x03, 0x11, 0x4b, 0x0a, 0x35, 0x08, 0xc0, 0xc0, 0x52, - 0xa6, 0xf2, 0x12, 0xed, 0xc3, 0xf4, 0xb2, 0xef, 0xd0, 0xe9, 0x1b, 0xf4, 0x01, 0x7a, 0xdd, 0x69, - 0x7b, 0xd5, 0x39, 0xbb, 0x0b, 0x8a, 0x4a, 0x2c, 0xc9, 0xd3, 0x1b, 0x69, 0xf7, 0xb7, 0xe7, 0xb7, - 0x7b, 0x70, 0xf6, 0x7c, 0x2d, 0xe1, 0xbd, 0x28, 0x9c, 0xf9, 0x2c, 0x79, 0x78, 0x91, 0xa6, 0x0f, - 0xc3, 0x98, 0xd1, 0x6c, 0xea, 0x4f, 0x68, 0x7e, 0x35, 0xdc, 0x4f, 0xb3, 0x84, 0x25, 0xe4, 0x75, - 0x21, 0xb6, 0x7f, 0x91, 0xa6, 0xfb, 0x57, 0x62, 0x3b, 0x6f, 0xaf, 0xb3, 0xd3, 0x9c, 0x4e, 0xc4, - 0x5f, 0x41, 0x6a, 0xff, 0xad, 0x09, 0xb5, 0x7e, 0x21, 0x4c, 0x08, 0x54, 0x62, 0x7f, 0x4e, 0x75, - 0x65, 0x57, 0xd9, 0xab, 0x39, 0x7c, 0x4c, 0x7e, 0x05, 0x15, 0x76, 0x99, 0x52, 0xbd, 0xb4, 0xab, - 0xec, 0xb5, 0x3a, 0xef, 0xed, 0xbf, 0xf4, 0x94, 0xfd, 0xd5, 0x1e, 0xfb, 0xee, 0x65, 0x4a, 0x1d, - 0x4e, 0x21, 0x3a, 0x54, 0x69, 0xec, 0x9f, 0x45, 0x34, 0xd0, 0xcb, 0xbb, 0xca, 0x9e, 0xea, 0x14, - 0x53, 0xf2, 0x53, 0x68, 0xa4, 0xe7, 0x97, 0xb9, 0xe7, 0x07, 0x41, 0x46, 0xf3, 0x5c, 0xaf, 0xf0, - 0x03, 0xeb, 0x88, 0x19, 0x02, 0x42, 0x91, 0x30, 0x2d, 0x04, 0x68, 0xae, 0x6f, 0xee, 0x96, 0x51, - 0x24, 0x4c, 0x8d, 0x02, 0x22, 0x1a, 0x94, 0x2f, 0xb2, 0xa9, 0xbe, 0xb5, 0xab, 0xec, 0x35, 0x1d, - 0x1c, 0x92, 0x9f, 0xc1, 0x76, 0x4e, 0x99, 0x17, 0x9c, 0x4f, 0x52, 0x6f, 0x12, 0x85, 0x34, 0x66, - 0x7a, 0x95, 0x9f, 0xdc, 0xcc, 0x29, 0xeb, 0x9d, 0x4f, 0xd2, 0x23, 0x0e, 0x22, 0x73, 0xce, 0x16, - 0xba, 0x2a, 0x98, 0x73, 0xb6, 0x20, 0x8f, 0x01, 0x16, 0x71, 0xbc, 0x98, 0x9f, 0xd1, 0x8c, 0x06, - 0x7a, 0x6d, 0x57, 0xd9, 0xab, 0x77, 0x7e, 0x7e, 0xe7, 0xc7, 0x8e, 0x57, 0x14, 0x67, 0x8d, 0x4e, - 0xba, 0xa0, 0x66, 0x4b, 0x6f, 0x9e, 0x04, 0x34, 0xd7, 0x1b, 0xbb, 0xe5, 0xbd, 0x7a, 0xe7, 0xfd, - 0x3b, 0xb7, 0x72, 0x96, 0xa7, 0x49, 0x40, 0x9d, 0x6a, 0xc6, 0xff, 0xe7, 0xe4, 0x6b, 0x68, 0x66, - 0x4b, 0x2f, 0x8d, 0xfc, 0x09, 0x9d, 0xd3, 0x98, 0xe5, 0x7a, 0x93, 0x6f, 0xf4, 0xe1, 0x2b, 0x6c, - 0x64, 0x17, 0x24, 0xa7, 0x91, 0x5d, 0x4d, 0x72, 0xf2, 0x29, 0x94, 0xf3, 0xc5, 0x99, 0x1e, 0xf0, - 0x8f, 0x7b, 0xf7, 0x86, 0x8d, 0x46, 0x8b, 0xb3, 0xd5, 0x5e, 0x8f, 0x36, 0x1c, 0x64, 0x90, 0xcf, - 0x60, 0x73, 0x4e, 0xe7, 0xe1, 0x54, 0xa7, 0x9c, 0xba, 0x7b, 0x03, 0xf5, 0x14, 0x65, 0x06, 0x61, - 0xfc, 0xec, 0xd1, 0x86, 0x23, 0x08, 0xc4, 0x00, 0xd5, 0x9f, 0xa6, 0xfe, 0xe4, 0x19, 0x65, 0xfa, - 0xf4, 0xd6, 0x73, 0x0d, 0x29, 0x26, 0xf9, 0x2b, 0x1a, 0xe9, 0x40, 0x99, 0xf9, 0xa9, 0x3e, 0xe3, - 0xec, 0x9f, 0xdc, 0xc0, 0x76, 0xfd, 0x54, 0x12, 0x51, 0x18, 0x15, 0xbe, 0x58, 0x46, 0x7e, 0xac, - 0x9f, 0xdf, 0xaa, 0xf0, 0x13, 0x94, 0x29, 0x14, 0xe6, 0x04, 0xf2, 0x1b, 0xd8, 0xe4, 0xf1, 0xa1, - 0x87, 0xb7, 0x32, 0xfb, 0xf6, 0x88, 0x4e, 0x90, 0xd9, 0x2d, 0xe9, 0x0a, 0xb2, 0x39, 0x89, 0x7c, - 0x01, 0xea, 0xc5, 0x7c, 0xe9, 0xc5, 0x94, 0x1d, 0xea, 0x7f, 0xe0, 0x1b, 0xb4, 0x6f, 0x3a, 0x7a, - 0xbe, 0xb4, 0x28, 0x3b, 0x94, 0x87, 0x57, 0x2f, 0xc4, 0x94, 0x7c, 0x0c, 0x95, 0xb3, 0x24, 0x0e, - 0xf4, 0x67, 0x9c, 0xfc, 0xce, 0x0d, 0xe4, 0x6e, 0x12, 0x07, 0x92, 0xc9, 0xc5, 0xd1, 0x46, 0xb3, - 0x8c, 0xea, 0xd1, 0xad, 0x36, 0x3a, 0xc9, 0x68, 0x61, 0xa3, 0x59, 0x46, 0xf1, 0xa8, 0x19, 0x4b, - 0x17, 0xfa, 0xfc, 0xd6, 0xa3, 0x4e, 0x58, 0xba, 0x28, 0x8e, 0x42, 0x71, 0xa4, 0x85, 0x69, 0x98, - 0xea, 0xf1, 0xad, 0xb4, 0xbe, 0xdd, 0xb7, 0x0b, 0x1a, 0x8a, 0xef, 0x7c, 0x06, 0x70, 0x15, 0x2c, - 0xe4, 0x03, 0xb8, 0xb7, 0x12, 0xf6, 0x5e, 0x84, 0xec, 0xdc, 0x0b, 0x53, 0x99, 0x75, 0xb6, 0x57, - 0x0b, 0xdf, 0x84, 0xec, 0xbc, 0x9f, 0xee, 0xfc, 0x55, 0x81, 0x2d, 0x11, 0x1c, 0xe4, 0x35, 0xd8, - 0x7c, 0xbe, 0xa0, 0x0b, 0x91, 0xa0, 0x9a, 0x8e, 0x98, 0x90, 0x2f, 0xa1, 0x82, 0xa1, 0x26, 0x33, - 0xd4, 0x87, 0xaf, 0x18, 0x69, 0x32, 0x51, 0x21, 0x13, 0x73, 0x4d, 0x40, 0xa7, 0xfe, 0x22, 0x62, - 0x3c, 0x68, 0x65, 0xb6, 0xaa, 0x4b, 0x0c, 0xa5, 0xdb, 0x5f, 0x41, 0x05, 0x09, 0xa4, 0x0e, 0xd5, - 0xb1, 0xf5, 0xd8, 0x1a, 0x7e, 0x63, 0x69, 0x1b, 0x38, 0xb1, 0x87, 0x83, 0x41, 0xdf, 0x3a, 0xd1, - 0x14, 0x82, 0x99, 0xd4, 0x72, 0x4d, 0xc7, 0x19, 0xdb, 0xae, 0x56, 0x22, 0x0d, 0x50, 0x8d, 0x9e, - 0x61, 0xbb, 0xfd, 0x27, 0xa6, 0x56, 0x46, 0xc9, 0x9e, 0x79, 0x6c, 0x8c, 0x07, 0xae, 0x56, 0xd9, - 0xf9, 0x0e, 0xea, 0x6b, 0x41, 0x7a, 0xc3, 0x57, 0xbd, 0x01, 0x5b, 0x2f, 0x92, 0xec, 0x19, 0xcd, - 0xf8, 0x77, 0x35, 0x1d, 0x39, 0x23, 0xef, 0x40, 0x7d, 0xee, 0x87, 0xb1, 0xc7, 0xce, 0x33, 0xea, - 0x17, 0x89, 0x15, 0x10, 0x72, 0x39, 0xd2, 0xfe, 0xa7, 0x22, 0x55, 0x25, 0xd0, 0x1a, 0x5b, 0x3d, - 0xf3, 0xb8, 0x6f, 0x99, 0x3d, 0xcf, 0x7d, 0x6a, 0x9b, 0xda, 0x06, 0xb9, 0x07, 0xcd, 0xd1, 0xb8, - 0xeb, 0x71, 0x45, 0x8f, 0x8d, 0x23, 0x53, 0x53, 0xc8, 0xeb, 0x70, 0x6f, 0x34, 0x3c, 0x76, 0xbf, - 0x31, 0x1c, 0xd3, 0x1b, 0x0c, 0x87, 0x76, 0xd7, 0x38, 0x7a, 0xac, 0x95, 0x88, 0x0a, 0x95, 0x9e, - 0xdd, 0x7b, 0xac, 0x95, 0x49, 0x0d, 0x36, 0x4f, 0xcd, 0xd3, 0xfe, 0xb1, 0x56, 0x21, 0x55, 0x28, - 0xbb, 0x86, 0xad, 0x6d, 0xe2, 0xc7, 0x1a, 0xc7, 0x9e, 0x6d, 0x1c, 0x3d, 0x36, 0x5d, 0x6d, 0x8b, - 0x68, 0xd0, 0x78, 0xf2, 0xed, 0xc0, 0xb0, 0x3c, 0x77, 0x6c, 0x59, 0xe6, 0x40, 0xab, 0x92, 0xd7, - 0xa0, 0xd1, 0xb7, 0x47, 0xe6, 0x51, 0x81, 0xa8, 0x3b, 0x25, 0x95, 0x9f, 0xf5, 0xe4, 0xf4, 0x5b, - 0xcb, 0x74, 0x0f, 0xd7, 0x54, 0xa8, 0xa1, 0xa6, 0xdd, 0xa1, 0xd5, 0x5b, 0xc3, 0x80, 0xb4, 0x00, - 0x4e, 0x1c, 0xb3, 0xa0, 0xd7, 0xc9, 0x36, 0xd4, 0x4f, 0x5c, 0x7b, 0x5c, 0x00, 0x0d, 0x04, 0xd0, - 0xcb, 0x0a, 0xa0, 0xd9, 0xdd, 0x82, 0x4a, 0x14, 0xc6, 0xcf, 0xda, 0xff, 0x29, 0x41, 0x63, 0x3d, - 0x8b, 0xa1, 0xc9, 0x52, 0x3f, 0xa3, 0x31, 0xf3, 0xd6, 0xaa, 0x1b, 0x08, 0xc8, 0xc2, 0x1a, 0xf7, - 0x3a, 0x6c, 0xe5, 0x8b, 0x33, 0x2f, 0x0c, 0xa4, 0xad, 0x37, 0xf3, 0xc5, 0x59, 0x3f, 0x20, 0x4f, - 0xa1, 0xc9, 0xfc, 0x99, 0x97, 0xbd, 0xf0, 0x92, 0x94, 0x85, 0x49, 0xcc, 0x8d, 0xdd, 0xea, 0x7c, - 0xfc, 0x0a, 0x99, 0x73, 0xdf, 0xf5, 0x67, 0x0e, 0x7d, 0x91, 0x85, 0x8c, 0x0e, 0x39, 0x37, 0x77, - 0xea, 0xcc, 0x9f, 0x39, 0x2f, 0xc4, 0x8c, 0xdc, 0x07, 0x48, 0x17, 0xf9, 0xb9, 0x17, 0x24, 0xec, - 0xe0, 0x39, 0x2f, 0x7f, 0xaa, 0x53, 0x43, 0xa4, 0x87, 0x00, 0x16, 0x62, 0xe6, 0xcf, 0x0e, 0xf4, - 0x4d, 0xae, 0x0e, 0x1f, 0x4b, 0xac, 0x23, 0xcb, 0x1d, 0x1f, 0xb7, 0xff, 0xa8, 0xc0, 0xbd, 0x1f, - 0x9d, 0x84, 0xae, 0xd7, 0xeb, 0x8f, 0x8c, 0xee, 0xc0, 0xec, 0x69, 0x1b, 0x78, 0x7d, 0xf6, 0x78, - 0xf4, 0xe8, 0x40, 0x53, 0x8a, 0x61, 0x47, 0x5c, 0xaf, 0x3d, 0xb4, 0x0f, 0xb4, 0xb2, 0x1c, 0x75, - 0xb4, 0x0a, 0x5a, 0xd4, 0x75, 0x0c, 0x6b, 0x34, 0x30, 0x5c, 0xf3, 0xe0, 0x40, 0xdb, 0xbc, 0x0e, - 0x74, 0xb4, 0xad, 0x6b, 0x40, 0xe7, 0x40, 0xab, 0x5e, 0x07, 0x3a, 0x9a, 0xda, 0xfe, 0x7b, 0x09, - 0x6a, 0xab, 0x3a, 0x40, 0x7e, 0x2b, 0x43, 0x53, 0xe1, 0x86, 0xfb, 0xe0, 0xae, 0xba, 0x21, 0x46, - 0xbc, 0x0e, 0x8a, 0xc0, 0x7c, 0x03, 0xb6, 0xe6, 0x7e, 0xce, 0x64, 0x10, 0xa8, 0x8e, 0x9c, 0x91, - 0x16, 0x94, 0x42, 0xe1, 0xfb, 0x4d, 0xa7, 0x14, 0x06, 0xe4, 0x7d, 0xd8, 0xce, 0x13, 0xac, 0x16, - 0xde, 0x34, 0x8c, 0x28, 0xbf, 0x65, 0xd1, 0x52, 0xb4, 0x04, 0x7c, 0x2c, 0x51, 0xdc, 0x30, 0xa7, - 0x93, 0x8c, 0x32, 0x6e, 0xda, 0x9a, 0x23, 0x67, 0xe4, 0x2d, 0xa8, 0x65, 0x61, 0x3c, 0xf3, 0xf2, - 0xf0, 0x7b, 0x2a, 0x2d, 0xac, 0x22, 0x30, 0x0a, 0xbf, 0xe7, 0xfe, 0x73, 0xb6, 0x98, 0x4e, 0x69, - 0x26, 0x96, 0xab, 0x7c, 0x19, 0x04, 0xc4, 0x05, 0x90, 0xbd, 0xf4, 0x78, 0xdc, 0xe6, 0xb2, 0xa9, - 0x50, 0xb3, 0xe5, 0xd7, 0x7c, 0x8e, 0x8b, 0x6c, 0xb5, 0x58, 0x13, 0x8b, 0x4c, 0x2e, 0xb6, 0x3b, - 0xd2, 0x5a, 0x3c, 0xbd, 0x35, 0x40, 0x35, 0xdd, 0x47, 0xa6, 0x63, 0x99, 0xae, 0xb6, 0x41, 0xb6, - 0xa0, 0xd4, 0xb7, 0x35, 0x05, 0x4d, 0x6c, 0x8f, 0x2d, 0xd7, 0xeb, 0x5b, 0x5f, 0x99, 0x47, 0xae, - 0x56, 0x6a, 0xff, 0xa3, 0x04, 0xb5, 0x55, 0xe5, 0x42, 0xe5, 0xf2, 0x6c, 0xb2, 0xea, 0xa4, 0xa4, - 0x73, 0xe7, 0xd9, 0xa4, 0x68, 0xa4, 0xde, 0x81, 0x7a, 0x90, 0xb3, 0x95, 0x40, 0x49, 0x08, 0x04, - 0x39, 0x2b, 0x04, 0xb0, 0x8d, 0x8a, 0x43, 0x69, 0x4d, 0x1c, 0x92, 0xb7, 0xa1, 0x36, 0x5f, 0x44, - 0x2c, 0x9c, 0xf8, 0x39, 0x93, 0x86, 0xbc, 0x02, 0xc8, 0x27, 0x50, 0x9e, 0xa5, 0x94, 0x1b, 0xb0, - 0xde, 0x79, 0x70, 0x57, 0x69, 0xdd, 0x3f, 0x49, 0xa9, 0x83, 0x84, 0x9d, 0x3f, 0x2b, 0x50, 0x3e, - 0x49, 0x29, 0xd9, 0xc5, 0x6c, 0x3b, 0xf1, 0x53, 0xef, 0x22, 0x9b, 0x62, 0xcc, 0x89, 0xb4, 0x07, - 0x1c, 0x7b, 0x92, 0x4d, 0xfb, 0x01, 0xe9, 0x83, 0xca, 0xdb, 0xd3, 0x49, 0x12, 0xc9, 0xac, 0xfe, - 0xd1, 0xab, 0x1c, 0xb3, 0x6f, 0x4b, 0x92, 0xb3, 0xa2, 0xb7, 0xbf, 0x04, 0xb5, 0x40, 0xaf, 0xe7, - 0xee, 0x2a, 0x94, 0xfb, 0xf6, 0x2f, 0x35, 0x45, 0x0c, 0x3e, 0x11, 0x19, 0x7b, 0x65, 0xfe, 0x32, - 0xc2, 0xd6, 0xe8, 0x91, 0x56, 0x69, 0xff, 0x1e, 0x1a, 0xeb, 0xbd, 0x09, 0x79, 0x00, 0x8d, 0xf3, - 0x24, 0x67, 0x5e, 0x38, 0x5d, 0x4b, 0x27, 0xd8, 0x06, 0x38, 0x80, 0x78, 0x7f, 0xca, 0x53, 0xca, - 0xfb, 0xb0, 0x1d, 0x85, 0xf1, 0x62, 0xe9, 0xad, 0x94, 0x95, 0x96, 0x6f, 0x71, 0x78, 0x95, 0x28, - 0x30, 0x5d, 0x57, 0x65, 0xf7, 0x82, 0x0d, 0xf3, 0x05, 0xcd, 0x72, 0x4c, 0x35, 0xc2, 0x28, 0xc5, - 0x14, 0x6d, 0x76, 0xed, 0x50, 0x79, 0x8b, 0xd7, 0x0f, 0x64, 0x89, 0x37, 0x0f, 0x27, 0x59, 0x92, - 0xd3, 0xec, 0x22, 0x9c, 0x88, 0x32, 0x56, 0x73, 0x5a, 0x2c, 0x39, 0x5d, 0x43, 0x71, 0xab, 0x6c, - 0xe9, 0x5d, 0x79, 0x7b, 0x45, 0x98, 0x3f, 0x5b, 0x3a, 0x85, 0xbf, 0xef, 0x42, 0x83, 0xad, 0x4b, - 0x88, 0x2c, 0x04, 0xec, 0x4a, 0xe2, 0x3e, 0x80, 0x68, 0xe5, 0xbd, 0x59, 0x9e, 0xf0, 0x78, 0x51, - 0x9d, 0x9a, 0x40, 0x4e, 0xf2, 0x84, 0xbc, 0x0b, 0x4d, 0xb9, 0xcc, 0x16, 0x71, 0x4c, 0x23, 0xd9, - 0x84, 0x37, 0x04, 0xe8, 0x72, 0xac, 0xfd, 0xef, 0x32, 0xd4, 0x56, 0x6d, 0x14, 0x3a, 0x21, 0xcd, - 0x63, 0x19, 0xe6, 0x38, 0x44, 0xbf, 0xf5, 0x63, 0x16, 0x7a, 0x19, 0x4d, 0x23, 0xff, 0xb2, 0x28, - 0x74, 0x08, 0x39, 0x1c, 0x21, 0x6f, 0x82, 0x1a, 0x25, 0x13, 0x3f, 0xc2, 0xde, 0x41, 0x38, 0x69, - 0x95, 0xcf, 0xfb, 0x29, 0x0f, 0x48, 0x3a, 0x4f, 0x18, 0xc5, 0x35, 0x11, 0xe9, 0xaa, 0x00, 0xc4, - 0xa2, 0xe0, 0xe5, 0x69, 0x58, 0xc4, 0x3a, 0x07, 0x46, 0x69, 0x88, 0x5f, 0x26, 0x99, 0xb8, 0x2a, - 0x42, 0x5d, 0xee, 0x85, 0xcb, 0xbf, 0x06, 0x98, 0x64, 0x97, 0x29, 0x4b, 0x3c, 0x3f, 0x9a, 0xf1, - 0x50, 0x6f, 0x75, 0xde, 0xba, 0xe6, 0x9b, 0xfc, 0x71, 0x75, 0xc4, 0x65, 0x8c, 0x68, 0xe6, 0xd4, - 0x26, 0xc5, 0x90, 0xec, 0x81, 0x26, 0xce, 0x95, 0x3b, 0x3c, 0xa3, 0x97, 0x3c, 0x1f, 0xa0, 0x4f, - 0x20, 0x2e, 0x48, 0x8f, 0xe9, 0x25, 0xb6, 0x47, 0x52, 0x89, 0x35, 0x51, 0x10, 0xed, 0x91, 0x58, - 0xb8, 0x92, 0xfd, 0x14, 0x6a, 0xe8, 0x62, 0x33, 0xae, 0x50, 0x9d, 0x2b, 0xb4, 0xf3, 0x63, 0x85, - 0xd0, 0xdf, 0x66, 0xa8, 0x8f, 0x1a, 0xca, 0x11, 0xbe, 0x95, 0xa4, 0xf9, 0x38, 0x1d, 0x8f, 0x68, - 0xf0, 0x23, 0x9a, 0xc2, 0x8a, 0x88, 0xe2, 0x01, 0x7b, 0xa0, 0x15, 0xb6, 0x5c, 0x09, 0x36, 0x85, - 0xda, 0xd2, 0xa4, 0x6b, 0x92, 0xf2, 0xda, 0x17, 0x41, 0xea, 0xd1, 0x78, 0xe2, 0xa7, 0x7a, 0x8b, - 0x5f, 0x5b, 0x4b, 0xe0, 0xe3, 0x20, 0x35, 0x11, 0x6d, 0x07, 0x50, 0x5f, 0x6b, 0x80, 0xf1, 0xaa, - 0x25, 0x91, 0x46, 0xc9, 0x4c, 0x3a, 0x81, 0xf4, 0x30, 0x33, 0x4a, 0x66, 0x78, 0xd5, 0xd9, 0xf2, - 0xb9, 0xf0, 0x46, 0x91, 0xa7, 0xaa, 0xd9, 0xf2, 0x39, 0x77, 0xc5, 0x37, 0x41, 0x65, 0xc5, 0x92, - 0x70, 0xe5, 0x2a, 0x13, 0x4b, 0xe8, 0x61, 0x6a, 0xd1, 0x2a, 0xcb, 0x92, 0xa1, 0xac, 0x4a, 0xc6, - 0x67, 0xb2, 0x34, 0x89, 0x9a, 0xfe, 0xe0, 0x8e, 0x4e, 0x7b, 0x7f, 0xad, 0x28, 0x7d, 0x0e, 0xa5, - 0xe8, 0x8c, 0x9f, 0xd5, 0xba, 0xf1, 0x89, 0xb8, 0xe2, 0x0d, 0x12, 0x3f, 0xe8, 0xfa, 0x91, 0x1f, - 0x4f, 0xa8, 0x53, 0x8a, 0xce, 0xc8, 0x77, 0x70, 0x0f, 0x3b, 0x76, 0x1a, 0x5c, 0x25, 0x86, 0xe2, - 0x8d, 0xf8, 0xf0, 0xae, 0xbd, 0xba, 0x9c, 0xb8, 0x4a, 0x1d, 0x8e, 0x76, 0x76, 0x1d, 0xc8, 0x77, - 0x22, 0xd8, 0xfe, 0x81, 0xd0, 0x4b, 0xdf, 0xf4, 0xf7, 0x01, 0xc2, 0xdc, 0x4b, 0xfd, 0x3c, 0x0f, - 0x2f, 0xa8, 0x34, 0x77, 0x2d, 0xcc, 0x6d, 0x01, 0xa0, 0x67, 0x84, 0xb9, 0x17, 0x25, 0xf1, 0xcc, - 0x63, 0xe1, 0x9c, 0x26, 0x0b, 0x26, 0xa3, 0xaf, 0x19, 0xe6, 0x83, 0x24, 0x9e, 0xb9, 0x02, 0x6c, - 0x3f, 0x85, 0x0a, 0xaf, 0x5b, 0xd7, 0xf2, 0xea, 0x36, 0xd4, 0x9d, 0xe1, 0xd8, 0xea, 0x79, 0xce, - 0xb0, 0xdb, 0xb7, 0x34, 0x05, 0x5b, 0x4e, 0xe3, 0x08, 0xdb, 0x60, 0x0f, 0x3b, 0xcb, 0xb1, 0xad, - 0x95, 0x30, 0xb7, 0x7e, 0x3b, 0x74, 0xb4, 0x32, 0xb6, 0x91, 0x5d, 0x67, 0x68, 0xf4, 0x8e, 0x8c, - 0x91, 0xab, 0x55, 0xb0, 0x15, 0x19, 0x18, 0x47, 0xb6, 0xb6, 0xd9, 0xfe, 0x02, 0xea, 0x6b, 0x96, - 0xc3, 0x5a, 0x38, 0xe8, 0x88, 0xa4, 0x3d, 0x38, 0x94, 0x49, 0x7b, 0xd0, 0x39, 0xd4, 0x4a, 0xb8, - 0xe2, 0xe0, 0x4e, 0x5b, 0x50, 0xea, 0x1e, 0x69, 0x15, 0xfc, 0x6f, 0x74, 0xb5, 0xcd, 0xf6, 0xbf, - 0x14, 0xa8, 0xca, 0x07, 0x0f, 0xe9, 0x41, 0x5d, 0xe4, 0x21, 0x8f, 0xff, 0x92, 0x21, 0x9a, 0x91, - 0x77, 0x6f, 0x7f, 0x25, 0x89, 0xe7, 0x01, 0x08, 0x1e, 0x6f, 0xa7, 0xdf, 0x04, 0xb5, 0x28, 0xb4, - 0x32, 0xfd, 0x56, 0x65, 0x95, 0xc5, 0xa5, 0xa2, 0xc4, 0xca, 0xa4, 0x5b, 0x95, 0xf5, 0x15, 0x73, - 0x69, 0xb2, 0x60, 0x34, 0xf3, 0xa6, 0x21, 0x6f, 0x30, 0x65, 0xb6, 0xe5, 0xd8, 0x71, 0x88, 0x5d, - 0xe6, 0x7d, 0x80, 0x9c, 0xe6, 0x98, 0xe5, 0x71, 0x5d, 0xe4, 0xda, 0x9a, 0x44, 0xfa, 0x41, 0xfb, - 0x17, 0x2f, 0x7b, 0x78, 0xa0, 0x3d, 0x0e, 0x85, 0x19, 0x5c, 0xb3, 0xab, 0x95, 0x08, 0xc0, 0x96, - 0xe9, 0x8c, 0x6c, 0xc3, 0xd2, 0xca, 0xed, 0x3f, 0x95, 0x40, 0x2d, 0x9e, 0x6d, 0xd7, 0xb4, 0x56, - 0x6e, 0xd6, 0xba, 0x74, 0x5d, 0xeb, 0x6b, 0x0d, 0x40, 0xf9, 0x87, 0x0d, 0x00, 0x76, 0xa2, 0x74, - 0xf5, 0x2d, 0x7c, 0x8c, 0xdf, 0xc9, 0x03, 0xbe, 0x28, 0xea, 0xb2, 0x66, 0x70, 0x4c, 0x14, 0xf5, - 0x13, 0x10, 0x25, 0xde, 0x8b, 0xe9, 0x92, 0xf1, 0xbc, 0xdb, 0xea, 0xec, 0xdd, 0xf1, 0xea, 0xdc, - 0xb7, 0xe8, 0x92, 0x59, 0x18, 0x7a, 0x35, 0xce, 0xc5, 0x69, 0xfb, 0x00, 0xd4, 0x02, 0x5e, 0x7f, - 0x57, 0x6d, 0x48, 0x2f, 0x51, 0x8a, 0xd2, 0x5e, 0x2a, 0x4a, 0x7b, 0xb9, 0xfd, 0x17, 0x05, 0xd4, - 0xe2, 0x49, 0x4a, 0xcc, 0x95, 0x3b, 0xac, 0xf5, 0xa6, 0x0f, 0xee, 0x78, 0xc8, 0x8a, 0x04, 0x20, - 0xfd, 0x81, 0x7b, 0xfd, 0xff, 0xe4, 0x0f, 0xed, 0x43, 0x19, 0x33, 0x04, 0x5a, 0xf6, 0xb0, 0x6f, - 0xb9, 0x9e, 0x3b, 0xf4, 0xf8, 0x40, 0xdb, 0x20, 0xff, 0x0f, 0xff, 0xb7, 0xc2, 0x4e, 0xc7, 0x03, - 0xb7, 0x2f, 0x16, 0x94, 0xee, 0xf1, 0xef, 0x7a, 0xb3, 0xa4, 0x50, 0x30, 0xe4, 0xbf, 0xe5, 0x7d, - 0xe4, 0xcf, 0x68, 0xcc, 0x1e, 0x5e, 0x1c, 0x3e, 0xe4, 0xad, 0xce, 0xc3, 0x97, 0xfe, 0x46, 0xf8, - 0xf9, 0x45, 0x9a, 0xae, 0xe5, 0x99, 0xb3, 0x2d, 0x2e, 0x7b, 0xf8, 0xdf, 0x00, 0x00, 0x00, 0xff, - 0xff, 0x9c, 0x59, 0x95, 0xec, 0x52, 0x14, 0x00, 0x00, + 0x15, 0x16, 0xff, 0xc1, 0xc3, 0x1f, 0xc3, 0xdb, 0x24, 0x45, 0x94, 0xb8, 0x51, 0x19, 0x27, 0xd1, + 0xa4, 0x89, 0x5c, 0x51, 0x89, 0x93, 0x36, 0x6d, 0x13, 0x52, 0x84, 0x64, 0xc4, 0x14, 0x88, 0x80, + 0xa0, 0x93, 0x74, 0xd2, 0xc1, 0x40, 0xc4, 0x92, 0x42, 0x0d, 0x02, 0x30, 0xb0, 0x94, 0xa9, 0xbc, + 0x44, 0xfb, 0x30, 0xbd, 0xec, 0x3b, 0xf4, 0x15, 0xfa, 0x00, 0xbd, 0xee, 0xb4, 0xbd, 0xe8, 0x74, + 0xce, 0xee, 0x82, 0xa2, 0x12, 0x4b, 0xf2, 0xf4, 0x46, 0xda, 0xfd, 0xce, 0xf9, 0xf6, 0xe7, 0xe0, + 0xfc, 0x2d, 0xe1, 0x9d, 0x30, 0x98, 0x7b, 0x2c, 0x7e, 0x70, 0x9e, 0x24, 0x0f, 0x82, 0x88, 0xd1, + 0x74, 0xe6, 0x4d, 0x69, 0x76, 0x39, 0xdc, 0x4b, 0xd2, 0x98, 0xc5, 0xe4, 0x55, 0xa1, 0xb6, 0x77, + 0x9e, 0x24, 0x7b, 0x97, 0x6a, 0xdb, 0x6f, 0x6e, 0xb2, 0x93, 0x8c, 0x4e, 0xc5, 0x5f, 0x41, 0xea, + 0xfc, 0xb7, 0x0d, 0x75, 0x23, 0x57, 0x26, 0x04, 0xca, 0x91, 0xb7, 0xa0, 0x5a, 0x61, 0xa7, 0xb0, + 0x5b, 0xb7, 0xf9, 0x98, 0xfc, 0x0a, 0xca, 0xec, 0x22, 0xa1, 0x5a, 0x71, 0xa7, 0xb0, 0xdb, 0xee, + 0xbe, 0xb3, 0xf7, 0xc2, 0x5d, 0xf6, 0xd6, 0x6b, 0xec, 0x39, 0x17, 0x09, 0xb5, 0x39, 0x85, 0x68, + 0x50, 0xa3, 0x91, 0x77, 0x1a, 0x52, 0x5f, 0x2b, 0xed, 0x14, 0x76, 0x15, 0x3b, 0x9f, 0x92, 0x9f, + 0x43, 0x33, 0x39, 0xbb, 0xc8, 0x5c, 0xcf, 0xf7, 0x53, 0x9a, 0x65, 0x5a, 0x99, 0x6f, 0xd8, 0x40, + 0xac, 0x27, 0x20, 0x54, 0x09, 0x92, 0x5c, 0x81, 0x66, 0x5a, 0x65, 0xa7, 0x84, 0x2a, 0x41, 0xd2, + 0xcb, 0x21, 0xa2, 0x42, 0xe9, 0x3c, 0x9d, 0x69, 0xd5, 0x9d, 0xc2, 0x6e, 0xcb, 0xc6, 0x21, 0x79, + 0x17, 0xee, 0x64, 0x94, 0xb9, 0xfe, 0xd9, 0x34, 0x71, 0xa7, 0x61, 0x40, 0x23, 0xa6, 0xd5, 0xf8, + 0xce, 0xad, 0x8c, 0xb2, 0xc1, 0xd9, 0x34, 0x39, 0xe4, 0x20, 0xf9, 0x2d, 0x54, 0x83, 0xe4, 0xa1, + 0x1b, 0xf9, 0x5a, 0x7b, 0xa7, 0xb0, 0xdb, 0xe8, 0xbe, 0x7b, 0xeb, 0xb5, 0x0c, 0xeb, 0xa1, 0x39, + 0xb0, 0x2b, 0x41, 0xf2, 0xd0, 0xf4, 0x71, 0xe3, 0x05, 0x5b, 0x6a, 0x8a, 0xd8, 0x78, 0xc1, 0x96, + 0xe4, 0x31, 0xc0, 0x32, 0x8a, 0x96, 0x8b, 0x53, 0x9a, 0x52, 0x5f, 0xab, 0xf3, 0x45, 0x7f, 0x71, + 0xeb, 0xa2, 0x93, 0x35, 0xc5, 0xde, 0xa0, 0x93, 0x3e, 0x28, 0xe9, 0xca, 0x5d, 0xc4, 0x3e, 0xcd, + 0xb4, 0xe6, 0x4e, 0x69, 0xb7, 0xd1, 0x7d, 0xef, 0xd6, 0xa5, 0xec, 0xd5, 0x49, 0xec, 0x53, 0xbb, + 0x96, 0xf2, 0xff, 0x19, 0xf9, 0x0a, 0x5a, 0xe9, 0xca, 0x4d, 0x42, 0x6f, 0x4a, 0x17, 0x34, 0x62, + 0x99, 0xd6, 0xe2, 0x0b, 0x7d, 0xf0, 0x12, 0x0b, 0x59, 0x39, 0xc9, 0x6e, 0xa6, 0x97, 0x93, 0x8c, + 0x7c, 0x02, 0xa5, 0x6c, 0x79, 0xaa, 0xf9, 0xfc, 0x72, 0x6f, 0x5f, 0xb3, 0xd0, 0x78, 0x79, 0xba, + 0x5e, 0xeb, 0xd1, 0x96, 0x8d, 0x0c, 0xf2, 0x29, 0x54, 0x16, 0x74, 0x11, 0xcc, 0x34, 0xca, 0xa9, + 0x3b, 0xd7, 0x50, 0x4f, 0x50, 0x67, 0x18, 0x44, 0x4f, 0x1f, 0x6d, 0xd9, 0x82, 0x40, 0x7a, 0xa0, + 0x78, 0xb3, 0xc4, 0x9b, 0x3e, 0xa5, 0x4c, 0x9b, 0xdd, 0xb8, 0x6f, 0x4f, 0xaa, 0x49, 0xfe, 0x9a, + 0x46, 0xba, 0x50, 0x62, 0x5e, 0xa2, 0xcd, 0x39, 0xfb, 0x67, 0xd7, 0xb0, 0x1d, 0x2f, 0x91, 0x44, + 0x54, 0xc6, 0x03, 0x9f, 0xaf, 0x42, 0x2f, 0xd2, 0xce, 0x6e, 0x3c, 0xf0, 0x13, 0xd4, 0xc9, 0x0f, + 0xcc, 0x09, 0xe4, 0x37, 0x50, 0xe1, 0xe1, 0xa5, 0x05, 0x37, 0x32, 0x0d, 0x6b, 0x4c, 0xa7, 0xc8, + 0xec, 0x17, 0xb5, 0x02, 0xb2, 0x39, 0x89, 0x7c, 0x0e, 0xca, 0xf9, 0x62, 0xe5, 0x46, 0x94, 0x1d, + 0x68, 0x7f, 0xe4, 0x0b, 0x74, 0xae, 0xdb, 0x7a, 0xb1, 0x32, 0x29, 0x3b, 0x90, 0x9b, 0xd7, 0xce, + 0xc5, 0x94, 0x7c, 0x0c, 0xe5, 0xd3, 0x38, 0xf2, 0xb5, 0xa7, 0x9c, 0xfc, 0xd6, 0x35, 0xe4, 0x7e, + 0x1c, 0xf9, 0x92, 0xc9, 0xd5, 0xd1, 0x46, 0xf3, 0x94, 0x6a, 0xe1, 0x8d, 0x36, 0x3a, 0x4e, 0x69, + 0x6e, 0xa3, 0x79, 0x4a, 0x71, 0xab, 0x39, 0x4b, 0x96, 0xda, 0xe2, 0xc6, 0xad, 0x8e, 0x59, 0xb2, + 0xcc, 0xb7, 0x42, 0x75, 0xa4, 0x05, 0x49, 0x90, 0x68, 0xd1, 0x8d, 0x34, 0xc3, 0x32, 0xac, 0x9c, + 0x86, 0xea, 0xdb, 0x21, 0x54, 0x78, 0x04, 0x92, 0x0f, 0x81, 0xc8, 0x9c, 0xe0, 0x7a, 0x4b, 0x16, + 0x4f, 0xe3, 0x68, 0x16, 0xcc, 0x79, 0xc2, 0x52, 0xec, 0xbb, 0x52, 0xd2, 0x5b, 0x0b, 0xc8, 0x47, + 0xf0, 0x5a, 0x10, 0x65, 0xcc, 0x0b, 0x43, 0xd7, 0xa7, 0x33, 0x6f, 0x19, 0x32, 0x37, 0x8d, 0x97, + 0x8c, 0x66, 0x3c, 0x9f, 0x29, 0xf6, 0x2b, 0x52, 0x3a, 0x10, 0x42, 0x9b, 0xcb, 0xb6, 0x3f, 0x05, + 0xb8, 0x0c, 0x4d, 0xf2, 0x3e, 0xdc, 0x5d, 0x1f, 0xcd, 0x7d, 0x1e, 0xb0, 0x33, 0x37, 0x48, 0x64, + 0x8a, 0xbc, 0xb3, 0x16, 0x7c, 0x1d, 0xb0, 0x33, 0x23, 0xd9, 0xfe, 0x5b, 0x01, 0xaa, 0x22, 0x14, + 0xc9, 0x2b, 0x50, 0x79, 0xb6, 0xa4, 0x4b, 0x91, 0x4d, 0x5b, 0xb6, 0x98, 0x90, 0x2f, 0xa0, 0x8c, + 0x81, 0x2d, 0xd3, 0xe9, 0x07, 0x2f, 0x19, 0xd7, 0x32, 0xab, 0x22, 0x13, 0x13, 0x63, 0x7e, 0x15, + 0xbe, 0x92, 0x48, 0xad, 0x0d, 0x89, 0xa1, 0x76, 0xe7, 0x4b, 0x28, 0x23, 0x81, 0x34, 0xa0, 0x36, + 0x31, 0x1f, 0x9b, 0xa3, 0xaf, 0x4d, 0x75, 0x0b, 0x27, 0xd6, 0x68, 0x38, 0x34, 0xcc, 0x63, 0xb5, + 0x40, 0x5a, 0x50, 0x37, 0x4c, 0x47, 0xb7, 0xed, 0x89, 0xe5, 0xa8, 0x45, 0xd2, 0x04, 0xa5, 0x37, + 0xe8, 0x59, 0x8e, 0xf1, 0x44, 0x57, 0x4b, 0xa8, 0x39, 0xd0, 0x8f, 0x7a, 0x93, 0xa1, 0xa3, 0x96, + 0xb7, 0xbf, 0x83, 0xc6, 0x46, 0x4a, 0xb8, 0xe6, 0x56, 0xaf, 0x41, 0xf5, 0x79, 0x9c, 0x3e, 0xa5, + 0x29, 0xbf, 0x57, 0xcb, 0x96, 0x33, 0xf2, 0x16, 0x34, 0x16, 0x5e, 0x10, 0xb9, 0xec, 0x2c, 0xa5, + 0x5e, 0x5e, 0x05, 0x00, 0x21, 0x87, 0x23, 0x9d, 0x7f, 0x16, 0xe4, 0x51, 0x09, 0xb4, 0x27, 0xe6, + 0x40, 0x3f, 0x32, 0x4c, 0x7d, 0xe0, 0x3a, 0xdf, 0x5a, 0xba, 0xba, 0x45, 0xee, 0x42, 0x6b, 0x3c, + 0xe9, 0xbb, 0xfc, 0xa0, 0x47, 0xbd, 0x43, 0x5d, 0x2d, 0x90, 0x57, 0xe1, 0xee, 0x78, 0x74, 0xe4, + 0x7c, 0xdd, 0xb3, 0x75, 0x77, 0x38, 0x1a, 0x59, 0xfd, 0xde, 0xe1, 0x63, 0xb5, 0x48, 0x14, 0x28, + 0x0f, 0xac, 0xc1, 0x63, 0xb5, 0x44, 0xea, 0x50, 0x39, 0xd1, 0x4f, 0x8c, 0x23, 0xb5, 0x4c, 0x6a, + 0x50, 0x72, 0x7a, 0x96, 0x5a, 0xc1, 0xcb, 0xf6, 0x8e, 0x5c, 0xab, 0x77, 0xf8, 0x58, 0x77, 0xd4, + 0x2a, 0x51, 0xa1, 0xf9, 0xe4, 0x9b, 0x61, 0xcf, 0x74, 0x9d, 0x89, 0x69, 0xea, 0x43, 0xb5, 0x46, + 0x5e, 0x81, 0xa6, 0x61, 0x8d, 0xf5, 0xc3, 0x1c, 0x51, 0xb6, 0x8b, 0x0a, 0xdf, 0xeb, 0xc9, 0xc9, + 0x37, 0xa6, 0xee, 0x1c, 0x6c, 0x1c, 0xa1, 0x8e, 0x27, 0xed, 0x8f, 0xcc, 0xc1, 0x06, 0x06, 0xa4, + 0x0d, 0x70, 0x6c, 0xeb, 0x39, 0xbd, 0x41, 0xee, 0x40, 0xe3, 0xd8, 0xb1, 0x26, 0x39, 0xd0, 0x44, + 0x00, 0x7d, 0x3a, 0x07, 0x5a, 0xfd, 0x2a, 0x94, 0xc3, 0x20, 0x7a, 0xda, 0xf9, 0x4f, 0x11, 0x9a, + 0x9b, 0x39, 0x13, 0x4d, 0x96, 0x78, 0x29, 0x8d, 0x98, 0xbb, 0x51, 0x8a, 0x41, 0x40, 0x26, 0x16, + 0xe4, 0x57, 0xa1, 0x9a, 0x2d, 0x4f, 0xdd, 0xc0, 0x97, 0xb6, 0xae, 0x64, 0xcb, 0x53, 0xc3, 0x27, + 0xdf, 0x42, 0x8b, 0x79, 0x73, 0x37, 0x7d, 0xee, 0xc6, 0x09, 0x0b, 0xe2, 0x88, 0x1b, 0xbb, 0xdd, + 0xfd, 0xf8, 0x25, 0xf2, 0xf4, 0x9e, 0xe3, 0xcd, 0x6d, 0xfa, 0x3c, 0x0d, 0x18, 0x1d, 0x71, 0x6e, + 0x66, 0x37, 0x98, 0x37, 0xb7, 0x9f, 0x8b, 0x19, 0xb9, 0x07, 0x90, 0x2c, 0xb3, 0x33, 0xd7, 0x8f, + 0xd9, 0xfe, 0x33, 0x5e, 0xab, 0x15, 0xbb, 0x8e, 0xc8, 0x00, 0x01, 0xec, 0x1a, 0x98, 0x37, 0xdf, + 0xd7, 0x2a, 0xfc, 0x38, 0x7c, 0x2c, 0xb1, 0xae, 0xac, 0xcd, 0x7c, 0xdc, 0xf9, 0x53, 0x01, 0xee, + 0xfe, 0x68, 0x27, 0x74, 0xbd, 0x81, 0x31, 0xee, 0xf5, 0x87, 0xfa, 0x40, 0xdd, 0xc2, 0xcf, 0x67, + 0x4d, 0xc6, 0x8f, 0xf6, 0xd5, 0x42, 0x3e, 0xec, 0x8a, 0xcf, 0x6b, 0x8d, 0xac, 0x7d, 0xb5, 0x24, + 0x47, 0x5d, 0xb5, 0x8c, 0x16, 0x75, 0xec, 0x9e, 0x39, 0x1e, 0xf6, 0x1c, 0x7d, 0x7f, 0x5f, 0xad, + 0x5c, 0x05, 0xba, 0x6a, 0xf5, 0x0a, 0xd0, 0xdd, 0x57, 0x6b, 0x57, 0x81, 0xae, 0xaa, 0x74, 0xfe, + 0x5e, 0x84, 0xfa, 0xba, 0xea, 0x90, 0xdf, 0xc9, 0xd0, 0x2c, 0x70, 0xc3, 0xbd, 0x7f, 0x5b, 0x95, + 0x12, 0x23, 0x5e, 0x75, 0x45, 0x60, 0xbe, 0x06, 0xd5, 0x85, 0x97, 0x31, 0x19, 0x04, 0x8a, 0x2d, + 0x67, 0xa4, 0x0d, 0xc5, 0x40, 0xf8, 0x7e, 0xcb, 0x2e, 0x06, 0x3e, 0x79, 0x0f, 0xee, 0x64, 0x31, + 0xd6, 0x26, 0x77, 0x16, 0x84, 0x94, 0x7f, 0x65, 0xd1, 0xff, 0xb4, 0x05, 0x7c, 0x24, 0x51, 0x5c, + 0x30, 0xa3, 0xd3, 0x94, 0x32, 0x6e, 0xda, 0xba, 0x2d, 0x67, 0xe4, 0x0d, 0xa8, 0xa7, 0x41, 0x34, + 0x77, 0xb3, 0xe0, 0x7b, 0x2a, 0x2d, 0xac, 0x20, 0x30, 0x0e, 0xbe, 0xe7, 0xfe, 0x73, 0xba, 0x9c, + 0xcd, 0x68, 0x2a, 0xc4, 0x35, 0x2e, 0x06, 0x01, 0x71, 0x05, 0x64, 0xaf, 0x5c, 0x1e, 0xb7, 0x99, + 0x6c, 0x61, 0x94, 0x74, 0xf5, 0x15, 0x9f, 0xa3, 0x90, 0xad, 0x85, 0x75, 0x21, 0x64, 0x52, 0xd8, + 0xe9, 0x4a, 0x6b, 0xf1, 0xf4, 0xd6, 0x04, 0x45, 0x77, 0x1e, 0xe9, 0xb6, 0xa9, 0x3b, 0xea, 0x16, + 0xa9, 0x42, 0xd1, 0xb0, 0xd4, 0x02, 0x9a, 0xd8, 0x9a, 0x98, 0x8e, 0x6b, 0x98, 0x5f, 0xea, 0x87, + 0x8e, 0x5a, 0xec, 0xfc, 0xa3, 0x08, 0xf5, 0x75, 0x9d, 0xc4, 0xc3, 0x65, 0xe9, 0x74, 0xdd, 0xf6, + 0x49, 0xe7, 0xce, 0xd2, 0x69, 0xde, 0xf5, 0xbd, 0x05, 0x0d, 0x3f, 0x63, 0x6b, 0x85, 0xa2, 0x50, + 0xf0, 0x33, 0x96, 0x2b, 0x60, 0xcf, 0x17, 0x05, 0xd2, 0x9a, 0x38, 0x24, 0x6f, 0x42, 0x7d, 0xb1, + 0x0c, 0x59, 0x30, 0xf5, 0x32, 0x26, 0x0d, 0x79, 0x09, 0x90, 0x87, 0x50, 0x9a, 0x27, 0x94, 0x1b, + 0xb0, 0xd1, 0xbd, 0x7f, 0x5b, 0x21, 0xdf, 0x3b, 0x4e, 0xa8, 0x8d, 0x84, 0xed, 0xbf, 0x14, 0xa0, + 0x74, 0x9c, 0x50, 0xb2, 0x83, 0xd9, 0x76, 0xea, 0x25, 0xee, 0x79, 0x3a, 0xc3, 0x98, 0x13, 0x69, + 0x0f, 0x38, 0xf6, 0x24, 0x9d, 0x19, 0x3e, 0x31, 0x40, 0xe1, 0xbd, 0xf4, 0x34, 0x0e, 0x65, 0x56, + 0xff, 0xf0, 0x65, 0xb6, 0xd9, 0xb3, 0x24, 0xc9, 0x5e, 0xd3, 0x3b, 0x5f, 0x80, 0x92, 0xa3, 0x57, + 0x73, 0x77, 0x0d, 0x4a, 0x86, 0xf5, 0x91, 0x5a, 0x10, 0x83, 0x87, 0x22, 0x63, 0xaf, 0xcd, 0x5f, + 0x42, 0xd8, 0x1c, 0x3f, 0x52, 0xcb, 0x9d, 0x3f, 0x40, 0x73, 0xb3, 0x13, 0x22, 0xf7, 0xa1, 0x79, + 0x16, 0x67, 0xcc, 0x0d, 0x66, 0x1b, 0xe9, 0x04, 0x9b, 0x0e, 0x1b, 0x10, 0x37, 0x66, 0x3c, 0xa5, + 0xbc, 0x07, 0x77, 0xc2, 0x20, 0x5a, 0xae, 0xdc, 0xf5, 0x61, 0xa5, 0xe5, 0xdb, 0x1c, 0x5e, 0x27, + 0x0a, 0x4c, 0xd7, 0x35, 0xd9, 0x2b, 0x61, 0x77, 0x7f, 0x4e, 0xd3, 0x0c, 0x53, 0x8d, 0x30, 0x4a, + 0x3e, 0x45, 0x9b, 0x5d, 0xd9, 0x54, 0x7e, 0xc5, 0xab, 0x1b, 0xb2, 0xd8, 0x5d, 0x04, 0xd3, 0x34, + 0xce, 0x68, 0x7a, 0x1e, 0x4c, 0x45, 0x19, 0xab, 0xdb, 0x6d, 0x16, 0x9f, 0x6c, 0xa0, 0xb8, 0x54, + 0xba, 0x72, 0x2f, 0xbd, 0xbd, 0x2c, 0xcc, 0x9f, 0xae, 0xec, 0xdc, 0xdf, 0x77, 0xa0, 0xc9, 0x36, + 0x35, 0x44, 0x16, 0x02, 0x76, 0xa9, 0x71, 0x0f, 0x40, 0xbc, 0x3b, 0xdc, 0x79, 0x16, 0xf3, 0x78, + 0x51, 0xec, 0xba, 0x40, 0x8e, 0xb3, 0x98, 0xbc, 0x0d, 0x2d, 0x29, 0x66, 0xcb, 0x28, 0xa2, 0xa1, + 0x7c, 0x31, 0x34, 0x05, 0xe8, 0x70, 0xac, 0xf3, 0xef, 0x12, 0xd4, 0xd7, 0x4d, 0x1b, 0x3a, 0x21, + 0xcd, 0x22, 0x19, 0xe6, 0x38, 0x44, 0xbf, 0xf5, 0x22, 0x16, 0xb8, 0x29, 0x4d, 0x42, 0xef, 0x22, + 0x2f, 0x74, 0x08, 0xd9, 0x1c, 0x21, 0xaf, 0x83, 0x12, 0xc6, 0x53, 0x2f, 0xc4, 0xde, 0x41, 0x38, + 0x69, 0x8d, 0xcf, 0x8d, 0x84, 0x07, 0x24, 0x5d, 0xc4, 0x8c, 0xa2, 0x4c, 0x44, 0xba, 0x22, 0x00, + 0x21, 0x14, 0xbc, 0x2c, 0x09, 0xf2, 0x58, 0xe7, 0xc0, 0x38, 0x09, 0xf0, 0x66, 0x92, 0x89, 0x52, + 0x11, 0xea, 0x72, 0x2d, 0x14, 0xff, 0x1a, 0x60, 0x9a, 0x5e, 0x24, 0x2c, 0x76, 0xbd, 0x70, 0xce, + 0x43, 0xbd, 0xdd, 0x7d, 0xe3, 0x8a, 0x6f, 0xf2, 0x97, 0xe0, 0x21, 0xd7, 0xe9, 0x85, 0x73, 0xbb, + 0x3e, 0xcd, 0x87, 0x64, 0x17, 0x54, 0xb1, 0xaf, 0x5c, 0xe1, 0x29, 0xbd, 0xe0, 0xf9, 0x00, 0x7d, + 0x02, 0x71, 0x41, 0x7a, 0x4c, 0x2f, 0xb0, 0x3d, 0x92, 0x87, 0xd8, 0x50, 0x05, 0xd1, 0x1e, 0x09, + 0xc1, 0xa5, 0xee, 0x27, 0x50, 0x47, 0x17, 0x9b, 0xf3, 0x03, 0x35, 0xf8, 0x81, 0xb6, 0x7f, 0x7c, + 0x20, 0xf4, 0xb7, 0x39, 0x9e, 0x47, 0x09, 0xe4, 0x08, 0x1f, 0x76, 0xd2, 0x7c, 0x9c, 0x8e, 0x5b, + 0x34, 0xf9, 0x16, 0x2d, 0x61, 0x45, 0x44, 0x71, 0x83, 0x5d, 0x50, 0x73, 0x5b, 0xae, 0x15, 0x5b, + 0xe2, 0xd8, 0xd2, 0xa4, 0x1b, 0x9a, 0xf2, 0xb3, 0x2f, 0xfd, 0xc4, 0xa5, 0xd1, 0xd4, 0x4b, 0xf8, + 0x63, 0x50, 0xb1, 0xdb, 0x02, 0x9f, 0xf8, 0x89, 0x8e, 0x68, 0xc7, 0x87, 0xc6, 0x46, 0xbb, 0x8d, + 0x9f, 0x5a, 0x12, 0x69, 0x18, 0xcf, 0xa5, 0x13, 0x48, 0x0f, 0xd3, 0xc3, 0x78, 0x8e, 0x9f, 0x3a, + 0x5d, 0x3d, 0x13, 0xde, 0x28, 0xf2, 0x54, 0x2d, 0x5d, 0x3d, 0xe3, 0xae, 0xf8, 0x3a, 0x28, 0x2c, + 0x17, 0x09, 0x57, 0xae, 0x31, 0x21, 0x42, 0x0f, 0x53, 0xf2, 0xc6, 0x5c, 0x96, 0x8c, 0xc2, 0xba, + 0x64, 0x7c, 0x2a, 0x4b, 0x93, 0xa8, 0xe9, 0xf7, 0x6f, 0xe9, 0xeb, 0xf7, 0x36, 0x8a, 0xd2, 0x67, + 0x50, 0x0c, 0x4f, 0xf9, 0x5e, 0xed, 0x6b, 0x1f, 0xa4, 0x6b, 0xde, 0x30, 0xf6, 0xfc, 0xbe, 0x17, + 0x7a, 0xd1, 0x94, 0xda, 0xc5, 0xf0, 0x94, 0x7c, 0x07, 0x77, 0xf1, 0x7d, 0x40, 0xfd, 0xcb, 0xc4, + 0x90, 0xbf, 0x48, 0x1f, 0xdc, 0xb6, 0x56, 0x9f, 0x13, 0xd7, 0xa9, 0xc3, 0x56, 0x4f, 0xaf, 0x02, + 0xd9, 0x76, 0x08, 0x77, 0x7e, 0xa0, 0xf4, 0xc2, 0x1f, 0x20, 0xee, 0x01, 0x04, 0x99, 0x9b, 0x78, + 0x59, 0x16, 0x9c, 0x53, 0x69, 0xee, 0x7a, 0x90, 0x59, 0x02, 0x40, 0xcf, 0x08, 0x32, 0x37, 0x8c, + 0xa3, 0xb9, 0xcb, 0x82, 0x05, 0x8d, 0x97, 0x4c, 0x46, 0x5f, 0x2b, 0xc8, 0x86, 0x71, 0x34, 0x77, + 0x04, 0xd8, 0xf9, 0x16, 0xca, 0xbc, 0x6e, 0x5d, 0xc9, 0xab, 0x77, 0xa0, 0x61, 0x8f, 0x26, 0xe6, + 0xc0, 0xb5, 0x47, 0x7d, 0xc3, 0x54, 0x0b, 0xd8, 0x72, 0xf6, 0x0e, 0xb1, 0x0d, 0x76, 0xb1, 0xb3, + 0x9c, 0x58, 0x6a, 0x11, 0x73, 0xeb, 0x37, 0x23, 0x5b, 0x2d, 0x61, 0x1b, 0xd9, 0xb7, 0x47, 0xbd, + 0xc1, 0x61, 0x6f, 0xec, 0xa8, 0x65, 0x6c, 0x45, 0x86, 0xbd, 0x43, 0x4b, 0xad, 0x74, 0x3e, 0x87, + 0xc6, 0x86, 0xe5, 0xb0, 0x16, 0x0e, 0xbb, 0x22, 0x69, 0x0f, 0x0f, 0x64, 0xd2, 0x1e, 0x76, 0x0f, + 0xd4, 0x22, 0x4a, 0x6c, 0x5c, 0xa9, 0x0a, 0xc5, 0xfe, 0xa1, 0x5a, 0xc6, 0xff, 0xbd, 0xbe, 0x5a, + 0xe9, 0xfc, 0xab, 0x00, 0x35, 0xf9, 0xbc, 0x22, 0x03, 0x68, 0x88, 0x3c, 0xe4, 0xf2, 0x9f, 0x5d, + 0x44, 0x33, 0xf2, 0xf6, 0xcd, 0x6f, 0x32, 0xf1, 0x3c, 0x00, 0xc1, 0xe3, 0xed, 0xf4, 0xeb, 0xa0, + 0xe4, 0x85, 0x56, 0xa6, 0xdf, 0x9a, 0xac, 0xb2, 0x28, 0xca, 0x4b, 0xac, 0x4c, 0xba, 0x35, 0x59, + 0x5f, 0x31, 0x97, 0xe2, 0x03, 0x28, 0x75, 0x67, 0x01, 0x6f, 0x30, 0x65, 0xb6, 0xe5, 0xd8, 0x51, + 0x80, 0x5d, 0xe6, 0x3d, 0x80, 0x8c, 0x66, 0x98, 0xe5, 0x51, 0x2e, 0x72, 0x6d, 0x5d, 0x22, 0x86, + 0xdf, 0xf9, 0xe5, 0x8b, 0x1e, 0x1e, 0x68, 0x8f, 0x03, 0x61, 0x06, 0x47, 0xef, 0xab, 0x45, 0x02, + 0x50, 0xd5, 0xed, 0xb1, 0xd5, 0x33, 0xd5, 0x52, 0xe7, 0xcf, 0x45, 0x50, 0xf2, 0x47, 0xe2, 0x95, + 0x53, 0x17, 0xae, 0x3f, 0x75, 0xf1, 0xea, 0xa9, 0xaf, 0x34, 0x00, 0xa5, 0x1f, 0x36, 0x00, 0xd8, + 0x89, 0xd2, 0xf5, 0x5d, 0xf8, 0x18, 0xef, 0xc9, 0x03, 0x3e, 0x2f, 0xea, 0xb2, 0x66, 0x70, 0x4c, + 0x14, 0xf5, 0x63, 0x10, 0x25, 0xde, 0x8d, 0xe8, 0x8a, 0xf1, 0xbc, 0xdb, 0xee, 0xee, 0xde, 0xf2, + 0xc6, 0xdd, 0x33, 0xe9, 0x8a, 0x99, 0x18, 0x7a, 0x75, 0xce, 0xc5, 0x69, 0x67, 0x1f, 0x94, 0x1c, + 0xde, 0x7c, 0x57, 0x6d, 0x49, 0x2f, 0x29, 0xe4, 0xa5, 0xbd, 0x98, 0x97, 0xf6, 0x52, 0xe7, 0xaf, + 0x05, 0x50, 0xf2, 0x07, 0x30, 0xd1, 0xd7, 0xee, 0xb0, 0xd1, 0x9b, 0xde, 0xbf, 0xe5, 0xd9, 0x2c, + 0x12, 0x80, 0xf4, 0x07, 0xee, 0xf5, 0xff, 0x97, 0x3f, 0x74, 0x0e, 0x64, 0xcc, 0x10, 0x68, 0x5b, + 0x23, 0xc3, 0x74, 0x5c, 0x67, 0xe4, 0xf2, 0x81, 0xba, 0x45, 0x7e, 0x0a, 0x3f, 0x59, 0x63, 0x27, + 0x93, 0xa1, 0x63, 0x08, 0x41, 0xa1, 0x7f, 0xf4, 0xfb, 0xc1, 0x3c, 0xce, 0x0f, 0x18, 0xf0, 0x1f, + 0x1e, 0x3f, 0xf4, 0xe6, 0x34, 0x62, 0x0f, 0xce, 0x0f, 0x1e, 0xf0, 0x56, 0xe7, 0xc1, 0x0b, 0x7f, + 0xd0, 0xfc, 0xec, 0x3c, 0x49, 0x36, 0xf2, 0xcc, 0x69, 0x95, 0xeb, 0x1e, 0xfc, 0x2f, 0x00, 0x00, + 0xff, 0xff, 0xa2, 0xff, 0xc1, 0x19, 0xff, 0x14, 0x00, 0x00, } diff --git a/proto/ligato/vpp/interfaces/interface.proto b/proto/ligato/vpp/interfaces/interface.proto index 2929fdcb35..7ac45c39c9 100644 --- a/proto/ligato/vpp/interfaces/interface.proto +++ b/proto/ligato/vpp/interfaces/interface.proto @@ -51,10 +51,26 @@ message Interface { // the interface referenced by the numbered interface and this field is ignored. uint32 vrf = 6; + // SetDhcpClient enables DHCP client on interface. bool set_dhcp_client = 7; + + // Ip6Nd is used to enable/disable IPv6 ND address autoconfiguration + // and setting up default routes + message IP6ND { + // Enable IPv6 ND address autoconfiguration. + bool address_autoconfig = 1; + // Enable installing default routes. + bool install_default_routes = 2; + } + IP6ND ip6_nd = 14; + + // Mtu sets MTU (Maximum Transmission Unit) for this interface. + // If set to zero, default MTU (usually 9216) will be used. uint32 mtu = 8; + // Unnumbered is used for inheriting IP address from another interface. message Unnumbered { + // InterfaceWithIp is the name of interface to inherit IP address from. string interface_with_ip = 1; } Unnumbered unnumbered = 9; diff --git a/proto/ligato/vpp/interfaces/models.go b/proto/ligato/vpp/interfaces/models.go index 87e4feaf70..d4aa67f1c1 100644 --- a/proto/ligato/vpp/interfaces/models.go +++ b/proto/ligato/vpp/interfaces/models.go @@ -115,6 +115,13 @@ const ( BondedInterfacePrefix = "vpp/bond/{bond}/interface/{iface}/" ) +/* DHCP (client - derived, lease - notification) */ +const ( + // IP6NDKeyPrefix is used as a common prefix for keys derived from + // interfaces to represent enabled IP6 ND. + IP6NDKeyPrefix = "vpp/interface/ip6nd/" +) + /* DHCP (client - derived, lease - notification) */ const ( // DHCPClientKeyPrefix is used as a common prefix for keys derived from @@ -444,6 +451,22 @@ func ParseBondedInterfaceKey(key string) (bondIf, slaveIf string, isBondSlaveInt return "", "", false } +// IP6NDKey returns a (derived) key used to represent enabled IP6 ND. +func IP6NDKey(iface string) string { + if iface == "" { + iface = InvalidKeyPart + } + return IP6NDKeyPrefix + iface +} + +// ParseNameFromIP6NDKey returns suffix of the key. +func ParseNameFromIP6NDKey(key string) (iface string, isIP6NDKey bool) { + if suffix := strings.TrimPrefix(key, IP6NDKeyPrefix); suffix != key && suffix != "" { + return suffix, true + } + return +} + /* DHCP (client - derived, lease - notification) */ // DHCPClientKey returns a (derived) key used to represent enabled DHCP lease. diff --git a/proto/ligato/vpp/l3/l3.pb.go b/proto/ligato/vpp/l3/l3.pb.go index 28711aac14..eb5646ec4c 100644 --- a/proto/ligato/vpp/l3/l3.pb.go +++ b/proto/ligato/vpp/l3/l3.pb.go @@ -51,7 +51,9 @@ func (IPScanNeighbor_Mode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_eb46f906a6f7c0e7, []int{1, 0} } +// ARP Proxy type ProxyARP struct { + // List of interfaces proxy ARP is enabled for. Interfaces []*ProxyARP_Interface `protobuf:"bytes,1,rep,name=interfaces,proto3" json:"interfaces,omitempty"` Ranges []*ProxyARP_Range `protobuf:"bytes,2,rep,name=ranges,proto3" json:"ranges,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -192,6 +194,7 @@ func (m *ProxyARP_Range) GetVrfId() uint32 { return 0 } +// IP Neighbour Config type IPScanNeighbor struct { Mode IPScanNeighbor_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=ligato.vpp.l3.IPScanNeighbor_Mode" json:"mode,omitempty"` ScanInterval uint32 `protobuf:"varint,2,opt,name=scan_interval,json=scanInterval,proto3" json:"scan_interval,omitempty"` @@ -271,6 +274,7 @@ func (m *IPScanNeighbor) GetStaleThreshold() uint32 { return 0 } +// DHCP Proxy type DHCPProxy struct { SourceIpAddress string `protobuf:"bytes,1,opt,name=source_ip_address,json=sourceIpAddress,proto3" json:"source_ip_address,omitempty"` RxVrfId uint32 `protobuf:"varint,2,opt,name=rx_vrf_id,json=rxVrfId,proto3" json:"rx_vrf_id,omitempty"` diff --git a/proto/ligato/vpp/l3/l3.proto b/proto/ligato/vpp/l3/l3.proto index a212272399..6da9c473a9 100644 --- a/proto/ligato/vpp/l3/l3.proto +++ b/proto/ligato/vpp/l3/l3.proto @@ -4,10 +4,12 @@ package ligato.vpp.l3; option go_package = "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l3;vpp_l3"; +// ARP Proxy message ProxyARP { message Interface { string name = 1; } + // List of interfaces proxy ARP is enabled for. repeated Interface interfaces = 1; message Range { @@ -18,6 +20,7 @@ message ProxyARP { repeated Range ranges = 2; } +// IP Neighbour Config message IPScanNeighbor { enum Mode { DISABLED = 0; @@ -34,6 +37,7 @@ message IPScanNeighbor { uint32 stale_threshold = 6; } +// DHCP Proxy message DHCPProxy { message DHCPServer { diff --git a/scripts/make/buf.make b/scripts/make/buf.make index e34c300d7d..9b9659b4f9 100644 --- a/scripts/make/buf.make +++ b/scripts/make/buf.make @@ -11,8 +11,8 @@ endif REMOTE_GIT := https://github.com/ligato/vpp-agent.git CHECK_BREAKING_BRANCH := master -# https://github.com/bufbuild/buf/releases 20200101 -BUF_VERSION := 0.5.0 +# https://github.com/bufbuild/buf/releases 20200625 +BUF_VERSION := 0.18.1 # https://github.com/golang/protobuf/releases 20190709 PROTOC_GEN_GO_VERSION ?= v1.3.3 # https://github.com/protocolbuffers/protobuf/releases 20191213 diff --git a/tests/integration/vpp/032_ip6nd_test.go b/tests/integration/vpp/032_ip6nd_test.go new file mode 100644 index 0000000000..cc0e87ea4f --- /dev/null +++ b/tests/integration/vpp/032_ip6nd_test.go @@ -0,0 +1,66 @@ +// Copyright (c) 2020 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package vpp + +import ( + "testing" + + . "github.com/onsi/gomega" + + "go.ligato.io/cn-infra/v2/logging/logrus" + + "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/ifaceidx" + ifplugin_vppcalls "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin/vppcalls" + "go.ligato.io/vpp-agent/v3/plugins/vpp/l3plugin/vrfidx" + vpp_l3 "go.ligato.io/vpp-agent/v3/proto/ligato/vpp/l3" + + _ "go.ligato.io/vpp-agent/v3/plugins/vpp/ifplugin" +) + +func TestIP6ND(t *testing.T) { + test := setupVPP(t) + defer test.teardownVPP() + + if test.versionInfo.Release() < "20.01" { + t.Skipf("SKIP for VPP %s<20.01", test.versionInfo.Release()) + } + + ih := ifplugin_vppcalls.CompatibleInterfaceVppHandler(test.vppClient, logrus.NewLogger("test")) + const ifName = "loop1" + ifIdx, err := ih.AddLoopbackInterface(ifName) + if err != nil { + t.Fatalf("creating interface failed: %v", err) + } + if err = ih.InterfaceAdminUp(test.Ctx, ifIdx); err != nil { + t.Fatalf("setting interface up failed: %v", err) + } + t.Logf("interface created %v", ifIdx) + + ifIndexes := ifaceidx.NewIfaceIndex(logrus.NewLogger("test-if"), "test-if") + ifIndexes.Put(ifName, &ifaceidx.IfaceMetadata{SwIfIndex: ifIdx}) + vrfIndexes := vrfidx.NewVRFIndex(logrus.NewLogger("test-vrf"), "test-vrf") + vrfIndexes.Put("vrf1-ipv4", &vrfidx.VRFMetadata{Index: 0, Protocol: vpp_l3.VrfTable_IPV4}) + vrfIndexes.Put("vrf1-ipv6", &vrfidx.VRFMetadata{Index: 0, Protocol: vpp_l3.VrfTable_IPV6}) + + err = ih.SetIP6ndAutoconfig(test.Ctx, ifIdx, true, true) + Expect(err).To(Succeed()) + + out, err := test.vpp.RunCli(test.Ctx, "show ip6 fib") + Expect(err).To(Succeed()) + Expect(out).To(ContainSubstring("default-route:1")) + // TODO: fix test assert + + t.Logf("CLI output: %s", out) +} diff --git a/tests/integration/vpp_integration.sh b/tests/integration/vpp_integration.sh index 645bb8a38d..df877b8f5f 100755 --- a/tests/integration/vpp_integration.sh +++ b/tests/integration/vpp_integration.sh @@ -8,6 +8,8 @@ go test -c ./tests/integration/vpp -o ./tests/integration/vpp/vpp-integration.te cid=$(docker run -d -it \ -v $(pwd)/tests/integration/vpp/vpp-integration.test:/vpp-integration.test:ro \ --label vpp.integration.test="$*" \ + -e INITIAL_LOGLVL \ + -e DEBUG_GOVPP \ ${DOCKER_ARGS-} \ "$VPP_IMG" bash)