New Model for Cloud Network Function Development – YANFF

31
Intel Golang Team Gregory Shimansky

Transcript of New Model for Cloud Network Function Development – YANFF

Page 1: New Model for Cloud Network Function Development – YANFF

Intel Golang Team

Gregory Shimansky

Page 2: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Legal Information

Intel technologies’ features and benefits depend on system configuration and may require enabled hardware, software or service activation. Learn more at intel.com, or from the OEM or retailer.

No computer system can be absolutely secure.

Software and workloads used in performance tests may have been optimized for performance only on Intel microprocessors.

Performance tests, such as SYSmark and MobileMark, are measured using specific computer systems, components, software, operations and functions. Any change to any of those factors may cause the results to vary. You should consult other information and performance tests to assist you in fully evaluating your contemplated purchases, including the performance of that product when combined with other products. For more complete information visit http://www.intel.com/performance.

Tests document performance of components on a particular test, in specific systems. Differences in hardware, software, or configuration will affect actual performance. Consult other sources of information to evaluate performance as you consider your purchase. For more complete information about performance and benchmark results, visit http://www.intel.com/performance.

Cost reduction scenarios described are intended as examples of how a given Intel- based product, in the specified circumstances and configurations, may affect future costs and provide cost savings. Circumstances will vary. Intel does not guarantee any costs or cost reduction.

Results have been estimated or simulated using internal Intel analysis or architecture simulation or modeling, and provided to you for informational purposes. Any differences in your system hardware, software or configuration may affect your actual performance.

Intel does not control or audit third-party benchmark data or the web sites referenced in this document. You should visit the referenced web site and confirm whether referenced data are accurate.

Intel, the Intel logo and others are trademarks of Intel Corporation in the U.S. and/or other countries.

*Other names and brands may be claimed as the property of others.

© 2017 Intel Corporation.

Page 3: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

YANFF - Yet Another Network Function FrameworkFramework for building performant native network functions• Open-source project• Higher level abstractions than DPDK• Go language: productivity, performance, concurrency, safety • Network functions are application programs and not virtual machinesBenefits:• Easily leverage IA HW capabilities: multi-cores, AES-NI, CAT, QAT, DPDK• 10x reduction lines of code• No need to be expert network system programmer• Similar performance with C• Take advantage of cloud native deployment: continuous delivery, micro-

services, containers

https://github.com/intel-go/yanff

3

Page 4: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

YANFF: Yet Another Network Function Framework• Simple but powerful abstractions:

• Flow, Packet

• User builds packet processing graph using “flow functions” chaining• SetReceiver -> SetHandler -> SetSender• Several predefined possibilities of adding

user processing inside packet processing graph• Split, Separate, Generate, Handle

• Can leverage predefined functions which parse packets, check ACL rules, etc.

• Run to completion – NFs can be expressed in the flow functions and natural chaining

• Auto-scaling, ease of development• Zero-copy between NFs• Flexible incoming flow handling – sources can be

anything: network port, memory buffer, remote procedure call, etc.

System SW

Optimized SW

Application

IA PlatformIA Platform

Optimized Platform Software

Optimized Software on CPU ISA (e.g. AES, AVX)

Standard NICAccelerators (Intel® QAT)

Application

Smart NIC Integrated FPGA

UPI

YANFF

4https://github.com/intel-go/yanff

Page 5: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

5

Technical Motivation Developers need framework to shorten development cycle of VNFs

– Currently VNFs are monolithic - “virtual appliances” instead of network functions

– Significant part of VNF is about plumbing. Plumbing VNFs to CommSPsnetwork is an art. Should be abstracted from VNFs

Lack of stable and unified APIs for VNF control and data plane

Challenges with access to HW Accelerators in cloud environment.

Cloud-friendly APIs and designs needed.

Accelerating transition to from rule-based networking to

imperative networking

https://github.com/intel-go/yanff

Page 6: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

L3 Simple Forwarding Examplevar L3Rules *rules.L3Rules

func main() {

flow.SystemInit(16)

L3Rules = rules.GetL3RulesFromORIG("Forwarding.conf")

inputFlow := flow.SetReceiver(0)

outputFlows := flow.SetSplitter(inputFlow, L3Splitter, uint(3))

flow.SetStopper(outputFlows[0])

for i := 1; i < 3; i++ {

flow.SetSender(outputFlows[i], uint8(i-1))

}

flow.SystemStart()

}

