|
@@ -1874,6 +1874,24 @@ static const struct bpf_func_proto bpf_set_hash_invalid_proto = {
|
|
|
.arg1_type = ARG_PTR_TO_CTX,
|
|
|
};
|
|
|
|
|
|
+BPF_CALL_2(bpf_set_hash, struct sk_buff *, skb, u32, hash)
|
|
|
+{
|
|
|
+ /* Set user specified hash as L4(+), so that it gets returned
|
|
|
+ * on skb_get_hash() call unless BPF prog later on triggers a
|
|
|
+ * skb_clear_hash().
|
|
|
+ */
|
|
|
+ __skb_set_sw_hash(skb, hash, true);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct bpf_func_proto bpf_set_hash_proto = {
|
|
|
+ .func = bpf_set_hash,
|
|
|
+ .gpl_only = false,
|
|
|
+ .ret_type = RET_INTEGER,
|
|
|
+ .arg1_type = ARG_PTR_TO_CTX,
|
|
|
+ .arg2_type = ARG_ANYTHING,
|
|
|
+};
|
|
|
+
|
|
|
BPF_CALL_3(bpf_skb_vlan_push, struct sk_buff *, skb, __be16, vlan_proto,
|
|
|
u16, vlan_tci)
|
|
|
{
|
|
@@ -2744,6 +2762,8 @@ tc_cls_act_func_proto(enum bpf_func_id func_id)
|
|
|
return &bpf_get_hash_recalc_proto;
|
|
|
case BPF_FUNC_set_hash_invalid:
|
|
|
return &bpf_set_hash_invalid_proto;
|
|
|
+ case BPF_FUNC_set_hash:
|
|
|
+ return &bpf_set_hash_proto;
|
|
|
case BPF_FUNC_perf_event_output:
|
|
|
return &bpf_skb_event_output_proto;
|
|
|
case BPF_FUNC_get_smp_processor_id:
|