From f44416cdc6cb6ca5ad631cdae29844dd05c3c23c Mon Sep 17 00:00:00 2001 From: Lionel Jouin Date: Fri, 21 Oct 2022 18:17:38 +0200 Subject: [PATCH] Add MTU property as parameter of the Service Makes the MTU configurable in addition to the vlan ID and the base interface. Signed-off-by: Lionel Jouin --- internal/pkg/config/config.go | 18 +++++++++++++----- internal/pkg/config/config_test.go | 4 +++- .../pkg/networkservice/vlanmapserver/server.go | 9 ++++++--- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/internal/pkg/config/config.go b/internal/pkg/config/config.go index 77594cf..9c55a65 100644 --- a/internal/pkg/config/config.go +++ b/internal/pkg/config/config.go @@ -32,6 +32,7 @@ const ( labelsPrefix = "labels:" viaPrefix = "via:" domainPrefix = "domain:" + mtuPrefix = "mtu:" tcpSchema = "tcp" ) @@ -74,8 +75,9 @@ type ServiceConfig struct { Name string Domain string Via string - VLANTag int32 + VLANTag uint32 Labels map[string]string + MTU uint32 } // InitValues set initial values for ServiceConfig @@ -83,6 +85,7 @@ func (s *ServiceConfig) InitValues() { s.Domain = "" s.VLANTag = 0 s.Via = "" + s.MTU = 0 } // UnmarshalBinary expects string(bytes) to be in format: @@ -102,13 +105,15 @@ func (s *ServiceConfig) UnmarshalBinary(bytes []byte) (err error) { part = strings.TrimSpace(part) switch { case strings.HasPrefix(part, vlanPrefix): - s.VLANTag, err = parseInt32(trimPrefix(part, vlanPrefix)) + s.VLANTag, err = parseUInt32(trimPrefix(part, vlanPrefix)) case strings.HasPrefix(part, labelsPrefix): s.Labels, err = parseMap(trimPrefix(part, labelsPrefix)) case strings.HasPrefix(part, viaPrefix): s.Via = trimPrefix(part, viaPrefix) case strings.HasPrefix(part, domainPrefix): s.Domain = trimPrefix(part, domainPrefix) + case strings.HasPrefix(part, mtuPrefix): + s.MTU, err = parseUInt32(trimPrefix(part, mtuPrefix)) default: err = errors.Errorf("invalid format: %s", text) } @@ -124,12 +129,12 @@ func trimPrefix(s, prefix string) string { return strings.TrimSpace(s) } -func parseInt32(s string) (int32, error) { - i, err := strconv.ParseInt(s, 0, 32) +func parseUInt32(s string) (uint32, error) { + i, err := strconv.ParseUint(s, 0, 32) if err != nil { return 0, err } - return int32(i), nil + return uint32(i), nil } func parseMap(s string) (map[string]string, error) { @@ -154,5 +159,8 @@ func (s *ServiceConfig) validate() error { if s.VLANTag < 0 || s.VLANTag > 4095 { return errors.New("Invalid VLAN ID") } + if s.MTU > 0 && (s.MTU < 68 || s.MTU > 65535) { + return errors.New("Invalid MTU") + } return nil } diff --git a/internal/pkg/config/config_test.go b/internal/pkg/config/config_test.go index c2024e2..e872b42 100644 --- a/internal/pkg/config/config_test.go +++ b/internal/pkg/config/config_test.go @@ -27,7 +27,7 @@ import ( func TestServiceConfig_UnmarshalBinary(t *testing.T) { cfg := new(config.ServiceConfig) - err := cfg.UnmarshalBinary([]byte("finance-bridge { domain: service-domain.2; vlan: 100; via: gw-1 }")) + err := cfg.UnmarshalBinary([]byte("finance-bridge { domain: service-domain.2; vlan: 100; via: gw-1 ; mtu: 1450 }")) require.NoError(t, err) require.Equal(t, &config.ServiceConfig{ @@ -35,6 +35,7 @@ func TestServiceConfig_UnmarshalBinary(t *testing.T) { Domain: "service-domain.2", Via: "gw-1", VLANTag: 100, + MTU: 1450, }, cfg) err = cfg.UnmarshalBinary([]byte("finance-bridge { vlan: 200; via: service-domain.1 }")) @@ -44,5 +45,6 @@ func TestServiceConfig_UnmarshalBinary(t *testing.T) { Name: "finance-bridge", Via: "service-domain.1", VLANTag: 200, + MTU: 0, }, cfg) } diff --git a/internal/pkg/networkservice/vlanmapserver/server.go b/internal/pkg/networkservice/vlanmapserver/server.go index 3279664..df720a4 100644 --- a/internal/pkg/networkservice/vlanmapserver/server.go +++ b/internal/pkg/networkservice/vlanmapserver/server.go @@ -39,8 +39,9 @@ type vlanMapServer struct { entries map[string]*entry } type entry struct { - vlanTag int32 + vlanTag uint32 via string + mtu uint32 } // NewServer - creates a NetworkServiceServer that requests a vlan interface and populates the netns inode @@ -54,6 +55,7 @@ func NewServer(cfg *config.Config) networkservice.NetworkServiceServer { v.entries[service.Name] = &entry{ vlanTag: service.VLANTag, via: service.Via, + mtu: service.MTU, } } return v @@ -68,7 +70,7 @@ func (v *vlanMapServer) Request(ctx context.Context, request *networkservice.Net } if mechanism := vlan.ToMechanism(conn.GetMechanism()); mechanism != nil { - mechanism.SetVlanID(uint32(entry.vlanTag)) + mechanism.SetVlanID(entry.vlanTag) conn.Labels = make(map[string]string, 1) conn.Labels[viaLabel] = entry.via @@ -76,7 +78,8 @@ func (v *vlanMapServer) Request(ctx context.Context, request *networkservice.Net if request.GetConnection().GetContext() == nil { request.GetConnection().Context = &networkservice.ConnectionContext{} } - request.GetConnection().GetContext().MTU = 0 + request.GetConnection().GetContext().MTU = entry.mtu + return next.Server(ctx).Request(ctx, request) }