// User defined function for splitting packets

func L3Splitter(currentPacket *packet.Packet) uint {

currentPacket.ParseL4()

return rules.L3_ACL_port(currentPacket, L3Rules)

}

Page 7: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Configuration file for Forwarding

# Source address, Destination address, L4 protocol ID, Source port, Destination port, Output port

111.2.0.0/31 ANY tcp ANY ANY 1

111.2.0.2/32 ANY tcp ANY ANY Reject

ANY ANY udp 3078:3964 56:61020 2

Page 8: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Exactly The Same Example in DPDK/C

… 10 more screens to get to the end…23 SLOC in YANFF vs 2079 in DPDK/C!

Page 9: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice

YANFF – Main Architectural Concepts

FlowAbstraction without public fields, which

is used for pointing connections between Flow functions.

Opened by Receive / Split /Separate / Counter / Generate.Closed by Send / Merge / Stop.

PacketHigh-level representation of network

packet. Private field is *mbuf, public fields are mac / ip / data /etc: pointers to mbuf

with offsets (zero copy).Is extracted before any User defined

function. Can be filled after user request by Packet functions. Can be checked by Rule

functions.

PortNetwork door, used in

Receive, Send.

RuleSet of checking rules, used in User defined

functions.

Page 10: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice10

Building Processing Graph

Separate(SeparateFunction) {input stay}

-> FlowFlow -> SeparateFunction -> Flow

MergeFlow ->Flow -> FlowFlow ->

Partition (periodicity)

-> FlowFlow -> calculation -> Flow

Split (SplitFunction) {input closed}

-> FlowFlow -> SplitFunction -> Flow

-> Flow

Generate (GenerateFunction) {can wait}

GenerateFunction -> Flow

StopFlow -> drop

Receive (Port)

driver (loop) -> Flow

Send (Port)

Flow -> driver (loop)

Read (File)

PCAP file -> Flow

Write (File)

Flow -> PCAP file

Page 11: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice11

Packet modification functions

Handle (SeparateFunction) {can drop}

-> StopFlow -> SeparateFunction-> Flow

Handle (HandleFunction) {can’t drop}

Flow -> HandleFunction -> Flow

Packet functions

Parsing packet fieldsParse L2 or/and L3 or/and L4 levels

Checking packet fields by ruleCheck L2 or/and L3 or/and L4 levels

Create ruleCreate checking rule from json / config

Initializing packet fieldsInitialize L2 or/and L3 or/and L4 levels

Rule functions

Encapsulate / Decapsulate

Page 12: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice12

Flow Graph Example - Forwarding

1

Receiver

2

Splitter

3

Stop

3

3

Send

Send

Page 13: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice13

Let’s build some functions!

Page 14: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice

Lab configuration

dcomp01

Switch

dcomp02

dcomp03

dcomp10

dcomp11

dcomp12

dbdw04

dbdw05

dbdw06

dbdw07

dbdw08

dbdw09

dbdw10

dbdw11

dbdw12

dbdw13

dbdw14

dbdw15

dbdw16

dbdw17

Traffic generators

14

YANFF target hosts

Jump host 207.108.8.161, Login: gashiman, Password: YanffLab

Page 15: New Model for Cloud Network Function Development – YANFF

Copyright © 2016, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice15

Lab access details

Jump host 207.108.8.161, Login: gashiman, Password: YanffLab

Pktgen host Target host

1 dcomp01 dbdw08

2 dcomp02 dbdw09

3 dcomp03 dbdw10

4 dcomp10 dbdw11

5 dcomp11 dbdw12

Pktgen host Target host

6 dcomp12 dbdw13

7 dbdw04 dbdw14

8 dbdw05 dbdw15

9 dbdw06 dbdw16

10 dbdw07 dbdw17

Open two terminal windows, login to pktgen host and target host and execute the following commands in both terminals:

$ cd YANFF

$ . vars.sh

$ cd src/github.com/intel-go/yanff/examples/tutorial

Workaround for these four hostsPktgen:/> start 1

Pktgen:/> stop 1

Every time you start pktgen

Page 16: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (1 of 11)Flow graph:

package mainimport "github.com/intel-go/yanff/flow"

