Skip to content

Commit

Permalink
modify load action
Browse files Browse the repository at this point in the history
Signed-off-by: wenyingd <wenyingd@vmware.com>
  • Loading branch information
wenyingd committed May 12, 2022
1 parent 672cfb1 commit 59fcd61
Show file tree
Hide file tree
Showing 19 changed files with 187 additions and 107 deletions.
8 changes: 4 additions & 4 deletions docs/antctl.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,10 +282,10 @@ Example outputs of dumping Pod and NetworkPolicy OVS flows:
# Dump OVS flows of Pod "coredns-6955765f44-zcbwj"
$ antctl get of -p coredns-6955765f44-zcbwj -n kube-system
FLOW
table=classification, n_packets=513122, n_bytes=42615080, priority=190,in_port="coredns--d0c58e" actions=load:0x2->NXM_NX_REG0[0..15],resubmit(,10)
table=classification, n_packets=513122, n_bytes=42615080, priority=190,in_port="coredns--d0c58e" actions=set_field:0x2/0xffff->reg0,resubmit(,10)
table=10, n_packets=513122, n_bytes=42615080, priority=200,ip,in_port="coredns--d0c58e",dl_src=52:bd:c6:e0:eb:c1,nw_src=172.100.1.7 actions=resubmit(,30)
table=10, n_packets=0, n_bytes=0, priority=200,arp,in_port="coredns--d0c58e",arp_spa=172.100.1.7,arp_sha=52:bd:c6:e0:eb:c1 actions=resubmit(,20)
table=80, n_packets=556468, n_bytes=166477824, priority=200,dl_dst=52:bd:c6:e0:eb:c1 actions=load:0x5->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],resubmit(,90)
table=80, n_packets=556468, n_bytes=166477824, priority=200,dl_dst=52:bd:c6:e0:eb:c1 actions=load:0x5->NXM_NX_REG1[],set_field:0x10000/0x10000->reg0,resubmit(,90)
table=70, n_packets=0, n_bytes=0, priority=200,ip,dl_dst=aa:bb:cc:dd:ee:ff,nw_dst=172.100.1.7 actions=set_field:62:39:b4:e8:05:76->eth_src,set_field:52:bd:c6:e0:eb:c1->eth_dst,dec_ttl,resubmit(,80)
# Get NetworkPolicies applied to Pod "coredns-6955765f44-zcbwj"
Expand Down Expand Up @@ -378,8 +378,8 @@ result: |
dec_ttl
resubmit(,80)
80. dl_dst=52:bd:c6:e0:eb:c1, priority 200, cookie 0x5e030000000000
load:0x5->NXM_NX_REG1[]
load:0x1->NXM_NX_REG0[16]
set_field:0x5->reg1
set_field:0x10000/0x10000->reg0
resubmit(,90)
90. conj_id=2,ip, priority 190, cookie 0x5e050000000000
resubmit(,105)
Expand Down
14 changes: 7 additions & 7 deletions docs/design/ovs-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ address for all the traffic being tunnelled.
If you dump the flows for this table, you may see the following:

```text
1. table=20, priority=200,arp,arp_tpa=10.10.1.1,arp_op=1 actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:aa:bb:cc:dd:ee:ff,load:0x2->NXM_OF_ARP_OP[],move:NXM_NX_ARP_SHA[]->NXM_NX_ARP_THA[],load:0xaabbccddeeff->NXM_NX_ARP_SHA[],move:NXM_OF_ARP_SPA[]->NXM_OF_ARP_TPA[],load:0xa0a0101->NXM_OF_ARP_SPA[],IN_PORT
1. table=20, priority=200,arp,arp_tpa=10.10.1.1,arp_op=1 actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:aa:bb:cc:dd:ee:ff,set_field:2->arp_op,move:NXM_NX_ARP_SHA[]->NXM_NX_ARP_THA[],load:0xaabbccddeeff->NXM_NX_ARP_SHA[],move:NXM_OF_ARP_SPA[]->NXM_OF_ARP_TPA[],load:0xa0a0101->NXM_OF_ARP_SPA[],IN_PORT
2. table=20, priority=190,arp actions=NORMAL
3. table=20, priority=0 actions=drop
```
Expand Down Expand Up @@ -781,7 +781,7 @@ table=70, priority=210,ct_state=+rpl+trk,ct_mark=0x20,ip actions=mod_dl_dst:e2:e
For a given peer Node, the flow may look like this:

