On 4/8/24 2:19 PM, Jamal Hadi Salim wrote:
We add an initial set of kfuncs to allow interactions from eBPF programs to the P4TC domain. - bpf_p4tc_tbl_read: Used to lookup a table entry from a BPF program installed in TC. To find the table entry we take in an skb, the pipeline ID, the table ID, a key and a key size. We use the skb to get the network namespace structure where all the pipelines are stored. After that we use the pipeline ID and the table ID, to find the table. We then use the key to search for the entry. We return an entry on success and NULL on failure. - xdp_p4tc_tbl_read: Used to lookup a table entry from a BPF program installed in XDP. To find the table entry we take in an xdp_md, the pipeline ID, the table ID, a key and a key size. We use struct xdp_md to get the network namespace structure where all the pipelines are stored. After that we use the pipeline ID and the table ID, to find the table. We then use the key to search for the entry. We return an entry on success and NULL on failure. - bpf_p4tc_entry_create: Used to create a table entry from a BPF program installed in TC. To create the table entry we take an skb, the pipeline ID, the table ID, a key and its size, and an action which will be associated with the new entry. We return 0 on success and a negative errno on failure - xdp_p4tc_entry_create: Used to create a table entry from a BPF program installed in XDP. To create the table entry we take an xdp_md, the pipeline ID, the table ID, a key and its size, and an action which will be associated with the new entry. We return 0 on success and a negative errno on failure - bpf_p4tc_entry_create_on_miss: conforms to PNA "add on miss". First does a lookup using the passed key and upon a miss will add the entry to the table. We return 0 on success and a negative errno on failure - xdp_p4tc_entry_create_on_miss: conforms to PNA "add on miss". First does a lookup using the passed key and upon a miss will add the entry to the table. We return 0 on success and a negative errno on failure - bpf_p4tc_entry_update: Used to update a table entry from a BPF program installed in TC. To update the table entry we take an skb, the pipeline ID, the table ID, a key and its size, and an action which will be associated with the new entry. We return 0 on success and a negative errno on failure - xdp_p4tc_entry_update: Used to update a table entry from a BPF program installed in XDP. To update the table entry we take an xdp_md, the pipeline ID, the table ID, a key and its size, and an action which will be associated with the new entry. We return 0 on success and a negative errno on failure - bpf_p4tc_entry_delete: Used to delete a table entry from a BPF program installed in TC. To delete the table entry we take an skb, the pipeline ID, the table ID, a key and a key size. We return 0 on success and a negative errno on failure - xdp_p4tc_entry_delete: Used to delete a table entry from a BPF program installed in XDP. To delete the table entry we take an xdp_md, the pipeline ID, the table ID, a key and a key size. We return 0 on success and a negative errno on failure Note: All P4 objects are owned and reside on the P4TC side. IOW, they are controlled via TC netlink interfaces and their resources are managed (created, updated, freed, etc) by the TC side. As an example, the structure p4tc_table_entry_act is returned to the ebpf side on table lookup. On the TC side that struct is wrapped around p4tc_table_entry_act_bpf_kern. A multitude of these structure p4tc_table_entry_act_bpf_kern are preallocated (to match the P4 architecture, patch #9 describes some of the subtleties involved) by the P4TC control plane and put in a kernel pool. Their purpose is to hold the action parameters for either a table entry, a global per-table "miss" and "hit" action, etc - which are instantiated and updated via netlink per runtime requests. An instance of the p4tc_table_entry_act_bpf_kern.p4tc_table_entry_act is returned to ebpf when there is a un/successful table lookup depending on how the P4 program is written. When the table entry is deleted the instance of the struct p4tc_table_entry_act_bpf_kern is recycled to the pool to be reused for a future table entry. The only time the pool memory is released is when the pipeline is deleted. Co-developed-by: Victor Nogueira <victor@xxxxxxxxxxxx> Signed-off-by: Victor Nogueira <victor@xxxxxxxxxxxx> Co-developed-by: Pedro Tammela <pctammela@xxxxxxxxxxxx> Signed-off-by: Pedro Tammela <pctammela@xxxxxxxxxxxx> Signed-off-by: Jamal Hadi Salim <jhs@xxxxxxxxxxxx> Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@xxxxxxxxx> Nacked-by: Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> Acked-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx>
Given the many reasons stated earlier & for the record: Nacked-by: Daniel Borkmann <daniel@xxxxxxxxxxxxx>