• Joanne Koong's avatar
    bpf: Add bpf_dynptr_slice and bpf_dynptr_slice_rdwr · 66e3a13e
    Joanne Koong authored
    Two new kfuncs are added, bpf_dynptr_slice and bpf_dynptr_slice_rdwr.
    The user must pass in a buffer to store the contents of the data slice
    if a direct pointer to the data cannot be obtained.
    
    For skb and xdp type dynptrs, these two APIs are the only way to obtain
    a data slice. However, for other types of dynptrs, there is no
    difference between bpf_dynptr_slice(_rdwr) and bpf_dynptr_data.
    
    For skb type dynptrs, the data is copied into the user provided buffer
    if any of the data is not in the linear portion of the skb. For xdp type
    dynptrs, the data is copied into the user provided buffer if the data is
    between xdp frags.
    
    If the skb is cloned and a call to bpf_dynptr_data_rdwr is made, then
    the skb will be uncloned (see bpf_unclone_prologue()).
    
    Please note that any bpf_dynptr_write() automatically invalidates any prior
    data slices of the skb dynptr. This is because the skb may be cloned or
    may need to pull its paged buffer into the head. As such, any
    bpf_dynptr_write() will automatically have its prior data slices
    invalidated, even if the write is to data in the skb head of an uncloned
    skb. Please note as well that any other helper calls that change the
    underlying packet buffer (eg bpf_skb_pull_data()) invalidates any data
    slices of the skb dynptr as well, for the same reasons.
    Signed-off-by: default avatarJoanne Koong <joannelkoong@gmail.com>
    Link: https://lore.kernel.org/r/20230301154953.641654-10-joannelkoong@gmail.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    66e3a13e
helpers.c 64.8 KB