```text
table=70, priority=200,ip,nw_dst=10.10.1.0/24 actions=mod_dl_src:e2:e5:a4:9b:1c:b1,mod_dl_dst:aa:bb:cc:dd:ee:ff,load:0x1->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],load:0xc0a80102->NXM_NX_TUN_IPV4_DST[],goto_table:72
table=70, priority=200,ip,nw_dst=10.10.1.0/24 actions=mod_dl_src:e2:e5:a4:9b:1c:b1,mod_dl_dst:aa:bb:cc:dd:ee:ff,load:0x1->NXM_NX_REG1[],set_field:0x10000/0x10000->reg0,load:0xc0a80102->NXM_NX_TUN_IPV4_DST[],goto_table:72
```

If none of the flows described above are hit, traffic goes directly to
Expand Down Expand Up @@ -853,7 +853,7 @@ destination MAC addresses, load the SNAT IP to NXM_NX_TUN_IPV4_DST, and send the
packets to [L3DecTTLTable].

```text
table=71, priority=200,ct_state=+new+trk,ip,in_port="pod2-357c21" actions=mod_dl_src:e2:e5:a4:9b:1c:b1,mod_dl_dst:aa:bb:cc:dd:ee:ff,load:0x1->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],load:0xc0a80a66->NXM_NX_TUN_IPV4_DST[],goto_table:72
table=71, priority=200,ct_state=+new+trk,ip,in_port="pod2-357c21" actions=mod_dl_src:e2:e5:a4:9b:1c:b1,mod_dl_dst:aa:bb:cc:dd:ee:ff,load:0x1->NXM_NX_REG1[],set_field:0x10000/0x10000->reg0,load:0xc0a80a66->NXM_NX_TUN_IPV4_DST[],goto_table:72
```

Last, when a SNAT IP configured for Egresses is on the local Node, an additional
Expand Down Expand Up @@ -891,10 +891,10 @@ port (tunnel port, gateway port, and local Pod ports), as you can see if you
dump the flows:

```text
1. table=80, priority=200,dl_dst=aa:bb:cc:dd:ee:ff actions=load:0x1->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],goto_table:105
2. table=80, priority=200,dl_dst=e2:e5:a4:9b:1c:b1 actions=load:0x2->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],goto_table:105
3. table=80, priority=200,dl_dst=12:9e:a6:47:d0:70 actions=load:0x3->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],goto_table:90
4. table=80, priority=200,dl_dst=ba:a8:13:ca:ed:cf actions=load:0x4->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],goto_table:90
1. table=80, priority=200,dl_dst=aa:bb:cc:dd:ee:ff actions=set_field:0x1->reg1,set_field:0x10000/0x10000->reg0,goto_table:105
2. table=80, priority=200,dl_dst=e2:e5:a4:9b:1c:b1 actions=set_field:0x2->reg1,set_field:0x10000/0x10000->reg0,goto_table:105
3. table=80, priority=200,dl_dst=12:9e:a6:47:d0:70 actions=set_field:0x3->reg1,set_field:0x10000/0x10000->reg0,goto_table:90
4. table=80, priority=200,dl_dst=ba:a8:13:ca:ed:cf actions=set_field:0x4->reg1,set_field:0x10000/0x10000->reg0,goto_table:90
5. table=80, priority=0 actions=goto_table:105
```

