Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Introduce P4 tc classifier. A tc filter instantiated on this classifier is used to bind a P4 pipeline to one or more netdev ports. To use P4 classifier you must specify a pipeline name that will be associated to this filter, a s/w parser and datapath ebpf program. The pipeline must have already been created via a template. For example, if we were to add a filter to ingress of network interface device $P0 and associate it to P4 pipeline simple_l3 we'd issue the following command: tc filter add dev $P0 parent ffff: protocol all prio 6 p4 pname simple_l3 \ action bpf obj $PARSER.o section prog/tc-parser \ action bpf obj $PROGNAME.o section prog/tc-ingress $PROGNAME.o and $PARSER.o is a compilation of the eBPF programs generated by the P4 compiler and will be the representation of the P4 program. Note that filter understands that $PARSER.o is a parser to be loaded at the tc level. The datapath program is merely an eBPF action. Note we do support a distinct way of loading the parser as opposed to making it be an action, the above example would be: tc filter add dev $P0 parent ffff: protocol all prio 6 p4 pname simple_l3 \ prog type tc obj $PARSER.o ... \ action bpf obj $PROGNAME.o section prog/tc-ingress We support two types of loadings of these initial programs in the pipeline and differentiate between what gets loaded at tc vs xdp by using syntax of either "prog type tc obj" or "prog type xdp obj" For XDP: tc filter add dev $P0 ingress protocol all prio 1 p4 pname simple_l3 \ prog type xdp obj $PARSER.o section parser/xdp \ pinned_link /sys/fs/bpf/mylink \ action bpf obj $PROGNAME.o section prog/tc-ingress The theory of operations is as follows: ================================1. PARSING================================ The packet first encounters the parser. The parser is implemented in ebpf residing either at the TC or XDP level. The parsed header values are stored in a shared eBPF map. When the parser runs at XDP level, we load it into XDP using tc filter command and pin it to a file. =============================2. ACTIONS============================= In the above example, the P4 program (minus the parser) is encoded in an action($PROGNAME.o). It should be noted that classical tc actions continue to work: IOW, someone could decide to add a mirred action to mirror all packets after or before the ebpf action. tc filter add dev $P0 parent ffff: protocol all prio 6 p4 pname simple_l3 \ prog type tc obj $PARSER.o section parser/tc-ingress \ action bpf obj $PROGNAME.o section prog/tc-ingress \ action mirred egress mirror index 1 dev $P1 \ action bpf obj $ANOTHERPROG.o section mysect/section-1 It should also be noted that it is feasible to split some of the ingress datapath into XDP first and more into TC later (as was shown above for example where the parser runs at XDP level). YMMV. Co-developed-by: Victor Nogueira <[email protected]> Signed-off-by: Victor Nogueira <[email protected]> Co-developed-by: Pedro Tammela <[email protected]> Signed-off-by: Pedro Tammela <[email protected]> Signed-off-by: Jamal Hadi Salim <[email protected]>
- Loading branch information