15ac93074SAndrii Nakryiko /* SPDX-License-Identifier: GPL-2.0 */ 25ac93074SAndrii Nakryiko // Copyright (c) 2018 Politecnico di Torino 35ac93074SAndrii Nakryiko #include <stddef.h> 45ac93074SAndrii Nakryiko #include <string.h> 55ac93074SAndrii Nakryiko #include <linux/bpf.h> 65ac93074SAndrii Nakryiko #include <linux/if_ether.h> 75ac93074SAndrii Nakryiko #include <linux/ip.h> 85ac93074SAndrii Nakryiko #include <linux/pkt_cls.h> 93e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h> 105ac93074SAndrii Nakryiko 115ac93074SAndrii Nakryiko int _version SEC("version") = 1; 125ac93074SAndrii Nakryiko 135ac93074SAndrii Nakryiko struct { 145ac93074SAndrii Nakryiko __uint(type, MAP_TYPE); 155ac93074SAndrii Nakryiko __uint(max_entries, 32); 165ac93074SAndrii Nakryiko __uint(map_flags, 0); 175ac93074SAndrii Nakryiko __uint(key_size, 0); 185ac93074SAndrii Nakryiko __uint(value_size, sizeof(__u32)); 195ac93074SAndrii Nakryiko } map_in SEC(".maps"); 205ac93074SAndrii Nakryiko 215ac93074SAndrii Nakryiko struct { 225ac93074SAndrii Nakryiko __uint(type, MAP_TYPE); 235ac93074SAndrii Nakryiko __uint(max_entries, 32); 245ac93074SAndrii Nakryiko __uint(map_flags, 0); 255ac93074SAndrii Nakryiko __uint(key_size, 0); 265ac93074SAndrii Nakryiko __uint(value_size, sizeof(__u32)); 275ac93074SAndrii Nakryiko } map_out SEC(".maps"); 285ac93074SAndrii Nakryiko 295ac93074SAndrii Nakryiko SEC("test") 305ac93074SAndrii Nakryiko int _test(struct __sk_buff *skb) 315ac93074SAndrii Nakryiko { 325ac93074SAndrii Nakryiko void *data_end = (void *)(long)skb->data_end; 335ac93074SAndrii Nakryiko void *data = (void *)(long)skb->data; 345ac93074SAndrii Nakryiko struct ethhdr *eth = (struct ethhdr *)(data); 355ac93074SAndrii Nakryiko __u32 value; 365ac93074SAndrii Nakryiko int err; 375ac93074SAndrii Nakryiko 385ac93074SAndrii Nakryiko if (eth + 1 > data_end) 395ac93074SAndrii Nakryiko return TC_ACT_SHOT; 405ac93074SAndrii Nakryiko 415ac93074SAndrii Nakryiko struct iphdr *iph = (struct iphdr *)(eth + 1); 425ac93074SAndrii Nakryiko 435ac93074SAndrii Nakryiko if (iph + 1 > data_end) 445ac93074SAndrii Nakryiko return TC_ACT_SHOT; 455ac93074SAndrii Nakryiko 465ac93074SAndrii Nakryiko err = bpf_map_pop_elem(&map_in, &value); 475ac93074SAndrii Nakryiko if (err) 485ac93074SAndrii Nakryiko return TC_ACT_SHOT; 495ac93074SAndrii Nakryiko 505ac93074SAndrii Nakryiko iph->daddr = value; 515ac93074SAndrii Nakryiko 525ac93074SAndrii Nakryiko err = bpf_map_push_elem(&map_out, &iph->saddr, 0); 535ac93074SAndrii Nakryiko if (err) 545ac93074SAndrii Nakryiko return TC_ACT_SHOT; 555ac93074SAndrii Nakryiko 565ac93074SAndrii Nakryiko return TC_ACT_OK; 575ac93074SAndrii Nakryiko } 585ac93074SAndrii Nakryiko 595ac93074SAndrii Nakryiko char _license[] SEC("license") = "GPL"; 60