Expand Down
2 changes: 1 addition & 1 deletion docs/design/windows-design.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ table=70, priority=200,ip,nw_dst=$peerPodSubnet actions=mod_dl_dst:$peerNodeMAC,
table=70, priority=200,ct_state=+rpl+trk,ip,nw_dst=$peerNodeIP actions=mod_dl_dst:$peerNodeMAC,resubmit(,80)
L2ForwardingCalcTable: 80
table=80, priority=200,dl_dst=$peerNodeMAC actions=load:$uplink->NXM_NX_REG1[],load:0x1->NXM_NX_REG0[16],resubmit(,105)
table=80, priority=200,dl_dst=$peerNodeMAC actions=load:$uplink->NXM_NX_REG1[],set_field:0x10000/0x10000->reg0,resubmit(,105)
```

### SNAT configuration
Expand Down
4 changes: 2 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ require (
// Newer version of github.com/googleapis/gnostic make use of newer gopkg.in/yaml(v3), which conflicts with
// explicit imports of gopkg.in/yaml.v2.
replace (
antrea.io/libOpenflow v0.6.2 => github.com/ashish-varma/libOpenflow v0.5.3-0.20220406070346-d753d6267491
antrea.io/ofnet v0.5.7 => github.com/ashish-varma/ofnet v0.2.5-0.20220408000302-c6bcd158d462
antrea.io/libOpenflow v0.6.2 => github.com/wenyingd/libOpenflow v0.0.0-20220511094309-f8b801a509ce
antrea.io/ofnet v0.5.7 => github.com/ashish-varma/ofnet v0.2.5-0.20220511051314-4f8eeb7570f6
github.com/googleapis/gnostic v0.5.5 => github.com/googleapis/gnostic v0.4.1
)
9 changes: 4 additions & 5 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
antrea.io/ofnet v0.5.7/go.mod h1:8TJVF6MLe9/gZ/KbhGUvULs9/TxssepEaYEe+o1SEgs=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
Expand Down Expand Up @@ -97,10 +96,8 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
github.com/ashish-varma/libOpenflow v0.5.3-0.20220406070346-d753d6267491 h1:g1vkHXHmELTqUpVvnQk+zxho0NyCMYJxlQxlHzWydYY=
github.com/ashish-varma/libOpenflow v0.5.3-0.20220406070346-d753d6267491/go.mod h1:CzEJZxDNAupiGxeL5VOw92PsxfyvehEAvE3PiC6gr8o=
github.com/ashish-varma/ofnet v0.2.5-0.20220408000302-c6bcd158d462 h1:Lhq+gRAnEbNANhOXU2Egp40cDMiLk81Vi1WPiwfbryA=
github.com/ashish-varma/ofnet v0.2.5-0.20220408000302-c6bcd158d462/go.mod h1:8TJVF6MLe9/gZ/KbhGUvULs9/TxssepEaYEe+o1SEgs=
github.com/ashish-varma/ofnet v0.2.5-0.20220511051314-4f8eeb7570f6 h1:E4wWdXZR+dG0nuqGmXQfbGIu+6zG/2/wc0vD9gV6PU4=
github.com/ashish-varma/ofnet v0.2.5-0.20220511051314-4f8eeb7570f6/go.mod h1:8TJVF6MLe9/gZ/KbhGUvULs9/TxssepEaYEe+o1SEgs=
github.com/awalterschulze/gographviz v2.0.1+incompatible h1:XIECBRq9VPEQqkQL5pw2OtjCAdrtIgFKoJU8eT98AS8=
github.com/awalterschulze/gographviz v2.0.1+incompatible/go.mod h1:GEV5wmg4YquNw7v1kkyoX9etIk8yVmXj+AkDHuuETHs=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
Expand Down Expand Up @@ -769,6 +766,8 @@ github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3C
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
github.com/vmware/go-ipfix v0.5.12 h1:mqQknlvnvDY25apPNy9c27ri3FMDFIhzvO68Kk5Qp58=
github.com/vmware/go-ipfix v0.5.12/go.mod h1:yzbG1rv+yJ8GeMrRm+MDhOV3akygNZUHLhC1pDoD2AY=
github.com/wenyingd/libOpenflow v0.0.0-20220511094309-f8b801a509ce h1:tFaeQhoMLsIhmmTt82T1txXwroNvt3tsRk5vuFapJL8=
github.com/wenyingd/libOpenflow v0.0.0-20220511094309-f8b801a509ce/go.mod h1:CzEJZxDNAupiGxeL5VOw92PsxfyvehEAvE3PiC6gr8o=
github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
Expand Down
12 changes: 7 additions & 5 deletions pkg/agent/controller/networkpolicy/fqdn.go
Original file line number Diff line number Diff line change
Expand Up @@ -755,7 +755,8 @@ func (f *fqdnController) handlePacketIn(pktIn *ofctrl.PacketIn) error {
f.onDNSResponseMsg(&dnsMsg, time.Now(), waitCh)
}
go func() {
switch ipPkt := pktIn.Data.Data.(type) {
ethernetPkt := pktIn.Data.(*protocol.Ethernet)
switch ipPkt := ethernetPkt.Data.(type) {
case *protocol.IPv4:
switch dnsPkt := ipPkt.Data.(type) {
case *protocol.UDP:
Expand Down Expand Up @@ -788,7 +789,8 @@ func (f *fqdnController) sendDNSPacketout(pktIn *ofctrl.PacketIn) error {
prot uint8
isIPv6 bool
)
switch ipPkt := pktIn.Data.Data.(type) {
ethernetPkt := pktIn.Data.(*protocol.Ethernet)
switch ipPkt := ethernetPkt.Data.(type) {
case *protocol.IPv4:
srcIP = ipPkt.NWSrc.String()
dstIP = ipPkt.NWDst.String()
Expand All @@ -809,7 +811,7 @@ func (f *fqdnController) sendDNSPacketout(pktIn *ofctrl.PacketIn) error {
}
}
if prot == protocol.Type_UDP {
udpSrcPort, udpDstPort, err := binding.GetUDPHeaderData(pktIn.Data.Data)
udpSrcPort, udpDstPort, err := binding.GetUDPHeaderData(ethernetPkt.Data)
if err != nil {
klog.ErrorS(err, "Failed to get UDP header data")
return err
Expand All @@ -818,8 +820,8 @@ func (f *fqdnController) sendDNSPacketout(pktIn *ofctrl.PacketIn) error {
return packetOutBuilder.AddLoadRegMark(openflow.CustomReasonDNSRegMark)
}
return f.ofClient.SendUDPPacketOut(
pktIn.Data.HWSrc.String(),
pktIn.Data.HWDst.String(),
ethernetPkt.HWSrc.String(),
ethernetPkt.HWDst.String(),
srcIP,
dstIP,
uint32(config.HostGatewayOFPort),
Expand Down
11 changes: 6 additions & 5 deletions pkg/agent/controller/networkpolicy/reject.go
Original file line number Diff line number Diff line change
Expand Up @@ -83,16 +83,17 @@ const (
// packet-in message.
func (c *Controller) rejectRequest(pktIn *ofctrl.PacketIn) error {
// Get ethernet data.
srcMAC := pktIn.Data.HWDst.String()
dstMAC := pktIn.Data.HWSrc.String()
ethernetPkt := pktIn.Data.(*protocol.Ethernet)
srcMAC := ethernetPkt.HWDst.String()
dstMAC := ethernetPkt.HWSrc.String()

var (
srcIP string
dstIP string
proto uint8
isIPv6 bool
)
switch ipPkt := pktIn.Data.Data.(type) {
switch ipPkt := ethernetPkt.Data.(type) {
case *protocol.IPv4:
// Get IP data.
srcIP = ipPkt.NWDst.String()
Expand Down Expand Up @@ -155,7 +156,7 @@ func (c *Controller) rejectRequest(pktIn *ofctrl.PacketIn) error {

if proto == protocol.Type_TCP {
// Get TCP data.
oriTCPSrcPort, oriTCPDstPort, oriTCPSeqNum, _, _, err := binding.GetTCPHeaderData(pktIn.Data.Data)
oriTCPSrcPort, oriTCPDstPort, oriTCPSeqNum, _, _, err := binding.GetTCPHeaderData(ethernetPkt.Data)
if err != nil {
return err
}
Expand Down Expand Up @@ -184,7 +185,7 @@ func (c *Controller) rejectRequest(pktIn *ofctrl.PacketIn) error {
icmpCode = ICMPv6DstAdminProhibitedCode
ipHdrLen = IPv6HdrLen
}
ipHdr, _ := pktIn.Data.Data.MarshalBinary()
ipHdr, _ := ethernetPkt.Data.MarshalBinary()
icmpData := make([]byte, int(ICMPUnusedHdrLen+ipHdrLen+8))
// Put ICMP unused header in Data prop and set it to zero.
binary.BigEndian.PutUint32(icmpData[:ICMPUnusedHdrLen], 0)
Expand Down
2 changes: 1 addition & 1 deletion pkg/agent/controller/traceflow/packetin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ func TestParseCapturedPacket(t *testing.T) {
if tt.isIPv6 {
ethType = uint16(protocol.IPv6_MSG)
}
pktIn := ofctrl.PacketIn{Data: protocol.Ethernet{Ethertype: ethType, Data: tt.pktInData}}
pktIn := ofctrl.PacketIn{Data: &protocol.Ethernet{Ethertype: ethType, Data: tt.pktInData}}
packet := parseCapturedPacket(&pktIn)
assert.True(t, reflect.DeepEqual(packet, tt.pktCap), "parsed packet does not match the expected")
})
Expand Down
3 changes: 1 addition & 2 deletions pkg/agent/openflow/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -921,8 +921,7 @@ func (c *client) SendTraceflowPacket(dataplaneTag uint8, packet *binding.Packet,
if outPort != -1 {
packetOutBuilder = packetOutBuilder.SetOutport(uint32(outPort))
}
packetOutBuilder = packetOutBuilder.AddLoadAction(binding.NxmFieldIPToS, uint64(dataplaneTag), traceflowTagToSRange)

packetOutBuilder = packetOutBuilder.AddSetIPTosAction(dataplaneTag)
packetOutObj := packetOutBuilder.Done()
return c.bridge.SendPacketOut(packetOutObj)
}
Expand Down
2 changes: 1 addition & 1 deletion pkg/ovs/openflow/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -405,7 +405,7 @@ type PacketOutBuilder interface {
SetICMPData(data []byte) PacketOutBuilder
SetInport(inPort uint32) PacketOutBuilder
SetOutport(outport uint32) PacketOutBuilder
AddLoadAction(name string, data uint64, rng *Range) PacketOutBuilder
AddSetIPTosAction(data uint8) PacketOutBuilder
AddLoadRegMark(mark *RegMark) PacketOutBuilder
AddResubmitAction(inPort *uint16, table *uint8) PacketOutBuilder
SetL4Packet(packet util.Message) PacketOutBuilder
Expand Down
103 changes: 77 additions & 26 deletions pkg/ovs/openflow/ofctrl_action.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"strings"

"antrea.io/libOpenflow/openflow15"
"antrea.io/libOpenflow/util"
"antrea.io/ofnet/ofctrl"
utilnet "k8s.io/utils/net"
)
Expand Down Expand Up @@ -88,42 +89,58 @@ type ofCTAction struct {

// LoadToMark is an action to load data into ct_mark.
func (a *ofCTAction) LoadToMark(value uint32) CTAction {
field, rng, _ := getFieldRange(NxmFieldCtMark)
a.load(field, uint64(value), &rng)
ctMarkField := openflow15.NewCTMarkMatchField(value, nil)
action := openflow15.NewActionSetField(*ctMarkField)
a.actions = append(a.actions, action)
return a
}

func (a *ofCTAction) LoadToCtMark(marks ...*CtMark) CTAction {
field, _, _ := getFieldRange(NxmFieldCtMark)
for _, mark := range marks {
a.load(field, uint64(mark.value), mark.field.rng)
var mask *uint32
maskData := uint32(0)
valueData := mark.value
if mark.field.rng != nil {
maskData = ^maskData >> (32 - mark.field.rng.Length()) << mark.field.rng.Offset()
mask = &maskData
valueData = valueData << mark.field.rng.Offset()
}
ctMarkField := openflow15.NewCTMarkMatchField(valueData, mask)
action := openflow15.NewActionSetField(*ctMarkField)
a.actions = append(a.actions, action)
}
return a
}

func (a *ofCTAction) LoadToLabelField(value uint64, labelField *CtLabel) CTAction {
field, _, _ := getFieldRange(NxmFieldCtLabel)
a.load(field, value, labelField.rng)
return a
}

func (a *ofCTAction) load(field *openflow15.MatchField, value uint64, rng *Range) {
action := openflow15.NewNXActionRegLoad(rng.ToNXRange().ToOfsBits(), field, value)
var labelBytes [16]byte
var valueBytes []byte
var maskBytes *[16]byte
valueData := value
if labelField.rng != nil {
mask := ^uint64(0) >> (64 - labelField.rng.Length()) << labelField.rng.Offset()
binary.BigEndian.PutUint64(maskBytes[0:8], mask)
valueData = valueData << labelField.rng.Offset()
}
binary.BigEndian.PutUint64(valueBytes[0:8], valueData)
ctLabelField := openflow15.NewCTLabelMatchField(labelBytes, maskBytes)
action := openflow15.NewActionSetField(*ctLabelField)
a.actions = append(a.actions, action)
return a
}

// MoveToLabel is an action to move data into ct_label.
func (a *ofCTAction) MoveToLabel(fromName string, fromRng, labelRng *Range) CTAction {
fromField := getOxmIdByFieldName(fromName)
toField := getOxmIdByFieldName((NxmFieldCtLabel)
toField := getOxmIdByFieldName(NxmFieldCtLabel)
a.move(fromField, toField, uint16(fromRng.Length()), uint16(fromRng[0]), uint16(labelRng[0]))
return a
}

// MoveToCtMarkField is an action to move data into ct_mark.
func (a *ofCTAction) MoveToCtMarkField(fromRegField *RegField, ctMarkField *CtMarkField) CTAction {
fromField := getOxmIdByFieldName(fromRegField.GetNXFieldName())
toField:= getOxmIdByFieldName(NxmFieldCtMark)
toField := getOxmIdByFieldName(NxmFieldCtMark)
a.move(fromField, toField, uint16(fromRegField.GetRange().Length()), uint16(fromRegField.GetRange()[0]), uint16(ctMarkField.rng[0]))
return a
}
Expand Down Expand Up @@ -278,18 +295,31 @@ func (a *ofFlowAction) LoadARPOperation(value uint16) FlowBuilder {

// LoadRange is an action to Load data to the target field at specified range.
func (a *ofFlowAction) LoadRange(name string, value uint64, rng *Range) FlowBuilder {
loadAct, _ := ofctrl.NewNXLoadAction(name, value, rng.ToNXRange())
if a.builder.ofFlow.Table != nil && a.builder.ofFlow.Table.Switch != nil {
loadAct.ResetFieldLength(a.builder.ofFlow.Table.Switch)
hasMask := rng != nil
field, _ := openflow15.FindFieldHeaderByName(name, hasMask)
var valueBytes, maskBytes []byte
valueData := value
if hasMask {
mask := ^uint64(0) >> (64 - rng.Length()) << rng.Offset()
binary.BigEndian.PutUint64(maskBytes, mask)
field.Mask = util.NewBuffer(maskBytes)
valueData = valueData << rng.Offset()
}
a.builder.ApplyAction(loadAct)
return a.builder
binary.BigEndian.PutUint64(valueBytes, valueData)
field.Value = util.NewBuffer(valueBytes)
return a.setField(field)
}

func (a *ofFlowAction) LoadToRegField(field *RegField, value uint32) FlowBuilder {
name := field.GetNXFieldName()
loadAct, _ := ofctrl.NewNXLoadAction(name, uint64(value), field.rng.ToNXRange())
a.builder.ApplyAction(loadAct)
valueData := value
mask := uint32(0)
if field.rng != nil {
mask = ^mask >> (32 - field.rng.Length()) << field.rng.Offset()
valueData = valueData << field.rng.Offset()
}
tgtField := openflow15.NewRegMatchFieldWithMask(field.regID, valueData, mask)
act, _ := ofctrl.NewSetFieldAction(tgtField)
a.builder.ApplyAction(act)
return a.builder
}

Expand All @@ -304,12 +334,36 @@ func (a *ofFlowAction) LoadRegMark(marks ...*RegMark) FlowBuilder {

// LoadToPktMarkRange is an action to load data into pkt_mark at specified range.
func (a *ofFlowAction) LoadPktMarkRange(value uint32, rng *Range) FlowBuilder {
return a.LoadRange(NxmFieldPktMark, uint64(value), rng)
pktMarkField, _ := openflow15.FindFieldHeaderByName(NxmFieldPktMark, true)
var valueBytes, maskBytes []byte
valueData := value
mask := uint32(0)
if rng != nil {
mask = ^mask >> (32 - rng.Length()) << rng.Offset()
binary.BigEndian.PutUint32(maskBytes, mask)
pktMarkField.Mask = util.NewBuffer(maskBytes)
pktMarkField.Value = util.NewBuffer(valueBytes)
valueData = valueData << rng.Offset()
}
binary.BigEndian.PutUint32(valueBytes, valueData)
return a.setField(pktMarkField)
}

// LoadIPDSCP is an action to load data to IP DSCP bits.
func (a *ofFlowAction) LoadIPDSCP(value uint8) FlowBuilder {
return a.LoadRange(NxmFieldIPToS, uint64(value), IPDSCPToSRange)
ipDscpField := openflow15.NewIpDscpField(value << IPDSCPToSRange.Offset())
ipDscpField.HasMask = true
ipDscpMask := &openflow15.IpDscpField{Dscp: uint8(0xff) >> (8 - IPDSCPToSRange.Length()) << IPDSCPToSRange.Offset()}
ipDscpField.Mask = ipDscpMask
ipDscpField.Length = 2

return a.setField(ipDscpField)
}

func (a *ofFlowAction) setField(field *openflow15.MatchField) FlowBuilder {
loadAct, _ := ofctrl.NewSetFieldAction(field)
a.builder.ApplyAction(loadAct)
return a.builder
}

// Move is an action to copy all data from "fromField" to "toField". Fields with name "fromField" and "fromField" should
Expand All @@ -328,9 +382,6 @@ func (a *ofFlowAction) MoveRange(fromField, toField string, fromRange, toRange R
srcOxmId := getOxmIdByFieldName(fromField)
dstOxmId := getOxmIdByFieldName(toField)
moveAct, _ := ofctrl.NewCopyFieldAction(nBits, srcOffset, dstOffset, srcOxmId, dstOxmId)
if a.builder.ofFlow.Table != nil && a.builder.ofFlow.Table.Switch != nil {
moveAct.ResetFieldsLength(a.builder.ofFlow.Table.Switch)
}
a.builder.ApplyAction(moveAct)
return a.builder
}
Expand Down
Loading

0 comments on commit 59fcd61

Please sign in to comment.