summaryrefslogtreecommitdiff
path: root/bpf_progs/clatd.c
diff options
context:
space:
mode:
Diffstat (limited to 'bpf_progs/clatd.c')
-rw-r--r--bpf_progs/clatd.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/bpf_progs/clatd.c b/bpf_progs/clatd.c
index e7586928..31e05222 100644
--- a/bpf_progs/clatd.c
+++ b/bpf_progs/clatd.c
@@ -37,7 +37,7 @@
// From kernel:include/net/ip.h
#define IP_DF 0x4000 // Flag: "Don't Fragment"
-DEFINE_BPF_MAP(clat_ingress_map, HASH, ClatIngressKey, ClatIngressValue, 16)
+DEFINE_BPF_MAP(clat_ingress6_map, HASH, ClatIngress6Key, ClatIngress6Value, 16)
static inline __always_inline int nat64(struct __sk_buff* skb, bool is_ethernet) {
const int l2_header_size = is_ethernet ? sizeof(struct ethhdr) : 0;
@@ -46,6 +46,9 @@ static inline __always_inline int nat64(struct __sk_buff* skb, bool is_ethernet)
const struct ethhdr* const eth = is_ethernet ? data : NULL; // used iff is_ethernet
const struct ipv6hdr* const ip6 = is_ethernet ? (void*)(eth + 1) : data;
+ // Require ethernet dst mac address to be our unicast address.
+ if (is_ethernet && (skb->pkt_type != PACKET_HOST)) return TC_ACT_OK;
+
// Must be meta-ethernet IPv6 frame
if (skb->protocol != htons(ETH_P_IPV6)) return TC_ACT_OK;
@@ -72,7 +75,7 @@ static inline __always_inline int nat64(struct __sk_buff* skb, bool is_ethernet)
return TC_ACT_OK;
}
- ClatIngressKey k = {
+ ClatIngress6Key k = {
.iif = skb->ifindex,
.pfx96.in6_u.u6_addr32 =
{
@@ -83,7 +86,7 @@ static inline __always_inline int nat64(struct __sk_buff* skb, bool is_ethernet)
.local6 = ip6->daddr,
};
- ClatIngressValue* v = bpf_clat_ingress_map_lookup_elem(&k);
+ ClatIngress6Value* v = bpf_clat_ingress6_map_lookup_elem(&k);
if (!v) return TC_ACT_OK;
@@ -176,25 +179,25 @@ static inline __always_inline int nat64(struct __sk_buff* skb, bool is_ethernet)
return TC_ACT_OK;
}
-SEC("schedcls/ingress/clat_ether")
-int sched_cls_ingress_clat_ether(struct __sk_buff* skb) {
+DEFINE_BPF_PROG("schedcls/ingress6/clat_ether", AID_ROOT, AID_ROOT, sched_cls_ingress6_clat_ether)
+(struct __sk_buff* skb) {
return nat64(skb, true);
}
-SEC("schedcls/ingress/clat_rawip")
-int sched_cls_ingress_clat_rawip(struct __sk_buff* skb) {
+DEFINE_BPF_PROG("schedcls/ingress6/clat_rawip", AID_ROOT, AID_ROOT, sched_cls_ingress6_clat_rawip)
+(struct __sk_buff* skb) {
return nat64(skb, false);
}
-DEFINE_BPF_MAP(clat_egress_map, HASH, ClatEgressKey, ClatEgressValue, 16)
+DEFINE_BPF_MAP(clat_egress4_map, HASH, ClatEgress4Key, ClatEgress4Value, 16)
-SEC("schedcls/egress/clat_ether")
-int sched_cls_egress_clat_ether(struct __sk_buff* skb) {
+DEFINE_BPF_PROG("schedcls/egress4/clat_ether", AID_ROOT, AID_ROOT, sched_cls_egress4_clat_ether)
+(struct __sk_buff* skb) {
return TC_ACT_OK;
}
-SEC("schedcls/egress/clat_rawip")
-int sched_cls_egress_clat_rawip(struct __sk_buff* skb) {
+DEFINE_BPF_PROG("schedcls/egress4/clat_rawip", AID_ROOT, AID_ROOT, sched_cls_egress4_clat_rawip)
+(struct __sk_buff* skb) {
void* data = (void*)(long)skb->data;
const void* data_end = (void*)(long)skb->data_end;
const struct iphdr* const ip4 = data;
@@ -248,12 +251,12 @@ int sched_cls_egress_clat_rawip(struct __sk_buff* skb) {
return TC_ACT_OK;
}
- ClatEgressKey k = {
+ ClatEgress4Key k = {
.iif = skb->ifindex,
.local4.s_addr = ip4->saddr,
};
- ClatEgressValue* v = bpf_clat_egress_map_lookup_elem(&k);
+ ClatEgress4Value* v = bpf_clat_egress4_map_lookup_elem(&k);
if (!v) return TC_ACT_OK;