func main() {config := flow.Config{}flow.SystemInit(&config)

initCommonState()

flow.SystemStart()}

16

pktgen$ . YANFF/vars.sh

pktgen$ cd ~/YANFF/src/github.com/intel-go/yanff/examples/tutorial

pktgen$ ./genscripts –target $TARGET

pktgen$ ./runpktgen.sh

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step1 –target $PKTGEN

Page 17: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (2 of 11)Flow graph:

Receive

Send

package mainimport "github.com/intel-go/yanff/flow"

func main() {config := flow.Config{}flow.SystemInit(&config)

initCommonState()

firstFlow := flow.SetReceiver(0)flow.SetHandler(firstFlow, modifyPacket[0], nil)flow.SetSender(firstFlow, 0)

flow.SystemStart()}

17

Pktgen$ ./runpktgen.sh

Pktgen:/> load step2.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step2 –target $PKTGEN

Modify

Page 18: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (3 of 11)Flow graph:

Receive

Send

Partition

Send

package mainimport "github.com/intel-go/yanff/flow"

func main() {config := flow.Config{}flow.SystemInit(&config)

initCommonState()

firstFlow := flow.SetReceiver(0)secondFlow := flow.SetPartitioner(firstFlow, 300, 300)flow.SetHandler(firstFlow, modifyPacket[0], nil)flow.SetHandler(secondFlow, modifyPacket[1], nil)flow.SetSender(firstFlow, 0)flow.SetSender(secondFlow, 1)

flow.SystemStart()}

18

pktgen$ ./runpktgen.sh

Pktgen:/> load step3.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step3 –target $PKTGEN

Modify

Page 19: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (4 of 11) package mainimport "github.com/intel-go/yanff/flow“import "github.com/intel-go/yanff/packet“

func main() {config := flow.Config{}flow.SystemInit(&config)initCommonState()firstFlow := flow.SetReceiver(0)secondFlow := flow.SetSeparator(firstFlow, mySeparator, nil)flow.SetHandler(firstFlow, modifyPacket[0], nil)flow.SetHandler(secondFlow, modifyPacket[1], nil)flow.SetSender(firstFlow, 0)flow.SetSender(secondFlow, 1)

flow.SystemStart()}

func mySeparator(cur *packet.Packet, ctx flow.UserContext) bool {cur.ParseIPv4TCP()if packet.SwapBytesUint16( cur.TCP.DstPort) == 53 {

return true} else {

return false}

Flow graph:

Receive

Send

Separate

Send

19

pktgen$ ./runpktgen.sh

Pktgen:/> load step4.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step4 –target $PKTGEN

Modify Modify

Page 20: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (5 of 11) … … …import "github.com/intel-go/yanff/rules“var (

L3Rules *rules.L3Rules)

