The FIB lookup example[1] show how the IP-header field tot_len (iph->tot_len) is used as input to perform the MTU check. This patch extend the BPF-helper bpf_check_mtu() with the same ability to provide the length as user parameter input, via mtu_len parameter. This still needs to be done before the bpf_check_mtu() helper API becomes frozen. [1] samples/bpf/xdp_fwd_kern.c
Showing the changes to include/uapi (1 of 2 files). Show all
Unified · Split
| @@ -3850,7 +3850,7 @@ union bpf_attr { · 3849 unmodified lines | ||
| 3850 | 3850 | * |
| 3851 | 3851 | * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags) |
| 3852 | 3852 | * Description |
| 3853 | − * Check ctx packet size against exceeding MTU of net device (based | |
| 3853 | + * Check packet size against exceeding MTU of net device (based | |
| 3854 | 3854 | * on *ifindex*). This helper will likely be used in combination |
| 3855 | 3855 | * with helpers that adjust/change the packet size. |
| 3856 | 3856 | * |
| @@ -3867,6 +3867,14 @@ union bpf_attr { · 10 unmodified lines | ||
| 3867 | 3867 | * against the current net device. This is practical if this isn't |
| 3868 | 3868 | * used prior to redirect. |
| 3869 | 3869 | * |
| 3870 | + * On input *mtu_len* must be a valid pointer, else verifier will | |
| 3871 | + * reject BPF program. If the value *mtu_len* is initialized to | |
| 3872 | + * zero then the ctx packet size is use. When value *mtu_len* is | |
| 3873 | + * provided as input this specify the L3 length that the MTU check | |
| 3874 | + * is done against. Remember XDP and TC length operate at L2, but | |
| 3875 | + * this value is L3 as this correlate to MTU and IP-header tot_len | |
| 3876 | + * values which are L3 (similar behavior as bpf_fib_lookup). | |
| 3877 | + * | |
| 3870 | 3878 | * The Linux kernel route table can configure MTUs on a more |
| 3871 | 3879 | * specific per route level, which is not provided by this helper. |
| 3872 | 3880 | * For route level MTU checks use the **bpf_fib_lookup**\ () |
| @@ -3891,11 +3899,9 @@ union bpf_attr { · 18 unmodified lines | ||
| 3891 | 3899 | * |
| 3892 | 3900 | * On return *mtu_len* pointer contains the MTU value of the net |
| 3893 | 3901 | * device. Remember the net device configured MTU is the L3 size, |
| 3894 | − * which is returned here and XDP and TX length operate at L2. | |
| 3902 | + * which is returned here and XDP and TC length operate at L2. | |
| 3895 | 3903 | * Helper take this into account for you, but remember when using |
| 3896 | − * MTU value in your BPF-code. On input *mtu_len* must be a valid | |
| 3897 | − * pointer and be initialized (to zero), else verifier will reject | |
| 3898 | − * BPF program. | |
| 3904 | + * MTU value in your BPF-code. | |
| 3899 | 3905 | * |
| 3900 | 3906 | * Return |
| 3901 | 3907 | * * 0 on success, and populate MTU value in *mtu_len* pointer. |