Skip to content

Commit

Permalink
query multiple reports at once based on the report size (#32)
Browse files Browse the repository at this point in the history
* query multiple reports at once based on the report size

* comment unused function

* get ur size from g0-gtp5nl

* refactor code

---------

Co-authored-by: roy19991013 <80-ChienAn@users.noreply.gitlab.nems.cs.nctu.edu.tw>
Co-authored-by: Tim Liu <timliu@nctu.edu.tw>
  • Loading branch information
3 people committed Jun 29, 2023
1 parent 4474dc8 commit efae753
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 32 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.14
require (
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d
github.com/davecgh/go-spew v1.1.1
github.com/free5gc/go-gtp5gnl v1.4.5
github.com/free5gc/go-gtp5gnl v1.4.6-0.20230629034810-9a49c0a5ee2f
github.com/free5gc/util v1.0.5-0.20230511064842-2e120956883b
github.com/hashicorp/go-version v1.6.0
github.com/khirono/go-genl v1.0.1
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ=
github.com/free5gc/go-gtp5gnl v1.4.5 h1:w4mHuEue4hwpnQdYc19C5sXmxvYLZ0s2vJyDNdmt2wk=
github.com/free5gc/go-gtp5gnl v1.4.5/go.mod h1:TT5aXB90NuSPMehuIK9lV2yJFnq6Qjw37ZqNB1QAKh0=
github.com/free5gc/go-gtp5gnl v1.4.6-0.20230629034810-9a49c0a5ee2f h1:+D0L2ixhbg6Iy/oQEAJQLmOU/w1mmndqVF78GdjX1yo=
github.com/free5gc/go-gtp5gnl v1.4.6-0.20230629034810-9a49c0a5ee2f/go.mod h1:TT5aXB90NuSPMehuIK9lV2yJFnq6Qjw37ZqNB1QAKh0=
github.com/free5gc/util v1.0.5-0.20230511064842-2e120956883b h1:XMw3j+4AEXLeL/uyiZ7/qYE1X7Ul05RTwWBhzxCLi+0=
github.com/free5gc/util v1.0.5-0.20230511064842-2e120956883b/go.mod h1:l2Jrml4vojDomW5jdDJhIS60KdbrE9uPYhyAq/7OnF4=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
Expand Down
65 changes: 36 additions & 29 deletions internal/forwarder/gtp5g.go
Original file line number Diff line number Diff line change
Expand Up @@ -1439,23 +1439,7 @@ func (g *Gtp5g) QueryURR(lSeid uint64, urrid uint32) ([]report.USAReport, error)
}

func (g *Gtp5g) psQueryURR(lSeidUrridsMap map[uint64][]uint32) (map[uint64][]report.USAReport, error) {
seidUsars := make(map[uint64][]report.USAReport)

for lSeid, urrids := range lSeidUrridsMap {
for _, urrid := range urrids {
usars, err := g.queryURR(lSeid, urrid, true)
if err != nil {
g.log.Warnf("psQueryURR: %v", err)
continue
}
if len(usars) == 0 {
g.log.Warnf("psQueryURR: no reports for URR[%#x:%#x]", lSeid, urrid)
continue
}
seidUsars[lSeid] = append(seidUsars[lSeid], usars...)
}
}
return seidUsars, nil
return g.queryMultiURR(lSeidUrridsMap, true)
}

func (g *Gtp5g) queryURR(lSeid uint64, urrid uint32, ps bool) ([]report.USAReport, error) {
Expand Down Expand Up @@ -1500,36 +1484,59 @@ func (g *Gtp5g) queryURR(lSeid uint64, urrid uint32, ps bool) ([]report.USARepor
return usars, nil
}

// Note: the max size of netlink msg is 16k,
// the number of reports from gtp5g is limited
// depending on the size of report
func (g *Gtp5g) QueryMultiURR(lSeidUrridsMap map[uint64][]uint32) (map[uint64][]report.USAReport, error) {
return g.queryMultiURR(lSeidUrridsMap, false)
}

func (g *Gtp5g) queryMultiURR(lSeidUrridsMap map[uint64][]uint32, ps bool) (map[uint64][]report.USAReport, error) {
var oids []gtp5gnl.OID
var reports []gtp5gnl.USAReport

c := g.client
if ps {
c = g.psClient
}

// Note: the max size of netlink msg is 16k,
// the number of reports from gtp5g is limited
// depending on the size of report
queryNum := 0
queryNumOnce := gtp5gnl.MaxNetlinkUsageReportNum()
for seid, urrIds := range lSeidUrridsMap {
for _, urrId := range urrIds {
oids = append(oids, gtp5gnl.OID{seid, uint64(urrId)})
queryNum++

if queryNum >= queryNumOnce {
rs, err := gtp5gnl.GetMultiReportsOID(c, g.link.link, oids)
if err != nil {
return nil, errors.Wrapf(err, "queryMultiURR[%+v]", lSeidUrridsMap)
}

g.log.Tracef("Reports number in one netlink request: %+v", len(rs))
reports = append(reports, rs...)
oids = oids[:0]
queryNum = 0
}
}
}

c := g.client
if ps {
c = g.psClient
}
rs, err := gtp5gnl.GetMultiReportsOID(c, g.link.link, oids)
if err != nil {
return nil, errors.Wrapf(err, "queryMultiURR[%+v]", lSeidUrridsMap)
if len(oids) > 0 {
rs, err := gtp5gnl.GetMultiReportsOID(c, g.link.link, oids)
if err != nil {
return nil, errors.Wrapf(err, "queryMultiURR[%+v]", lSeidUrridsMap)
}

g.log.Tracef("Reports number in one netlink request: %+v", len(rs))
reports = append(reports, rs...)
}

if rs == nil {
if reports == nil {
return nil, nil
}

usars := make(map[uint64][]report.USAReport)
for _, r := range rs {
for _, r := range reports {
usar := report.USAReport{
URRID: r.URRID,
QueryUrrRef: r.QueryUrrRef,
Expand Down

0 comments on commit efae753

Please sign in to comment.