Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1) #define KBUILD_MODNAME "foo"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2) #include <uapi/linux/bpf.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3) #include <uapi/linux/if_ether.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4) #include <uapi/linux/if_packet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5) #include <uapi/linux/ip.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6) #include <uapi/linux/in.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7) #include <uapi/linux/tcp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8) #include <uapi/linux/filter.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) #include <uapi/linux/pkt_cls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <bpf/bpf_helpers.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "bpf_legacy.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* compiler workaround */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define _htonl __builtin_bswap32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static inline void set_dst_mac(struct __sk_buff *skb, char *mac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) 	bpf_skb_store_bytes(skb, 0, mac, ETH_ALEN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define IP_CSUM_OFF (ETH_HLEN + offsetof(struct iphdr, check))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define TOS_OFF (ETH_HLEN + offsetof(struct iphdr, tos))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) static inline void set_ip_tos(struct __sk_buff *skb, __u8 new_tos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 	__u8 old_tos = load_byte(skb, TOS_OFF);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) 	bpf_l3_csum_replace(skb, IP_CSUM_OFF, htons(old_tos), htons(new_tos), 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 	bpf_skb_store_bytes(skb, TOS_OFF, &new_tos, sizeof(new_tos), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define TCP_CSUM_OFF (ETH_HLEN + sizeof(struct iphdr) + offsetof(struct tcphdr, check))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define IP_SRC_OFF (ETH_HLEN + offsetof(struct iphdr, saddr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define IS_PSEUDO 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) static inline void set_tcp_ip_src(struct __sk_buff *skb, __u32 new_ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 	__u32 old_ip = _htonl(load_word(skb, IP_SRC_OFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 	bpf_l4_csum_replace(skb, TCP_CSUM_OFF, old_ip, new_ip, IS_PSEUDO | sizeof(new_ip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 	bpf_l3_csum_replace(skb, IP_CSUM_OFF, old_ip, new_ip, sizeof(new_ip));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 	bpf_skb_store_bytes(skb, IP_SRC_OFF, &new_ip, sizeof(new_ip), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define TCP_DPORT_OFF (ETH_HLEN + sizeof(struct iphdr) + offsetof(struct tcphdr, dest))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) static inline void set_tcp_dest_port(struct __sk_buff *skb, __u16 new_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) 	__u16 old_port = htons(load_half(skb, TCP_DPORT_OFF));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) 	bpf_l4_csum_replace(skb, TCP_CSUM_OFF, old_port, new_port, sizeof(new_port));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) 	bpf_skb_store_bytes(skb, TCP_DPORT_OFF, &new_port, sizeof(new_port), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) SEC("classifier")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int bpf_prog1(struct __sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 	__u8 proto = load_byte(skb, ETH_HLEN + offsetof(struct iphdr, protocol));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 	long *value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) 	if (proto == IPPROTO_TCP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) 		set_ip_tos(skb, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 		set_tcp_ip_src(skb, 0xA010101);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) 		set_tcp_dest_port(skb, 5001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) SEC("redirect_xmit")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) int _redirect_xmit(struct __sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) 	return bpf_redirect(skb->ifindex + 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) SEC("redirect_recv")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int _redirect_recv(struct __sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) 	return bpf_redirect(skb->ifindex + 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) SEC("clone_redirect_xmit")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) int _clone_redirect_xmit(struct __sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) 	bpf_clone_redirect(skb, skb->ifindex + 1, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 	return TC_ACT_SHOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) SEC("clone_redirect_recv")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) int _clone_redirect_recv(struct __sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) 	bpf_clone_redirect(skb, skb->ifindex + 1, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) 	return TC_ACT_SHOT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) char _license[] SEC("license") = "GPL";