diff --git a/dataplane/BUILD b/dataplane/BUILD index 92790998..b1f95896 100644 --- a/dataplane/BUILD +++ b/dataplane/BUILD @@ -22,6 +22,7 @@ go_library( "@com_github_openconfig_ygnmi//ygnmi", "@org_golang_google_grpc//:go_default_library", "@org_golang_google_grpc//credentials/local", + "@org_golang_google_protobuf//proto", ] + select({ "@io_bazel_rules_go//go/platform:aix": [ "//dataplane/dplanerc", diff --git a/dataplane/saiserver/acl.go b/dataplane/saiserver/acl.go index ec985761..0ba5e724 100644 --- a/dataplane/saiserver/acl.go +++ b/dataplane/saiserver/acl.go @@ -303,6 +303,9 @@ type myMacInfo struct { // ToEntryDesc returns the EntryDesc. func (mi *myMacInfo) ToEntryDesc(m *myMac) (*fwdpb.EntryDesc, error) { + if mi.priority == nil { + return nil, fmt.Errorf("priority needs to be specified") + } fields := []*fwdconfig.PacketFieldMaskedBytesBuilder{ fwdconfig.PacketFieldMaskedBytes(fwdpb.PacketFieldNum_PACKET_FIELD_NUM_ETHER_MAC_DST). WithBytes(mi.macAddress, mi.macAddressMask), @@ -382,6 +385,7 @@ func (m *myMac) CreateMyMac(ctx context.Context, req *saipb.CreateMyMacRequest) ContextId: &fwdpb.ContextId{Id: m.dataplane.ID()}, TableId: &fwdpb.TableId{ObjectId: &fwdpb.ObjectId{Id: MyMacTable}}, EntryDesc: ed, + Actions: []*fwdpb.ActionDesc{{ActionType: fwdpb.ActionType_ACTION_TYPE_CONTINUE}}, } if _, err := m.dataplane.TableEntryAdd(ctx, mReq); err != nil { diff --git a/dataplane/saiserver/ports.go b/dataplane/saiserver/ports.go index 3dc3a3fc..d247aef6 100644 --- a/dataplane/saiserver/ports.go +++ b/dataplane/saiserver/ports.go @@ -74,6 +74,7 @@ var getInterface = net.InterfaceByName func getForwardingPipeline() []*fwdpb.ActionDesc { return []*fwdpb.ActionDesc{ + fwdconfig.Action(fwdconfig.LookupAction(MyMacTable)).Build(), // Decide whether to process the packet. fwdconfig.Action(fwdconfig.LookupAction(inputIfaceTable)).Build(), // Match packet to interface. fwdconfig.Action(fwdconfig.LookupAction(IngressVRFTable)).Build(), // Match interface to VRF. fwdconfig.Action(fwdconfig.LookupAction(PreIngressActionTable)).Build(), // Run pre-ingress actions. diff --git a/dataplane/saiserver/switch.go b/dataplane/saiserver/switch.go index a1f6da96..dd1c11c4 100644 --- a/dataplane/saiserver/switch.go +++ b/dataplane/saiserver/switch.go @@ -226,6 +226,7 @@ func (sw *saiSwitch) CreateSwitch(ctx context.Context, _ *saipb.CreateSwitchRequ Desc: &fwdpb.TableDesc{ TableType: fwdpb.TableType_TABLE_TYPE_FLOW, TableId: &fwdpb.TableId{ObjectId: &fwdpb.ObjectId{Id: MyMacTable}}, + Actions: []*fwdpb.ActionDesc{{ActionType: fwdpb.ActionType_ACTION_TYPE_DROP}}, Table: &fwdpb.TableDesc_Flow{ Flow: &fwdpb.FlowTableDesc{ BankCount: 1, diff --git a/dataplane/server.go b/dataplane/server.go index d11b3e28..15719ac5 100644 --- a/dataplane/server.go +++ b/dataplane/server.go @@ -23,6 +23,7 @@ import ( "github.com/openconfig/ygnmi/ygnmi" "google.golang.org/grpc" "google.golang.org/grpc/credentials/local" + "google.golang.org/protobuf/proto" "github.com/openconfig/lemming/dataplane/dplaneopts" "github.com/openconfig/lemming/dataplane/saiserver" @@ -104,6 +105,18 @@ func (d *Dataplane) Start(ctx context.Context, c gpb.GNMIClient, target string) return err } + // Allow all traffic to L3 processing. + mmc := saipb.NewMyMacClient(conn) + _, err = mmc.CreateMyMac(context.Background(), &saipb.CreateMyMacRequest{ + Switch: swResp.Oid, + Priority: proto.Uint32(1), + MacAddress: []byte{0, 0, 0, 0, 0, 0}, + MacAddressMask: []byte{0, 0, 0, 0, 0, 0}, + }) + if err != nil { + return err + } + _, err = hostif.CreateHostifTrap(ctx, &saipb.CreateHostifTrapRequest{ Switch: swResp.Oid, TrapType: saipb.HostifTrapType_HOSTIF_TRAP_TYPE_ARP_REQUEST.Enum(), diff --git a/integration_tests/dataplane/basictraffic/basic_traffic_test.go b/integration_tests/dataplane/basictraffic/basic_traffic_test.go index b0a4ac30..d0575bff 100644 --- a/integration_tests/dataplane/basictraffic/basic_traffic_test.go +++ b/integration_tests/dataplane/basictraffic/basic_traffic_test.go @@ -17,6 +17,7 @@ package basictraffic import ( "context" + "net" "strconv" "testing" "time" @@ -52,6 +53,7 @@ const ( var ( dutPort1 = attrs.Attributes{ Desc: "dutPort1", + MAC: "10:10:10:10:10:10", IPv4: "192.0.2.1", IPv4Len: ipv4PrefixLen, } @@ -65,6 +67,7 @@ var ( dutPort2 = attrs.Attributes{ Desc: "dutPort2", + MAC: "10:10:10:10:10:11", IPv4: "192.0.2.5", IPv4Len: ipv4PrefixLen, } @@ -108,21 +111,37 @@ func configureDUT(t testing.TB, dut *ondatra.DUTDevice) { if err != nil { t.Fatal(err) } + // Allow all traffic to L3 processing. + mmc := saipb.NewMyMacClient(conn) + _, err = mmc.CreateMyMac(context.Background(), &saipb.CreateMyMacRequest{ + Switch: 1, + Priority: proto.Uint32(1), + MacAddress: []byte{0, 0, 0, 0, 0, 0}, + MacAddressMask: []byte{0, 0, 0, 0, 0, 0}, + }) + mac1, err := net.ParseMAC(dutPort1.MAC) + if err != nil { + t.Fatal(err) + } _, err = ric.CreateRouterInterface(context.Background(), &saipb.CreateRouterInterfaceRequest{ Switch: 1, PortId: proto.Uint64(port1ID), Type: saipb.RouterInterfaceType_ROUTER_INTERFACE_TYPE_PORT.Enum(), - SrcMacAddress: []byte{10, 10, 10, 10, 10, 10}, + SrcMacAddress: mac1, }) if err != nil { t.Fatal(err) } + mac2, err := net.ParseMAC(dutPort2.MAC) + if err != nil { + t.Fatal(err) + } rif2Resp, err := ric.CreateRouterInterface(context.Background(), &saipb.CreateRouterInterfaceRequest{ Switch: 1, PortId: proto.Uint64(port2ID), Type: saipb.RouterInterfaceType_ROUTER_INTERFACE_TYPE_PORT.Enum(), - SrcMacAddress: []byte{10, 10, 10, 10, 10, 11}, + SrcMacAddress: mac2, }) if err != nil { t.Fatal(err) @@ -168,7 +187,7 @@ func TestTraffic(t *testing.T) { dut := ondatra.DUT(t, "dut") configureDUT(t, dut) - loss := testTraffic(t, ate, ateTop, atePort1, atePort2, 10*time.Second) + loss := testTraffic(t, ate, ateTop, atePort1, dutPort1, atePort2, 10*time.Second) if loss > 1 { t.Errorf("loss %f, greater than 1", loss) } @@ -189,7 +208,7 @@ func configureATE(t *testing.T, ate *ondatra.ATEDevice) gosnappi.Config { // testTraffic generates traffic flow from source network to // destination network via srcEndPoint to dstEndPoint and checks for // packet loss and returns loss percentage as float. -func testTraffic(t *testing.T, ate *ondatra.ATEDevice, top gosnappi.Config, srcEndPoint, dstEndPoint attrs.Attributes, dur time.Duration) float32 { +func testTraffic(t *testing.T, ate *ondatra.ATEDevice, top gosnappi.Config, srcEndPoint, srcPeerEndpoint, dstEndPoint attrs.Attributes, dur time.Duration) float32 { otg := ate.OTG() top.Flows().Clear().Items() @@ -206,7 +225,7 @@ func testTraffic(t *testing.T, ate *ondatra.ATEDevice, top gosnappi.Config, srcE // Set up ethernet layer. eth := ipFLow.Packet().Add().Ethernet() eth.Src().SetValue(srcEndPoint.MAC) - eth.Dst().SetValue(dstEndPoint.MAC) + eth.Dst().SetValue(srcPeerEndpoint.MAC) ip4 := ipFLow.Packet().Add().Ipv4() ip4.Src().SetValue(srcEndPoint.IPv4)