Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

p4c-ubpf: new uBPF back-end for p4c #2134

Merged
merged 60 commits into from
Mar 4, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
ecd39c0
Initial phase of implementing the p4c-ubpf compiler
osinstom Apr 8, 2019
ec22005
Adding support for UBPF parser
osinstom Apr 8, 2019
a687110
UBPF Parser - first implementation
osinstom Apr 13, 2019
75fdcf6
The UBPF parser implemented
osinstom Apr 14, 2019
2fcdcf8
UBPF initial control block.
kmateuszssak Apr 17, 2019
acfaa6e
Working Ubpf control block.
kmateuszssak May 6, 2019
99d6854
Change ubpf table name.
kmateuszssak May 6, 2019
78335fa
Small fixes
osinstom May 13, 2019
93643c2
Remove accept parameter from reference model.
kmateuszssak May 13, 2019
118b2b2
Change table key names.
kmateuszssak May 13, 2019
884c40a
Change table key names v2.
kmateuszssak May 13, 2019
d57742f
Some fixes to the p4c-ubpf + docs
osinstom May 21, 2019
dcf0903
Copyright headers added
osinstom May 21, 2019
3d64116
Update README.md
osinstom Jul 4, 2019
9231f53
Packet modifications support
osinstom Jul 16, 2019
dbb237e
Take size of table from P4 code.
kmateuszssak Aug 8, 2019
1090527
registers_support (#4)
kmateuszssak Aug 7, 2019
c0bc2c5
Merge pull request #5 from P4-Research/master2
osinstom Aug 8, 2019
0df4fa5
hash (#6)
kmateuszssak Sep 30, 2019
5a86d96
Refactor #include + Fix registers read (#7)
kmateuszssak Oct 1, 2019
b96fcca
Generate p4info
kmateuszssak Sep 30, 2019
b880030
Support for P4 metadata
osinstom Oct 1, 2019
3089cbb
Fix after p4info merge. Add semicolon after enum declaration.
kmateuszssak Oct 2, 2019
edcbb1d
Change max nr of table entries to 2^27 because of errors while loadin…
kmateuszssak Oct 4, 2019
cfaa628
Change ubpf_model filename, code cleaning
osinstom Oct 7, 2019
5cc9931
Adding tunneling support + PTF tests (#13)
kmateuszssak Dec 19, 2019
c63a939
p4c-ubpf doesn't compile after sync with master; fix build dependenci…
osinstom Dec 20, 2019
322f5c1
Uncomment ebpf_enable in CmakeLists.txt.
kmateuszssak Jan 7, 2020
1adffa0
T202: Update oko (p4rt-ovs) repository address and refactor scripts (…
kmateuszssak Jan 9, 2020
b3eb458
T207: Revert p4info support in p4c (temporary solution) (#15)
kmateuszssak Jan 10, 2020
5893f22
T208: Remove changes in ebpf p4c backend (#16)
kmateuszssak Jan 10, 2020
0ca94d3
T210: Review p4c once again (#17)
osinstom Jan 10, 2020
085294b
Addressing review comments: minor modifications to P4 programs and sc…
osinstom Jan 17, 2020
8ab0e2a
Compile-only tests + code cleanup
kmateuszssak Jan 20, 2020
302d279
Add not committed before symbolic links
kmateuszssak Jan 21, 2020
381d4ee
Fix symbolic links
kmateuszssak Jan 21, 2020
e4330a8
Remove dependencies on scapy in run-ubpf-test.py
osinstom Jan 21, 2020
1fd859e
Documentation for architecture model + code cleanup
osinstom Jan 28, 2020
08b7de0
Remove dependencies on BMv2 helpers.h
osinstom Jan 28, 2020
b8b3f06
Refactor of hash() generation. Generate tuple from Type_List.
osinstom Jan 24, 2020
e22ad6f
Remove useless code
kmateuszssak Jan 24, 2020
38acee5
Move metadata to tests
kmateuszssak Jan 24, 2020
c648326
Path expression code refactor
kmateuszssak Jan 24, 2020
c5c324e
Add check register type
kmateuszssak Jan 24, 2020
7f0b72e
Refactor method to generate register read()
osinstom Jan 28, 2020
2b6020c
Small fixes to test scripts and UBPFRegister
osinstom Jan 29, 2020
997d5db
Refactor pointer variables' handling in UBPFControl/UBPFRegister. Add…
osinstom Jan 29, 2020
db6c4db
Fix build error (invalid use of incomplete type 'class UBPF::UBPFCont…
osinstom Jan 29, 2020
2e12ee3
Refactor Exit and Return statement's handling
osinstom Jan 30, 2020
6bc8674
Implement checksum computation
osinstom Feb 3, 2020
7ec6f33
Optimizations of test environment installation script
osinstom Feb 7, 2020
2be7ec7
Add missing test file
osinstom Feb 7, 2020
b1479ad
Refactor check of packet's length in Parser
osinstom Jan 30, 2020
668e808
User-space only tests (#18)
osinstom Feb 12, 2020
6ae22e4
Fix p4c-ubpf error.
kmateuszssak Feb 18, 2020
cc59b0d
Fix test errors related to frontend
osinstom Feb 19, 2020
fb07d84
Register read refactor (#19)
kmateuszssak Feb 20, 2020
daad335
Macro redefinition
kmateuszssak Feb 20, 2020
f5bcc01
Update travis.yml to exclude ubpf tests for OSx
osinstom Feb 20, 2020
89eb992
Small code refactor and update of docs
osinstom Feb 25, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
T210: Review p4c once again (#17)
  • Loading branch information
osinstom authored and kmateuszssak committed Feb 14, 2020
commit 0ca94d36fc7e20d50111bae83f860a5858df49e1
2 changes: 0 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,3 @@ build/

# macOS files
.DS_Store

.idea/*
4 changes: 2 additions & 2 deletions backends/ubpf/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,10 @@ set (P4C_UBPF_DIST_HEADERS p4include/ubpf_model.p4)

add_cpplint_files(${CMAKE_CURRENT_SOURCE_DIR} "$(P4C_UBPF_SOURCES)")

#build_unified(P4C_UBPF_SOURCES ALL)
build_unified(P4C_UBPF_SOURCES ALL)
add_executable(p4c-ubpf ${P4C_UBPF_SOURCES})
target_link_libraries (p4c-ubpf ${P4C_LIBRARIES} ${P4C_LIB_DEPS})
#add_dependencies(p4c-ubpf genIR frontend)
add_dependencies(p4c-ubpf genIR frontend)

install (TARGETS p4c-ubpf
RUNTIME DESTINATION ${P4C_RUNTIME_OUTPUT_DIRECTORY})
Expand Down
24 changes: 13 additions & 11 deletions backends/ubpf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@

This repository implements the uBPF (Userspace BPF) backend for the P4 compiler (https://github.com/p4lang/p4c).
osinstom marked this conversation as resolved.
Show resolved Hide resolved

The **p4c-ubpf** compiler allows to translate P4 programs into the uBPF programs. We use the uBPF implementation provided by [the ubpf project](https://github.com/iovisor/ubpf).
The **p4c-ubpf** compiler allows to translate P4 programs into the uBPF programs. We use the uBPF implementation provided
by [the Oko/P4rt-OVS switch](https://github.com/Orange-OpenSource/oko/tree/p4rt-ovs). The Oko's uBPF VM is based on the
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this a fork of ovs? Do you expect that this fork will be merged within OvS?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, this is a fork of OVS. I presented the details at OVSCon 19' [1]. There are no official plans to merge it with OVS yet. It is still a research prototype, but once it will be mature enough we can consider to propose such a contribution to OVS.

However, as far as I know, P4rt-OVS is the only switch to test uBPF back-end.

[1] https://www.openvswitch.org/support/ovscon2019/#s4.3F

open-source implementation provided by [IOVisor](https://github.com/iovisor/ubpf).

The P4-to-uBPF compiler accepts only the P4_16 programs written for the `ubpf_model.p4` architecture model.
osinstom marked this conversation as resolved.
Show resolved Hide resolved

The backend for uBPF is mostly based on [P4-to-eBPF compiler](../ebpf/README.md). In fact, it implements the same concepts, but
generates the C code, which is compatible with the user-space BPF implementation.
generates the C code, which is compatible with the user space BPF implementation.
osinstom marked this conversation as resolved.
Show resolved Hide resolved

## Background

Expand All @@ -28,13 +30,12 @@ Apache License, version 2.0.

## Compiling P4 to uBPF

The scope of the uBPF backend is similar to the scope of the eBPF backend. It means that initially P4-to-uBPF compiler
supports only simple packet filtering.
The scope of the uBPF backend is wider than the scope of the eBPF backend. Except for simple packet filtering the
P4-to-uBPF compiler supports also P4 registers and programmable actions including packet's modifications and tunneling. For further details
refer to [uBPF architecture model](p4include/ubpf_model.p4).

We will continuously work to provide wider range of functionalities for P4-to-uBPF.

The current version of the P4-to-uBPF compiler translaters P4_16 programs to programs written in the C language. This
program is compatible with the uBPF VM and the clang compiler can be used to generate uBPF bytecode.
The current version of the P4-to-uBPF compiler translates P4_16 programs to programs written in the C language. This
program is compatible with the uBPF VM and the `clang` compiler can be used to generate uBPF bytecode.

### Translation between P4 and C

Expand All @@ -47,14 +48,15 @@ However, we introduced some modifications, which are listed below:
* There are user-space data types used (e.g. uint8_t, etc.).
osinstom marked this conversation as resolved.
Show resolved Hide resolved
* Methods to extract packet fields (e.g. load_dword, etc.) has been re-implemented to use user-space data types.
osinstom marked this conversation as resolved.
Show resolved Hide resolved
* The uBPF helpers are imported into the C programs.
* We have added `mark_to_drop()` extern to the `ubpfFilter` model, so that packets to drop are marked in the P4-native way.
* We have added `mark_to_drop()` extern to the `ubpf` model, so that packets to drop are marked in the P4-native way.
* We have added support for P4 registers implemented as BPF maps

### How to use?

The sample P4 programs are located in `examples/` directory. We have tested them on the [Oko](https://github.com/Orange-OpenSource/oko) switch -
The sample P4 programs are located in `examples/` directory. We have tested them with the [Oko/P4rt-OVS](https://github.com/Orange-OpenSource/oko/tree/p4rt-ovs) switch -
the Open vSwitch that can be extended with BPF programs at runtime. See [the detailed tutorial](./docs/EXAMPLES.md) on how to run and test those examples.

The P4 programs for P4-to-uBPF compiler must be written for the `ubpf_filter_model.p4`.
The P4 programs for P4-to-uBPF compiler must be written for the `ubpf_model.p4`.
osinstom marked this conversation as resolved.
Show resolved Hide resolved

In order to generate the C code use the following command:

Expand Down
5 changes: 1 addition & 4 deletions backends/ubpf/codeGen.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,7 @@ namespace UBPF {
class UbpfCodeBuilder : public EBPF::CodeBuilder {
public:
const UbpfTarget *target;

explicit UbpfCodeBuilder(const UbpfTarget *target) : EBPF::CodeBuilder(target), target(target) {

}
explicit UbpfCodeBuilder(const UbpfTarget *target) : EBPF::CodeBuilder(target), target(target) {}
};
}

Expand Down
35 changes: 23 additions & 12 deletions backends/ubpf/docs/EXAMPLES.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Introduction

This file contains description of the basic P4 programs, which were used to test the functionality of the P4-to-uBPF compiler.
All tests have been run on the [Oko](https://github.com/Orange-OpenSource/oko) switch using [Vagrant prepared for Oko](https://github.com/P4-Research/vagrant-oko).
All tests have been run on the [Oko](https://github.com/Orange-OpenSource/oko/tree/p4rt-ovs) switch.
You can use [Vagrantfile](../tests/environment/Vagrantfile) to set up a test environment.

Before any experiment the following commands need to be invoked:

Expand Down Expand Up @@ -48,6 +49,7 @@ This section presents P4 program, which modifies the packet's fields.
Sample usage:

```bash
# Template: ovs-ofctl update-bpf-map <BRIDGE> <PROGRAM-ID> <MAP-ID> key <KEY-DATA> value <VALUE-DATA>
$ sudo ovs-ofctl update-bpf-map br0 1 0 key 14 0 16 172 value 0 0 0 0 0 0 0 0 0 0 0 0 # decrements MPLS TTL
$ sudo ovs-ofctl update-bpf-map br0 1 0 key 14 0 16 172 value 1 0 0 0 24 0 0 0 0 0 0 0 # sets MPLS label to 24
$ sudo ovs-ofctl update-bpf-map br0 1 0 key 14 0 16 172 value 2 0 0 0 24 0 0 0 0 0 0 0 # sets MPLS label to 24 and decrements TTL
Expand Down Expand Up @@ -81,15 +83,17 @@ $ sudo ovs-ofctl update-bpf-map br0 1 0 key 254 128 0 0 0 0 0 0 10 0 39 255 254

## Registers

This section presents P4 programs, which use registers.
Register can be declared this way:
This section presents P4 programs, which use registers. Register can be declared this way:

`Register<value_type, key_type>(number_of_elements) register_t;`
where:
`value_type` - is bit array type (i.e. bit<32>) or struct like type
`key_type` - is bit array type (i.e. bit<32>) or struct like type
`number_of_elements` - the maximum number of key-value pairs

Currently registers have a limitation - they are not being initialized automatically. Initialization has to be done by control plane.
The parameters are as follows:

- `value_type` - is bit array type (i.e. bit<32>) or struct like type
- `key_type` - is bit array type (i.e. bit<32>) or struct like type
- `number_of_elements` - the maximum number of key-value pairs

Currently registers have a limitation - they are not being initialized with default values. Initialization has to be done by a control plane.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P4 does not have a way to initialize registers, but your architecture can allow it if you want.
If there is a way in your architecture to initialize registers to default values before the start of the program you can promise this to your users. But at least for the in-kernel bfp I don't think there is a way to do it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We analyzed different design options to initialize BPF maps (P4 registers) before the start of the program. And we decided that intializing them from a control plane is the best option for the moment. We could think about better approach later.


### Rate limiter (rate-limiter.p4)

Expand All @@ -102,20 +106,24 @@ It means that 10 packets are passed in 100 ms window. It also means 100 packets
If you send 1470 Bytes width packets the bit rate should not exceed 1.176 Mbit/s (1470B * 8 * (10/100ms)).

Due to registers limitation before starting your own tests initialize rate limiter registers with zeros:

```bash
# Initalizes timestamp_r register
$ sudo ovs-ofctl update-bpf-map br0 1 0 key 0 0 0 0 value 0 0 0 0
# Initalizes count_r register
$ sudo ovs-ofctl update-bpf-map br0 1 1 key 0 0 0 0 value 0 0 0 0
```

For measuring the bandwidth use for instance iperf tool:
To measure the bandwidth use the `iperf` tool:

Start a iperf UDP server

```bash
$ iperf -s -u
```
Then run iperf client

Then, run `iperf` client:

```bash
$ iperf -c <server_ip> -b 10M -l 1470
```
Expand Down Expand Up @@ -152,6 +160,7 @@ This section presents more complex examples of packet tunneling operations. Ther
To run example compile `vxlan.p4` with `p4c` and then `clang-6.0`.

Sample usage:

```bash
# Sets action vxlan_decap() (value 0) for packets matching rule VNI=25 (key 25)
# handled by the table upstream_tbl (map id 0) and BPF prog 1.
Expand All @@ -166,15 +175,17 @@ sudo ovs-ofctl update-bpf-map br0 1 1 key 14 0 16 172 value 0 0 0 0
To run example compile `gtp.p4` with `p4c` and then `clang-6.0`.

To test encapsulation:

```bash
# For downstream_tbl (ID 1) sets action gtp_encap() (value 0) and GTP TEID=3 for packets with destination IP address 172.16.0.14.
$ sudo ovs-ofctl update-bpf-map br0 10 1 key 14 0 16 172 value 0 0 0 0 3 0 0 0
$ sudo ovs-ofctl update-bpf-map br0 1 1 key 14 0 16 172 value 0 0 0 0 3 0 0 0
```

To test decapsulation:

```bash
# For upstream_tbl (ID 0) sets action gtp_decap() for packets matching GTP TEID=3.
$ sudo ovs-ofctl update-bpf-map br0 10 0 key 3 0 0 0 value 0 0 0 0
$ sudo ovs-ofctl update-bpf-map br0 1 0 key 3 0 0 0 value 0 0 0 0
```

Scapy can be used to easily test GTP protocol:
Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/gtp.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
osinstom marked this conversation as resolved.
Show resolved Hide resolved
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/metadata.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include <core.p4>
#include "ubpf_model.p4"

Expand Down
Empty file removed backends/ubpf/examples/mpls.p4
Empty file.
16 changes: 16 additions & 0 deletions backends/ubpf/examples/oko-test-actions.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/oko-test-ipv6.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/rate-limiter-structs.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/rate-limiter.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/simple-firewall.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/tunneling.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/examples/vxlan.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "ubpf_model.p4"
#include <core.p4>

Expand Down
16 changes: 16 additions & 0 deletions backends/ubpf/p4include/ubpf_model.p4
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
/*
Copyright 2019 Orange

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#ifndef _FILTER_MODEL_P4_
#define _FILTER_MODEL_P4_

Expand Down
Loading