func main() {config := flow.Config{}flow.SystemInit(&config)initCommonState()L3Rules = rules.GetL3RulesFromORIG(“rules.conf")firstFlow := flow.SetReceiver(0)secondFlow := flow.SetSeparator(firstFlow, mySeparator, nil)flow.SetHandler(firstFlow, modifyPacket[0], nil)flow.SetHandler(secondFlow, modifyPacket[1], nil)flow.SetSender(firstFlow, 0)flow.SetSender(secondFlow, 1)flow.SystemStart()

}

func MySeparator(cur *packet.Packet, ctx flow.UserContext) bool {cur.ParseIPv4TCP()return rules.L3ACLPermit(cur, L3Rules)

}

Flow graph:

Receive

Send

Separate

Send

Rules

20

pktgen$ ./runpktgen.sh

Pktgen:/> load step5.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step5 –target $PKTGEN

Modify Modify

Page 21: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (6 of 11) … … …func main() {

config := flow.Config{}flow.SystemInit(&config)L3Rules = rules.GetL3RulesFromORIG(“rules.conf")firstFlow := flow.SetReceiver(0)secondFlow := flow.SetSeparator(firstFlow, mySeparator, nil)flow.SetHandler(firstFlow, modifyPacket[0], nil)flow.SetSender(firstFlow, 0)flow.SetStopper(secondFlow)flow.SystemStart()

}

func MySeparator(cur *packet.Packet, ctx flow.UserContext) bool {cur.ParseIPv4TCP()return rules.L3_ACL_permit(cur, L3Rules)

}

Flow graph:

Receive

Send

Separate

Stop

Rules

21

pktgen$ ./runpktgen.sh

Pktgen:/> load step6.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step6 –target $PKTGEN

Modify

Page 22: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (7 of 11) … … …import “time”… … …

L3Rules = rules.GetL3RulesFromORIG(“rules.conf")go updateSeparateRules()firstFlow := flow.SetReceiver(0)

… … …

func MySeparator(cur *packet.Packet, ctx flow.UserContext) bool {cur.ParseIPv4TCP()localL3Rules := L3Rulesreturn rules.L3_ACL_permit(cur, localL3Rules)

}

func updateSeparateRules() {for {

time.Sleep(time.Second * 5)L3Rules = rules.GetL3RulesFromORIG(" rules.conf ")

}}

Flow graph:

Receive

Send

Separate

Stop

updatedRules

22

pktgen$ ./runpktgen.sh

Pktgen:/> load step7.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step7 –target $PKTGEN

Modify

Page 23: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (8 of 11) … … …const flowN = 3… … …

firstFlow := flow.SetReceiver(0)outputFlows := flow.SetSplitter(firstFlow, mySplitter, flowN, nil)flow.SetStopper(outputFlows[0])for i := 1; i < flowN; i++ {

flow.SetHandler(outputFlows[i], modifyPacket[i-1], nil)flow.SetSender(outputFlows[i], uint8(i-1))

}… … …

func mySplitter(cur *packet.Packet, ctx flow.UserContext) uint {cur.ParseIPv4TCP()localL3Rules := L3Rulesreturn rules.L3ACLPort(cur, localL3Rules)

}… … …

Flow graph:

Receive

Stop

Split

Send

updatedRules

Send

23

pktgen$ ./runpktgen.sh

Pktgen:/> load step8.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step8 –target $PKTGEN

Modify Modify

Page 24: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (9 of 11) … … …import "github.com/intel-go/yanff/common“… … …

firstFlow := flow.SetReceiver(0)outputFlows := flow.SetSplitter(firstFlow, mySplitter, flowN, nil)flow.SetStopper(outputFlows[0])flow.SetHandler(outputFlows[1], myHandler, nil)for i := 1; i < flowN; i++ {

flow.SetSender(outputFlows[i], uint8(i-1))}

… … …

func myHandler(cur *packet.Packet, ctx flow.UserContext) {cur.EncapsulateHead(common.EtherLen, common.IPv4MinLen)cur.ParseIPv4()cur.IPv4.SrcAddr = packet.IPv4(111, 22, 3, 0)cur.IPv4.DstAddr = packet.IPv4(3, 22, 111, 0)cur.IPv4.VersionIhl = 0x45cur.IPv4.NextProtoID = 0x04

}

Flow graph:

Receive

Send

Split

Send

updatedRules

Stop

Handle

24

pktgen$ ./runpktgen.sh

Pktgen:/> load step9.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step9 –target $PKTGEN

ModifyModify

Page 25: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (10 of 11) … … …

func myHandler(curV []*packet.Packet, num uint, ctxflow.UserContext) {

for i := uint(0); i < num; i++ {cur := curV[i]cur.EncapsulateHead(etherLen, outerIPLen)cur.ParseIPv4()cur.IPv4.SrcAddr = packet.IPv4(111, 22, 3, 0)cur.IPv4.DstAddr = packet.IPv4(3, 22, 111, 0)cur.IPv4.VersionIhl = 0x45cur.IPv4.NextProtoID = 0x04

}}

Flow graph:

Receive

Send

Split

Send

updatedRules

Stop

Handle

Packet vector

25

pktgen$ ./runpktgen.sh

Pktgen:/> load step10.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step10 –target $PKTGEN

Modify Modify

Page 26: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Let’s try (11 of 11) … … …

func MyHandler(curV []*packet.Packet, ctx flow.UserContext) {for i := 0; i < 8; i++ {

cur := curV[i]cur.EncapsulateHead(etherLen, outerIPLen)cur.ParseIPv4()cur.IPv4.SrcAddr = packet.IPv4(111, 22, 3, 0)cur.IPv4.DstAddr = packet.IPv4(3, 22, 111, 0)cur.IPv4.VersionIhl = 0x45cur.IPv4.NextProtoID = 0x04

}// Some heavy computational codeheavyCode()

}

Flow graph:

Receive

Send

Split

Send

updatedRules

Stop

Handle

Packet vector

Scaling

26

pktgen$ ./runpktgen.sh

Pktgen:/> load step5.pg

Pktgen:/> start 0

Pktgen:/> quit

target$ sudo ./step11 –target $PKTGEN

Modify Modify

Page 27: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Finally (1 of 2): NAT

27

pktgen$ ./runpktgen.sh

Pktgen:/> load nat.pg

Pktgen:/> start 0

Pktgen:/> start 1

Pktgen:/> quit

target$ ./genscripts -pktgen $PKTGEN

target $ sudo ../nat/main/nat -config nat.json

Page 28: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Finally (2 of 2): ipsec

Showing ipsec example

28

Page 29: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Q & A ?

29

Page 30: New Model for Cloud Network Function Development – YANFF

Copyright © 2017, Intel Corporation. All rights reserved. *Other names and brands may be claimed as the property of others.

Optimization Notice

30

Optimization Notice

Intel’s compilers may or may not optimize to the same degree for non-Intel microprocessors for optimizations that

are not unique to Intel microprocessors. These optimizations include SSE2®, SSE3, and SSSE3 instruction sets and

other optimizations. Intel does not guarantee the availability, functionality, or effectiveness of any optimization on

microprocessors not manufactured by Intel. Microprocessor-dependent optimizations in this product are intended

for use with Intel microprocessors. Certain optimizations not specific to Intel microarchitecture are reserved for

Intel microprocessors. Please refer to the applicable product User and Reference Guides for more information

regarding the specific instruction sets covered by this notice.

Notice revision #20110804

Page 31: New Model for Cloud Network Function Development – YANFF

Basic components

• External (bytes inside network)

• Flow (*mbufs inside rings)

• Packets (as function arguments)

Send (Port)

Flow -> driver (loop)

Receive (Port)

driver (loop) -> Flow

StopFlow -> free

Separate(SeparateFunction) {input stay}

-> FlowFlow -> SeparateFunction -> Flow

Merge {slow}

Flow ->Flow -> Flow

User defined functions

Separate Function *-> Packet -> Boolean value ->

Handle Function *-> Packet ->

Flow functions

Handle (SeparateFunction) {can drop}

-> StopFlow -> SeparateFunction-> Flow

Generate (GenerateFunction) {can wait}

GenerateFunction -> Flow

Connections

bool

Packet functions

Parsing packet fieldsParse L2 or/and L3 or/and L4 levels

Partition (periodicity)

-> FlowFlow -> calculation -> Flow

Instances (new types)

FlowAbstraction without public fields,

which is used for pointing connections between Flow functions.

Opened by Receive / Split /Separate / Counter / Generate.Closed by Send / Merge / Stop.

PacketHigh-level representation of network packet. Private field is *mbuf, public

fields are mac / ip / data /etc: pointers to mbuf with offsets (zero copy).

Is extracted before any User defined function. Can be filled after user

request by Packet functions. Can be checked by Rule functions.

Split Function-> Packet -> № of Flow ->

uint

Split (SplitFunction) {input closed}

-> FlowFlow -> SplitFunction -> Flow

-> Flow

Checking packet fields by ruleCheck L2 or/and L3 or/and L4 levels

• Flow: type “Flow” Init, Starting, Checking, Flow functions• Packet: type “Packet”, parsing / initializing packet functions• Rules: type “Rule”, parsing rules / checking Packet functions• User package: user defined functions

Library External Components

Create ruleCreate checking rule from json / config

• Scheduler: Cloning of user defined flow functions• Asm: assembler functions added to GO• Common: technical functions shared by other components• Low: connections with DPDK C implementation

Library Internal ComponentsHandle (HandleFunction) {can’t drop}

Flow -> HandleFunction -> Flow

PortNetwork door,

used in Receive, Send.

Initializing packet fieldsInitialize L2 or/and L3 or/and L4 levels

Rule functions

RuleSet of checking rules, used in User defined

functions.

Encapsulate / Decapsulate

Generate Function *Packet ->

* Can process

vector of packets at one time

All functions take packet

and handling context

All functions at separate cores and

can be cloned