From 47a003ce001255c7e301560464ca13f5b5cffcc6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 21:53:32 -0700 Subject: [PATCH 1/4] build(deps): bump google.golang.org/protobuf from 1.34.1 to 1.34.2 (#333) Bumps google.golang.org/protobuf from 1.34.1 to 1.34.2. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 6d2fe44f..c940c19c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 github.com/xdg-go/scram v1.1.2 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.34.2 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/go.sum b/go.sum index 39067d9c..f5469825 100644 --- a/go.sum +++ b/go.sum @@ -122,8 +122,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From f363efffcd870f132ce157e72ec758f06b03739a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:42:39 -0700 Subject: [PATCH 2/4] build(deps): bump github.com/oschwald/geoip2-golang from 1.9.0 to 1.11.0 (#332) * build(deps): bump github.com/oschwald/geoip2-golang from 1.9.0 to 1.11.0 Bumps [github.com/oschwald/geoip2-golang](https://github.com/oschwald/geoip2-golang) from 1.9.0 to 1.11.0. - [Release notes](https://github.com/oschwald/geoip2-golang/releases) - [Commits](https://github.com/oschwald/geoip2-golang/compare/v1.9.0...v1.11.0) --- updated-dependencies: - dependency-name: github.com/oschwald/geoip2-golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: lspgn --- go.mod | 10 ++++++---- go.sum | 19 +++++++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index c940c19c..fa598599 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,13 @@ module github.com/netsampler/goflow2/v2 -go 1.20 +go 1.21 + +toolchain go1.21.0 require ( github.com/Shopify/sarama v1.38.1 github.com/libp2p/go-reuseport v0.4.0 - github.com/oschwald/geoip2-golang v1.9.0 + github.com/oschwald/geoip2-golang v1.11.0 github.com/prometheus/client_golang v1.19.1 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.9.0 @@ -32,7 +34,7 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.15.14 // indirect github.com/kr/text v0.2.0 // indirect - github.com/oschwald/maxminddb-golang v1.11.0 // indirect + github.com/oschwald/maxminddb-golang v1.13.0 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.5.0 // indirect @@ -43,7 +45,7 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect golang.org/x/crypto v0.18.0 // indirect golang.org/x/net v0.20.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index f5469825..21702731 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= @@ -16,9 +17,11 @@ github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1 github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -43,14 +46,15 @@ github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJk github.com/klauspost/compress v1.15.14 h1:i7WCKDToww0wA+9qrUZ1xOjp218vfFo3nTU6UHp+gOc= github.com/klauspost/compress v1.15.14/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= -github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc= -github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y= -github.com/oschwald/maxminddb-golang v1.11.0 h1:aSXMqYR/EPNjGE8epgqwDay+P30hCBZIveY0WZbAWh0= -github.com/oschwald/maxminddb-golang v1.11.0/go.mod h1:YmVI+H0zh3ySFR3w+oz8PCfglAFj3PuCmui13+P9zDg= +github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w= +github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo= +github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU= +github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -66,6 +70,7 @@ github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3c github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -100,6 +105,7 @@ golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -107,8 +113,8 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -126,6 +132,7 @@ google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6h google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= From a0f3df677960546aaeca37eb92ff215aa4f75336 Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Thu, 18 Jul 2024 05:53:32 +0200 Subject: [PATCH 3/4] chore(decoders.sflow): Cleanup constant definitions and use switch statements (#328) --- decoders/sflow/sflow.go | 119 ++++++++++++++++++++++------------- decoders/sflow/sflow_test.go | 16 ++--- 2 files changed, 80 insertions(+), 55 deletions(-) diff --git a/decoders/sflow/sflow.go b/decoders/sflow/sflow.go index 20656d72..e5995b09 100644 --- a/decoders/sflow/sflow.go +++ b/decoders/sflow/sflow.go @@ -7,14 +7,42 @@ import ( "github.com/netsampler/goflow2/v2/decoders/utils" ) +// Opaque sample_data types according to https://sflow.org/SFLOW-DATAGRAM5.txt const ( - FORMAT_EXT_SWITCH = 1001 - FORMAT_EXT_ROUTER = 1002 - FORMAT_EXT_GATEWAY = 1003 - FORMAT_RAW_PKT = 1 - FORMAT_ETH = 2 - FORMAT_IPV4 = 3 - FORMAT_IPV6 = 4 + SAMPLE_FORMAT_FLOW = 1 + SAMPLE_FORMAT_COUNTER = 2 + SAMPLE_FORMAT_EXPANDED_FLOW = 3 + SAMPLE_FORMAT_EXPANDED_COUNTER = 4 +) + +// Opaque flow_data types according to https://sflow.org/SFLOW-STRUCTS5.txt +const ( + FLOW_TYPE_RAW = 1 + FLOW_TYPE_ETH = 2 + FLOW_TYPE_IPV4 = 3 + FLOW_TYPE_IPV6 = 4 + FLOW_TYPE_EXT_SWITCH = 1001 + FLOW_TYPE_EXT_ROUTER = 1002 + FLOW_TYPE_EXT_GATEWAY = 1003 + FLOW_TYPE_EXT_USER = 1004 + FLOW_TYPE_EXT_URL = 1005 + FLOW_TYPE_EXT_MPLS = 1006 + FLOW_TYPE_EXT_NAT = 1007 + FLOW_TYPE_EXT_MPLS_TUNNEL = 1008 + FLOW_TYPE_EXT_MPLS_VC = 1009 + FLOW_TYPE_EXT_MPLS_FEC = 1010 + FLOW_TYPE_EXT_MPLS_LVP_FEC = 1011 + FLOW_TYPE_EXT_VLAN_TUNNEL = 1012 +) + +// Opaque counter_data types according to https://sflow.org/SFLOW-STRUCTS5.txt +const ( + COUNTER_TYPE_IF = 1 + COUNTER_TYPE_ETH = 2 + COUNTER_TYPE_TOKENRING = 3 + COUNTER_TYPE_VG = 4 + COUNTER_TYPE_VLAN = 5 + COUNTER_TYPE_CPU = 1001 ) type DecoderError struct { @@ -84,7 +112,7 @@ func DecodeCounterRecord(header *RecordHeader, payload *bytes.Buffer) (CounterRe Header: *header, } switch header.DataFormat { - case 1: + case COUNTER_TYPE_IF: var ifCounters IfCounters if err := utils.BinaryDecoder(payload, &ifCounters.IfIndex, @@ -110,7 +138,7 @@ func DecodeCounterRecord(header *RecordHeader, payload *bytes.Buffer) (CounterRe return counterRecord, &RecordError{header.DataFormat, err} } counterRecord.Data = ifCounters - case 2: + case COUNTER_TYPE_ETH: var ethernetCounters EthernetCounters if err := utils.BinaryDecoder(payload, ðernetCounters.Dot3StatsAlignmentErrors, @@ -145,14 +173,7 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, } var err error switch header.DataFormat { - case FORMAT_EXT_SWITCH: - extendedSwitch := ExtendedSwitch{} - err := utils.BinaryDecoder(payload, &extendedSwitch.SrcVlan, &extendedSwitch.SrcPriority, &extendedSwitch.DstVlan, &extendedSwitch.DstPriority) - if err != nil { - return flowRecord, &RecordError{header.DataFormat, err} - } - flowRecord.Data = extendedSwitch - case FORMAT_RAW_PKT: + case FLOW_TYPE_RAW: sampledHeader := SampledHeader{} if err := utils.BinaryDecoder(payload, &sampledHeader.Protocol, @@ -164,7 +185,7 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, } sampledHeader.HeaderData = payload.Bytes() flowRecord.Data = sampledHeader - case FORMAT_IPV4: + case FLOW_TYPE_IPV4: sampledIP := SampledIPv4{ SampledIPBase: SampledIPBase{ SrcIP: make([]byte, 4), @@ -184,7 +205,7 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, return flowRecord, &RecordError{header.DataFormat, err} } flowRecord.Data = sampledIP - case FORMAT_IPV6: + case FLOW_TYPE_IPV6: sampledIP := SampledIPv6{ SampledIPBase: SampledIPBase{ SrcIP: make([]byte, 16), @@ -204,7 +225,14 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, return flowRecord, &RecordError{header.DataFormat, err} } flowRecord.Data = sampledIP - case FORMAT_EXT_ROUTER: + case FLOW_TYPE_EXT_SWITCH: + extendedSwitch := ExtendedSwitch{} + err := utils.BinaryDecoder(payload, &extendedSwitch.SrcVlan, &extendedSwitch.SrcPriority, &extendedSwitch.DstVlan, &extendedSwitch.DstPriority) + if err != nil { + return flowRecord, &RecordError{header.DataFormat, err} + } + flowRecord.Data = extendedSwitch + case FLOW_TYPE_EXT_ROUTER: extendedRouter := ExtendedRouter{} if extendedRouter.NextHopIPVersion, extendedRouter.NextHop, err = DecodeIP(payload); err != nil { return flowRecord, &RecordError{header.DataFormat, err} @@ -216,7 +244,7 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, return flowRecord, &RecordError{header.DataFormat, err} } flowRecord.Data = extendedRouter - case FORMAT_EXT_GATEWAY: + case FLOW_TYPE_EXT_GATEWAY: extendedGateway := ExtendedGateway{} if extendedGateway.NextHopIPVersion, extendedGateway.NextHop, err = DecodeIP(payload); err != nil { return flowRecord, &RecordError{header.DataFormat, err} @@ -295,7 +323,9 @@ func DecodeSample(header *SampleHeader, payload *bytes.Buffer) (interface{}, err return sample, fmt.Errorf("header seq [%w]", err) } seq := header.SampleSequenceNumber - if format == FORMAT_RAW_PKT || format == FORMAT_ETH { + switch format { + case SAMPLE_FORMAT_FLOW, SAMPLE_FORMAT_COUNTER: + // Interlaced data-source format var sourceId uint32 if err := utils.BinaryDecoder(payload, &sourceId); err != nil { return sample, &FlowError{format, seq, fmt.Errorf("header source [%w]", err)} @@ -303,14 +333,15 @@ func DecodeSample(header *SampleHeader, payload *bytes.Buffer) (interface{}, err header.SourceIdType = sourceId >> 24 header.SourceIdValue = sourceId & 0x00ffffff - } else if format == FORMAT_IPV4 || format == FORMAT_IPV6 { + case SAMPLE_FORMAT_EXPANDED_FLOW, SAMPLE_FORMAT_EXPANDED_COUNTER: + // Explicit data-source format if err := utils.BinaryDecoder(payload, &header.SourceIdType, &header.SourceIdValue, ); err != nil { return sample, &FlowError{format, seq, fmt.Errorf("header source [%w]", err)} } - } else { + default: return sample, &FlowError{format, seq, fmt.Errorf("unknown format %d", format)} } @@ -318,10 +349,9 @@ func DecodeSample(header *SampleHeader, payload *bytes.Buffer) (interface{}, err var flowSample FlowSample var counterSample CounterSample var expandedFlowSample ExpandedFlowSample - if format == FORMAT_RAW_PKT { - flowSample = FlowSample{ - Header: *header, - } + switch format { + case SAMPLE_FORMAT_FLOW: + flowSample.Header = *header if err := utils.BinaryDecoder(payload, &flowSample.SamplingRate, &flowSample.SamplePool, @@ -338,23 +368,19 @@ func DecodeSample(header *SampleHeader, payload *bytes.Buffer) (interface{}, err } flowSample.Records = make([]FlowRecord, recordsCount) // max size of 1000 for protection sample = flowSample - } else if format == FORMAT_ETH || format == FORMAT_IPV6 { - if err := utils.BinaryDecoder(payload, &recordsCount); err != nil { + case SAMPLE_FORMAT_COUNTER, SAMPLE_FORMAT_EXPANDED_COUNTER: + counterSample.Header = *header + if err := utils.BinaryDecoder(payload, &counterSample.CounterRecordsCount); err != nil { return sample, &FlowError{format, seq, fmt.Errorf("eth [%w]", err)} } + recordsCount = counterSample.CounterRecordsCount if recordsCount > 1000 { // protection against ddos return sample, &FlowError{format, seq, fmt.Errorf("too many flow records: %d", recordsCount)} } - counterSample = CounterSample{ - Header: *header, - CounterRecordsCount: recordsCount, - } counterSample.Records = make([]CounterRecord, recordsCount) // max size of 1000 for protection sample = counterSample - } else if format == FORMAT_IPV4 { - expandedFlowSample = ExpandedFlowSample{ - Header: *header, - } + case SAMPLE_FORMAT_EXPANDED_FLOW: + expandedFlowSample.Header = *header if err := utils.BinaryDecoder(payload, &expandedFlowSample.SamplingRate, &expandedFlowSample.SamplePool, @@ -383,22 +409,25 @@ func DecodeSample(header *SampleHeader, payload *bytes.Buffer) (interface{}, err break } recordReader := bytes.NewBuffer(payload.Next(int(recordHeader.Length))) - if format == FORMAT_RAW_PKT || format == FORMAT_IPV4 { + switch format { + case SAMPLE_FORMAT_FLOW: record, err := DecodeFlowRecord(&recordHeader, recordReader) if err != nil { return sample, &FlowError{format, seq, fmt.Errorf("record [%w]", err)} } - if format == FORMAT_RAW_PKT { - flowSample.Records[i] = record - } else if format == FORMAT_IPV4 { - expandedFlowSample.Records[i] = record - } - } else if format == FORMAT_ETH || format == FORMAT_IPV6 { + flowSample.Records[i] = record + case SAMPLE_FORMAT_COUNTER, SAMPLE_FORMAT_EXPANDED_COUNTER: record, err := DecodeCounterRecord(&recordHeader, recordReader) if err != nil { return sample, &FlowError{format, seq, fmt.Errorf("counter [%w]", err)} } counterSample.Records[i] = record + case SAMPLE_FORMAT_EXPANDED_FLOW: + record, err := DecodeFlowRecord(&recordHeader, recordReader) + if err != nil { + return sample, &FlowError{format, seq, fmt.Errorf("record [%w]", err)} + } + expandedFlowSample.Records[i] = record } } return sample, nil diff --git a/decoders/sflow/sflow_test.go b/decoders/sflow/sflow_test.go index 7c4b773e..8c5335c2 100644 --- a/decoders/sflow/sflow_test.go +++ b/decoders/sflow/sflow_test.go @@ -23,19 +23,11 @@ func TestSFlowDecode(t *testing.T) { } buf := bytes.NewBuffer(data) var packet Packet - assert.Nil(t, DecodeMessageVersion(buf, &packet)) + assert.NoError(t, DecodeMessageVersion(buf, &packet)) } func TestExpandedSFlowDecode(t *testing.T) { - data := getExpandedSFlowDecode() - - buf := bytes.NewBuffer(data) - var packet Packet - assert.Nil(t, DecodeMessageVersion(buf, &packet)) -} - -func getExpandedSFlowDecode() []byte { - return []byte{ + data := []byte{ 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xa7, 0x72, 0xc2, 0x0f, 0x76, 0x73, 0x48, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xdc, 0x20, 0x90, 0x93, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x42, 0xa4, @@ -131,4 +123,8 @@ func getExpandedSFlowDecode() []byte { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, } + + buf := bytes.NewBuffer(data) + var packet Packet + assert.NoError(t, DecodeMessageVersion(buf, &packet)) } From b19557cbf459018308d40e464baf62457b4058ee Mon Sep 17 00:00:00 2001 From: Sven Rebhan <36194019+srebhan@users.noreply.github.com> Date: Thu, 18 Jul 2024 06:06:59 +0200 Subject: [PATCH 4/4] feat(decoders.sflow): Add decoding of ethernet flow record (#336) --- decoders/sflow/sflow.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/decoders/sflow/sflow.go b/decoders/sflow/sflow.go index e5995b09..5eeceb1d 100644 --- a/decoders/sflow/sflow.go +++ b/decoders/sflow/sflow.go @@ -185,6 +185,20 @@ func DecodeFlowRecord(header *RecordHeader, payload *bytes.Buffer) (FlowRecord, } sampledHeader.HeaderData = payload.Bytes() flowRecord.Data = sampledHeader + case FLOW_TYPE_ETH: + sampledEth := SampledEthernet{ + SrcMac: make([]byte, 6), + DstMac: make([]byte, 6), + } + if err := utils.BinaryDecoder(payload, + &sampledEth.Length, + sampledEth.SrcMac, + sampledEth.DstMac, + &sampledEth.EthType, + ); err != nil { + return flowRecord, &RecordError{header.DataFormat, err} + } + flowRecord.Data = sampledEth case FLOW_TYPE_IPV4: sampledIP := SampledIPv4{ SampledIPBase: SampledIPBase{