From eeba80aa76bb5d4d6beb142ee67f33165b830956 Mon Sep 17 00:00:00 2001 From: Varun Patil Date: Sun, 5 Jan 2025 18:24:19 +0000 Subject: [PATCH] fw: refactor mgmt typing --- fw/mgmt/cs.go | 19 ++-- fw/mgmt/face.go | 204 ++++++++++++++++++------------------- fw/mgmt/fib.go | 41 ++++---- fw/mgmt/helpers.go | 24 ++--- fw/mgmt/rib.go | 48 ++++----- fw/mgmt/strategy-choice.go | 40 ++++---- 6 files changed, 177 insertions(+), 199 deletions(-) diff --git a/fw/mgmt/cs.go b/fw/mgmt/cs.go index 89948d73..bca48938 100644 --- a/fw/mgmt/cs.go +++ b/fw/mgmt/cs.go @@ -15,6 +15,7 @@ import ( enc "github.com/named-data/ndnd/std/encoding" mgmt "github.com/named-data/ndnd/std/ndn/mgmt_2022" spec "github.com/named-data/ndnd/std/ndn/spec_2022" + "github.com/named-data/ndnd/std/utils" ) // ContentStoreModule is the module that handles Content Store Management. @@ -61,26 +62,24 @@ func (c *ContentStoreModule) handleIncomingInterest(interest *spec.Interest, pit } func (c *ContentStoreModule) config(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(c, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) c.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(c, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) c.manager.sendResponse(response, interest, pitToken, inFace) return } if (params.Flags == nil && params.Mask != nil) || (params.Flags != nil && params.Mask == nil) { core.LogWarn(c, "Flags and Mask fields must either both be present or both be not present") - response = makeControlResponse(409, "ControlParameters are incorrect", nil) + response := makeControlResponse(409, "ControlParameters are incorrect", nil) c.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -104,12 +103,10 @@ func (c *ContentStoreModule) config(interest *spec.Interest, pitToken []byte, in } } - responseParams := map[string]any{ - "Capacity": uint64(table.CsCapacity()), - "Flags": c.getFlags(), - } - - response = makeControlResponse(200, "OK", responseParams) + response := makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Capacity: utils.IdPtr(uint64(table.CsCapacity())), + Flags: utils.IdPtr(c.getFlags()), + }) c.manager.sendResponse(response, interest, pitToken, inFace) } diff --git a/fw/mgmt/face.go b/fw/mgmt/face.go index 32b8aaea..59230b54 100644 --- a/fw/mgmt/face.go +++ b/fw/mgmt/face.go @@ -69,26 +69,24 @@ func (f *FaceModule) handleIncomingInterest(interest *spec.Interest, pitToken [] } func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(f, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(f, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Uri == nil { core.LogWarn(f, "Missing URI in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -96,14 +94,14 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin URI := defn.DecodeURIString(*params.Uri) if URI == nil || URI.Canonize() != nil { core.LogWarn(f, "Cannot canonize remote URI in ControlParameters for ", interest.Name()) - response = makeControlResponse(406, "URI could not be canonized", nil) + response := makeControlResponse(406, "URI could not be canonized", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } if (params.Flags != nil && params.Mask == nil) || (params.Flags == nil && params.Mask != nil) { core.LogWarn(f, "Flags and Mask fields either both be present or both be not present") - response = makeControlResponse(409, "Incomplete Flags/Mask combination", nil) + response := makeControlResponse(409, "Incomplete Flags/Mask combination", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -113,9 +111,9 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin if existingFace != nil { core.LogWarn(f, "Cannot create face ", URI, ": Conflicts with existing face FaceID=", existingFace.FaceID(), ", RemoteURI=", existingFace.RemoteURI()) - responseParams := map[string]any{} + responseParams := &mgmt.ControlArgs{} f.fillFaceProperties(responseParams, existingFace) - response = makeControlResponse(409, "Conflicts with existing face", responseParams) + response := makeControlResponse(409, "Conflicts with existing face", responseParams) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -127,7 +125,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin remoteAddr := net.ParseIP(URI.Path()) if remoteAddr == nil { core.LogWarn(f, "Cannot create face with non-IP remote address ", URI) - response = makeControlResponse(406, "URI must be IP", nil) + response := makeControlResponse(406, "URI must be IP", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -135,7 +133,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin // Validate that remote endpoint is a unicast address if !(remoteAddr.IsGlobalUnicast() || remoteAddr.IsLinkLocalUnicast() || remoteAddr.IsLoopback()) { core.LogWarn(f, "Cannot create unicast UDP face to non-unicast address ", URI) - response = makeControlResponse(406, "URI must be unicast", nil) + response := makeControlResponse(406, "URI must be unicast", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -148,7 +146,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin } else if params.FacePersistency != nil { core.LogWarn(f, "Unacceptable persistency ", mgmt.Persistency(*params.FacePersistency), " for UDP face specified in ControlParameters for ", interest.Name()) - response = makeControlResponse(406, "Unacceptable persistency", nil) + response := makeControlResponse(406, "Unacceptable persistency", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -168,7 +166,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin transport, err := face.MakeUnicastUDPTransport(URI, nil, persistency) if err != nil { core.LogWarn(f, "Unable to create unicast UDP face with URI ", URI, ": ", err.Error()) - response = makeControlResponse(406, "Transport error", nil) + response := makeControlResponse(406, "Transport error", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -217,7 +215,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin remoteAddr := net.ParseIP(URI.Path()) if remoteAddr == nil { core.LogWarn(f, "Cannot create face with non-IP remote address ", URI) - response = makeControlResponse(406, "URI must be IP", nil) + response := makeControlResponse(406, "URI must be IP", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -225,7 +223,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin // Validate that remote endpoint is a unicast address if !(remoteAddr.IsGlobalUnicast() || remoteAddr.IsLinkLocalUnicast() || remoteAddr.IsLoopback()) { core.LogWarn(f, "Cannot create unicast TCP face to non-unicast address ", URI) - response = makeControlResponse(406, "URI must be unicast", nil) + response := makeControlResponse(406, "URI must be unicast", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -238,7 +236,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin } else if params.FacePersistency != nil { core.LogWarn(f, "Unacceptable persistency ", mgmt.Persistency(*params.FacePersistency), " for UDP face specified in ControlParameters for ", interest.Name()) - response = makeControlResponse(406, "Unacceptable persistency", nil) + response := makeControlResponse(406, "Unacceptable persistency", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -258,7 +256,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin transport, err := face.MakeUnicastTCPTransport(URI, nil, persistency) if err != nil { core.LogWarn(f, "Unable to create unicast TCP face with URI ", URI, ":", err.Error()) - response = makeControlResponse(406, "Transport error", nil) + response := makeControlResponse(406, "Transport error", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -306,7 +304,7 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin } else { // Unsupported scheme core.LogWarn(f, "Cannot create face with URI ", URI, ": Unsupported scheme ", URI) - response = makeControlResponse(406, "Unsupported scheme "+URI.Scheme(), nil) + response := makeControlResponse(406, "Unsupported scheme "+URI.Scheme(), nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -314,32 +312,31 @@ func (f *FaceModule) create(interest *spec.Interest, pitToken []byte, inFace uin if linkService == nil { // Internal failure --> 504 core.LogWarn(f, "Transport error when creating face ", URI) - response = makeControlResponse(504, "Transport error when creating face", nil) + response := makeControlResponse(504, "Transport error when creating face", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } - core.LogInfo(f, "Created face with URI ", URI) - responseParams := map[string]any{} + responseParams := &mgmt.ControlArgs{} f.fillFaceProperties(responseParams, linkService) - response = makeControlResponse(200, "OK", responseParams) + response := makeControlResponse(200, "OK", responseParams) f.manager.sendResponse(response, interest, pitToken, inFace) + + core.LogInfo(f, "Created face with URI ", URI) } func (f *FaceModule) update(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(f, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(f, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -350,155 +347,149 @@ func (f *FaceModule) update(interest *spec.Interest, pitToken []byte, inFace uin } // Validate parameters - - responseParams := map[string]any{} + responseParams := &mgmt.ControlArgs{} areParamsValid := true selectedFace := face.FaceTable.Get(faceID) if selectedFace == nil { core.LogWarn(f, "Cannot update specified (or implicit) FaceID=", faceID, " because it does not exist") - responseParams["FaceId"] = uint64(faceID) - response = makeControlResponse(404, "Face does not exist", responseParams) + response := makeControlResponse(404, "Face does not exist", + &mgmt.ControlArgs{FaceId: utils.IdPtr(faceID)}) f.manager.sendResponse(response, interest, pitToken, inFace) return } // Can't update null (or internal) faces via management if selectedFace.RemoteURI().Scheme() == "null" || selectedFace.RemoteURI().Scheme() == "internal" { - responseParams["FaceId"] = uint64(faceID) - response = makeControlResponse(401, "Face cannot be updated via management", responseParams) + response := makeControlResponse(401, "Face cannot be updated via management", + &mgmt.ControlArgs{FaceId: utils.IdPtr(faceID)}) f.manager.sendResponse(response, interest, pitToken, inFace) return } if params.FacePersistency != nil { if selectedFace.RemoteURI().Scheme() == "ether" && *params.FacePersistency != uint64(mgmt.PersistencyPermanent) { - responseParams["FacePersistency"] = uint64(*params.FacePersistency) + responseParams.FacePersistency = params.FacePersistency areParamsValid = false } else if (selectedFace.RemoteURI().Scheme() == "udp4" || selectedFace.RemoteURI().Scheme() == "udp6") && *params.FacePersistency != uint64(mgmt.PersistencyPersistent) && *params.FacePersistency != uint64(mgmt.PersistencyPermanent) { - responseParams["FacePersistency"] = uint64(*params.FacePersistency) + responseParams.FacePersistency = params.FacePersistency areParamsValid = false } else if selectedFace.LocalURI().Scheme() == "unix" && *params.FacePersistency != uint64(mgmt.PersistencyPersistent) { - responseParams["FacePersistency"] = uint64(*params.FacePersistency) + responseParams.FacePersistency = params.FacePersistency areParamsValid = false } } if (params.Flags != nil && params.Mask == nil) || (params.Flags == nil && params.Mask != nil) { - core.LogWarn(f, "Flags and Mask fields must either both be present or both be not present") if params.Flags != nil { - responseParams["Flags"] = uint64(*params.Flags) + responseParams.Flags = params.Flags } if params.Mask != nil { - responseParams["Mask"] = uint64(*params.Mask) + responseParams.Mask = params.Mask } areParamsValid = false } if !areParamsValid { - response = makeControlResponse(409, "ControlParameters are incorrect", nil) + response := makeControlResponse(409, "ControlParameters are incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } // Actually perform face updates + // Persistency if params.FacePersistency != nil { // Correctness of FacePersistency already validated selectedFace.SetPersistency(mgmt.Persistency(*params.FacePersistency)) } - options := selectedFace.(*face.NDNLPLinkService).Options() + // Set NDNLP link service options + if lpLinkService := selectedFace.(*face.NDNLPLinkService); lpLinkService != nil { + options := lpLinkService.Options() - // Congestion - if params.BaseCongestionMarkInterval != nil && - time.Duration(*params.BaseCongestionMarkInterval)*time.Nanosecond != options.BaseCongestionMarkingInterval { - options.BaseCongestionMarkingInterval = time.Duration(*params.BaseCongestionMarkInterval) * time.Nanosecond - core.LogInfo(f, "FaceID=", faceID, ", BaseCongestionMarkingInterval=", options.BaseCongestionMarkingInterval) - } + // Congestion + if params.BaseCongestionMarkInterval != nil && + time.Duration(*params.BaseCongestionMarkInterval)*time.Nanosecond != options.BaseCongestionMarkingInterval { + options.BaseCongestionMarkingInterval = time.Duration(*params.BaseCongestionMarkInterval) * time.Nanosecond + core.LogInfo(f, "FaceID=", faceID, ", BaseCongestionMarkingInterval=", options.BaseCongestionMarkingInterval) + } - if params.DefaultCongestionThreshold != nil && - *params.DefaultCongestionThreshold != options.DefaultCongestionThresholdBytes { - options.DefaultCongestionThresholdBytes = *params.DefaultCongestionThreshold - core.LogInfo(f, "FaceID=", faceID, ", DefaultCongestionThreshold=", options.DefaultCongestionThresholdBytes, "B") - } + if params.DefaultCongestionThreshold != nil && + *params.DefaultCongestionThreshold != options.DefaultCongestionThresholdBytes { + options.DefaultCongestionThresholdBytes = *params.DefaultCongestionThreshold + core.LogInfo(f, "FaceID=", faceID, ", DefaultCongestionThreshold=", options.DefaultCongestionThresholdBytes, "B") + } - // MTU - if params.Mtu != nil { - oldMTU := selectedFace.MTU() - newMTU := int(*params.Mtu) - if *params.Mtu > defn.MaxNDNPacketSize { - newMTU = defn.MaxNDNPacketSize + // MTU + if params.Mtu != nil { + oldMTU := selectedFace.MTU() + newMTU := min(int(*params.Mtu), defn.MaxNDNPacketSize) + selectedFace.SetMTU(newMTU) + core.LogInfo(f, "FaceID=", faceID, ", MTU ", oldMTU, " -> ", newMTU) } - selectedFace.SetMTU(newMTU) - core.LogInfo(f, "FaceID=", faceID, ", MTU ", oldMTU, " -> ", newMTU) - } - // Flags - if params.Flags != nil { - // Presence of mask already validated - flags := *params.Flags - mask := *params.Mask + // Flags + if params.Mask != nil && params.Flags != nil { + flags := *params.Flags + mask := *params.Mask - if mask&face.FaceFlagLocalFields > 0 { - // Update LocalFieldsEnabled - if flags&face.FaceFlagLocalFields > 0 { - core.LogInfo(f, "FaceID=", faceID, ", Enabling local fields") - options.IsConsumerControlledForwardingEnabled = true - options.IsIncomingFaceIndicationEnabled = true - options.IsLocalCachePolicyEnabled = true - } else { - core.LogInfo(f, "FaceID=", faceID, ", Disabling local fields") - options.IsConsumerControlledForwardingEnabled = false - options.IsIncomingFaceIndicationEnabled = false - options.IsLocalCachePolicyEnabled = false + if mask&face.FaceFlagLocalFields > 0 { + if flags&face.FaceFlagLocalFields > 0 { + core.LogInfo(f, "FaceID=", faceID, ", Enabling local fields") + options.IsConsumerControlledForwardingEnabled = true + options.IsIncomingFaceIndicationEnabled = true + options.IsLocalCachePolicyEnabled = true + } else { + core.LogInfo(f, "FaceID=", faceID, ", Disabling local fields") + options.IsConsumerControlledForwardingEnabled = false + options.IsIncomingFaceIndicationEnabled = false + options.IsLocalCachePolicyEnabled = false + } } - } - if mask&face.FaceFlagCongestionMarking > 0 { - // Update CongestionMarkingEnabled - options.IsCongestionMarkingEnabled = flags&face.FaceFlagCongestionMarking > 0 - if flags&face.FaceFlagCongestionMarking > 0 { - core.LogInfo(f, "FaceID=", faceID, ", Enabling congestion marking") - } else { - core.LogInfo(f, "FaceID=", faceID, ", Disabling congestion marking") + if mask&face.FaceFlagCongestionMarking > 0 { + options.IsCongestionMarkingEnabled = flags&face.FaceFlagCongestionMarking > 0 + if flags&face.FaceFlagCongestionMarking > 0 { + core.LogInfo(f, "FaceID=", faceID, ", Enabling congestion marking") + } else { + core.LogInfo(f, "FaceID=", faceID, ", Disabling congestion marking") + } } } - } - selectedFace.(*face.NDNLPLinkService).SetOptions(options) + lpLinkService.SetOptions(options) + } f.fillFaceProperties(responseParams, selectedFace) - delete(responseParams, "Uri") - delete(responseParams, "LocalUri") - response = makeControlResponse(200, "OK", responseParams) + responseParams.Uri = nil + responseParams.LocalUri = nil + response := makeControlResponse(200, "OK", responseParams) f.manager.sendResponse(response, interest, pitToken, inFace) } func (f *FaceModule) destroy(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(f, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(f, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } if params.FaceId == nil { core.LogWarn(f, "Missing FaceId in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -510,7 +501,7 @@ func (f *FaceModule) destroy(interest *spec.Interest, pitToken []byte, inFace ui core.LogInfo(f, "Ignoring attempt to delete non-existent face with FaceID=", *params.FaceId) } - response = makeControlResponse(200, "OK", params.ToDict()) + response := makeControlResponse(200, "OK", params) f.manager.sendResponse(response, interest, pitToken, inFace) } @@ -666,17 +657,18 @@ func (f *FaceModule) createDataset(selectedFace face.LinkService) *mgmt.FaceStat return faceDataset } -func (f *FaceModule) fillFaceProperties(params map[string]any, selectedFace face.LinkService) { - params["FaceId"] = uint64(selectedFace.FaceID()) - params["Uri"] = selectedFace.RemoteURI().String() - params["LocalUri"] = selectedFace.LocalURI().String() - params["FacePersistency"] = uint64(selectedFace.Persistency()) - params["Mtu"] = uint64(selectedFace.MTU()) - params["Flags"] = 0 +func (f *FaceModule) fillFaceProperties(params *mgmt.ControlArgs, selectedFace face.LinkService) { + params.FaceId = utils.IdPtr(selectedFace.FaceID()) + params.Uri = utils.IdPtr(selectedFace.RemoteURI().String()) + params.LocalUri = utils.IdPtr(selectedFace.LocalURI().String()) + params.FacePersistency = utils.IdPtr(uint64(selectedFace.Persistency())) + params.Mtu = utils.IdPtr(uint64(selectedFace.MTU())) + params.Flags = utils.IdPtr(uint64(0)) + if linkService, ok := selectedFace.(*face.NDNLPLinkService); ok { options := linkService.Options() - params["BaseCongestionMarkInterval"] = uint64(options.BaseCongestionMarkingInterval.Nanoseconds()) - params["DefaultCongestionThreshold"] = options.DefaultCongestionThresholdBytes - params["Flags"] = uint64(options.Flags()) + params.BaseCongestionMarkInterval = utils.IdPtr(uint64(options.BaseCongestionMarkingInterval.Nanoseconds())) + params.DefaultCongestionThreshold = utils.IdPtr(options.DefaultCongestionThresholdBytes) + params.Flags = utils.IdPtr(uint64(options.Flags())) } } diff --git a/fw/mgmt/fib.go b/fw/mgmt/fib.go index b1815dc9..d46fa15c 100644 --- a/fw/mgmt/fib.go +++ b/fw/mgmt/fib.go @@ -14,6 +14,7 @@ import ( enc "github.com/named-data/ndnd/std/encoding" mgmt "github.com/named-data/ndnd/std/ndn/mgmt_2022" spec "github.com/named-data/ndnd/std/ndn/spec_2022" + "github.com/named-data/ndnd/std/utils" ) // FIBModule is the module that handles FIB Management. @@ -59,26 +60,24 @@ func (f *FIBModule) handleIncomingInterest(interest *spec.Interest, pitToken []b } func (f *FIBModule) add(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(f, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(f, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Name == nil { core.LogWarn(f, "Missing Name in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -87,7 +86,7 @@ func (f *FIBModule) add(interest *spec.Interest, pitToken []byte, inFace uint64) if params.FaceId != nil && *params.FaceId != 0 { faceID = *params.FaceId if face.FaceTable.Get(faceID) == nil { - response = makeControlResponse(410, "Face does not exist", nil) + response := makeControlResponse(410, "Face does not exist", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -100,36 +99,34 @@ func (f *FIBModule) add(interest *spec.Interest, pitToken []byte, inFace uint64) table.FibStrategyTable.InsertNextHopEnc(params.Name, faceID, cost) core.LogInfo(f, "Created nexthop for ", params.Name, " to FaceID=", faceID, "with Cost=", cost) - responseParams := map[string]any{ - "Name": params.Name, - "FaceId": faceID, - "Cost": cost, - } - response = makeControlResponse(200, "OK", responseParams) + + response := makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Name: params.Name, + FaceId: utils.IdPtr(faceID), + Cost: utils.IdPtr(cost), + }) f.manager.sendResponse(response, interest, pitToken, inFace) } func (f *FIBModule) remove(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(f, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(f, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Name == nil { core.LogWarn(f, "Missing Name in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) f.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -141,11 +138,11 @@ func (f *FIBModule) remove(interest *spec.Interest, pitToken []byte, inFace uint table.FibStrategyTable.RemoveNextHopEnc(params.Name, faceID) core.LogInfo(f, "Removed nexthop for ", params.Name, " to FaceID=", faceID) - responseParams := map[string]any{ - "Name": params.Name, - "FaceId": faceID, - } - response = makeControlResponse(200, "OK", responseParams) + + response := makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Name: params.Name, + FaceId: utils.IdPtr(faceID), + }) f.manager.sendResponse(response, interest, pitToken, inFace) } diff --git a/fw/mgmt/helpers.go b/fw/mgmt/helpers.go index e38e8504..e9a50cfd 100644 --- a/fw/mgmt/helpers.go +++ b/fw/mgmt/helpers.go @@ -29,21 +29,17 @@ func decodeControlParameters(m Module, interest *spec.Interest) *mgmt.ControlArg return params.Val } -func makeControlResponse(statusCode uint64, statusText string, args map[string]any) *mgmt.ControlResponse { - if args == nil { - args = map[string]any{} +func makeControlResponse(statusCode uint64, statusText string, params *mgmt.ControlArgs) *mgmt.ControlResponse { + if params == nil { + params = &mgmt.ControlArgs{} } - ret, err := mgmt.DictToControlArgs(args) - if err != nil { - return nil - } else { - return &mgmt.ControlResponse{ - Val: &mgmt.ControlResponseVal{ - StatusCode: statusCode, - StatusText: statusText, - Params: ret, - }, - } + + return &mgmt.ControlResponse{ + Val: &mgmt.ControlResponseVal{ + StatusCode: statusCode, + StatusText: statusText, + Params: params, + }, } } diff --git a/fw/mgmt/rib.go b/fw/mgmt/rib.go index 67ca2ff3..fd4dff9a 100644 --- a/fw/mgmt/rib.go +++ b/fw/mgmt/rib.go @@ -59,26 +59,24 @@ func (r *RIBModule) handleIncomingInterest(interest *spec.Interest, pitToken []b } func (r *RIBModule) register(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(r, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(r, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Name == nil { core.LogWarn(r, "Missing Name in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -87,7 +85,7 @@ func (r *RIBModule) register(interest *spec.Interest, pitToken []byte, inFace ui if params.FaceId != nil && *params.FaceId != 0 { faceID = *params.FaceId if face.FaceTable.Get(faceID) == nil { - response = makeControlResponse(410, "Face does not exist", nil) + response := makeControlResponse(410, "Face does not exist", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -128,41 +126,39 @@ func (r *RIBModule) register(interest *spec.Interest, pitToken []byte, inFace ui core.LogInfo(r, "Created route for Prefix=", params.Name, ", FaceID=", faceID, ", Origin=", origin, ", Cost=", cost, ", Flags=0x", strconv.FormatUint(flags, 16)) } - responseParams := map[string]any{ - "Name": params.Name, - "FaceId": faceID, - "Origin": origin, - "Cost": cost, - "Flags": flags, + responseParams := &mgmt.ControlArgs{ + Name: params.Name, + FaceId: utils.IdPtr(faceID), + Origin: utils.IdPtr(origin), + Cost: utils.IdPtr(cost), + Flags: utils.IdPtr(flags), } if expirationPeriod != nil { - responseParams["ExpirationPeriod"] = uint64(expirationPeriod.Milliseconds()) + responseParams.ExpirationPeriod = utils.IdPtr(uint64(expirationPeriod.Milliseconds())) } - response = makeControlResponse(200, "OK", responseParams) + response := makeControlResponse(200, "OK", responseParams) r.manager.sendResponse(response, interest, pitToken, inFace) } func (r *RIBModule) unregister(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(r, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(r, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Name == nil { core.LogWarn(r, "Missing Name in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) r.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -178,14 +174,14 @@ func (r *RIBModule) unregister(interest *spec.Interest, pitToken []byte, inFace } table.Rib.RemoveRouteEnc(params.Name, faceID, origin) - core.LogInfo(r, "Removed route for Prefix=", params.Name, ", FaceID=", faceID, ", Origin=", origin) - responseParams := map[string]any{ - "Name": params.Name, - "FaceId": faceID, - "Origin": origin, - } - response = makeControlResponse(200, "OK", responseParams) + response := makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Name: params.Name, + FaceId: utils.IdPtr(faceID), + Origin: utils.IdPtr(origin), + }) r.manager.sendResponse(response, interest, pitToken, inFace) + + core.LogInfo(r, "Removed route for Prefix=", params.Name, ", FaceID=", faceID, ", Origin=", origin) } func (r *RIBModule) announce(interest *spec.Interest, pitToken []byte, inFace uint64) { diff --git a/fw/mgmt/strategy-choice.go b/fw/mgmt/strategy-choice.go index afe384ee..00fc33e6 100644 --- a/fw/mgmt/strategy-choice.go +++ b/fw/mgmt/strategy-choice.go @@ -62,40 +62,38 @@ func (s *StrategyChoiceModule) handleIncomingInterest(interest *spec.Interest, p } func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inFace uint64) { - var response *mgmt.ControlResponse - if len(interest.Name()) < len(LOCAL_PREFIX)+3 { // Name not long enough to contain ControlParameters core.LogWarn(s, "Missing ControlParameters in ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } params := decodeControlParameters(s, interest) if params == nil { - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Name == nil { core.LogWarn(s, "Missing Name in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } if params.Strategy == nil { core.LogWarn(s, "Missing Strategy in ControlParameters for ", interest.Name()) - response = makeControlResponse(400, "ControlParameters is incorrect", nil) + response := makeControlResponse(400, "ControlParameters is incorrect", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } if !s.strategyPrefix.IsPrefix(params.Strategy.Name) { core.LogWarn(s, "Unknown Strategy=", params.Strategy.Name, " in ControlParameters for Interest=", interest.Name()) - response = makeControlResponse(404, "Unknown strategy", nil) + response := makeControlResponse(404, "Unknown strategy", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -104,7 +102,7 @@ func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inF availableVersions, ok := fw.StrategyVersions[strategyName] if !ok { core.LogWarn(s, "Unknown Strategy=", params.Strategy, " in ControlParameters for Interest=", interest.Name()) - response = makeControlResponse(404, "Unknown strategy", nil) + response := makeControlResponse(404, "Unknown strategy", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -120,7 +118,7 @@ func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inF params.Strategy.Name[len(s.strategyPrefix)+1].Typ != enc.TypeVersionNameComponent { core.LogWarn(s, "Unknown Version=", params.Strategy.Name[len(s.strategyPrefix)+1], " for Strategy=", params.Strategy, " in ControlParameters for Interest=", interest.Name()) - response = makeControlResponse(404, "Unknown strategy version", nil) + response := makeControlResponse(404, "Unknown strategy version", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } else if len(params.Strategy.Name) > len(s.strategyPrefix)+1 { @@ -129,7 +127,7 @@ func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inF if err != nil { core.LogWarn(s, "Unknown Version=", params.Strategy.Name[len(s.strategyPrefix)+1], " for Strategy=", params.Strategy, " in ControlParameters for Interest=", interest.Name()) - response = makeControlResponse(404, "Unknown strategy version", nil) + response := makeControlResponse(404, "Unknown strategy version", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -142,7 +140,7 @@ func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inF if !foundMatchingVersion { core.LogWarn(s, "Unknown Version=", strategyVersion, " for Strategy=", params.Strategy, " in ControlParameters for Interest=", interest.Name()) - response = makeControlResponse(404, "Unknown strategy version", nil) + response := makeControlResponse(404, "Unknown strategy version", nil) s.manager.sendResponse(response, interest, pitToken, inFace) return } @@ -152,12 +150,13 @@ func (s *StrategyChoiceModule) set(interest *spec.Interest, pitToken []byte, inF } table.FibStrategyTable.SetStrategyEnc(params.Name, params.Strategy.Name) - core.LogInfo(s, "Set strategy for Name=", params.Name, " to Strategy=", params.Strategy.Name) - responseParams := map[string]any{} - responseParams["Name"] = params.Name - responseParams["Strategy"] = params.Strategy - response = makeControlResponse(200, "OK", responseParams) + response := makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Name: params.Name, + Strategy: params.Strategy, + }) s.manager.sendResponse(response, interest, pitToken, inFace) + + core.LogInfo(s, "Set strategy for Name=", params.Name, " to Strategy=", params.Strategy.Name) } func (s *StrategyChoiceModule) unset(interest *spec.Interest, pitToken []byte, inFace uint64) { @@ -193,11 +192,12 @@ func (s *StrategyChoiceModule) unset(interest *spec.Interest, pitToken []byte, i } table.FibStrategyTable.UnSetStrategyEnc(params.Name) - core.LogInfo(s, "Unset Strategy for Name=", params.Name) - responseParams := map[string]any{} - responseParams["Name"] = params.Name - response = makeControlResponse(200, "OK", responseParams) + response = makeControlResponse(200, "OK", &mgmt.ControlArgs{ + Name: params.Name, + }) s.manager.sendResponse(response, interest, pitToken, inFace) + + core.LogInfo(s, "Unset Strategy for Name=", params.Name) } func (s *StrategyChoiceModule) list(interest *spec.Interest, pitToken []byte, _ uint64) {