__uint(type, BPF_MAP_TYPE_HASH);
__uint(pinning, 1);
__uint(key_size, sizeof(struct in_addr));
- __type(value, __u8);
+ __type(value, struct qosify_ip_map_val);
__uint(max_entries, 100000);
__uint(map_flags, BPF_F_NO_PREALLOC);
} ipv4_map SEC(".maps");
__uint(type, BPF_MAP_TYPE_HASH);
__uint(pinning, 1);
__uint(key_size, sizeof(struct in6_addr));
- __type(value, __u8);
+ __type(value, struct qosify_ip_map_val);
__uint(max_entries, 100000);
__uint(map_flags, BPF_F_NO_PREALLOC);
} ipv6_map SEC(".maps");
parse_ipv4(struct __sk_buff *skb, __u32 *offset)
{
struct qosify_config *config;
+ struct qosify_ip_map_val *ip_val;
const __u32 zero_port = 0;
struct iphdr *iph;
__u8 dscp = 0xff;
else
key = &iph->daddr;
- value = bpf_map_lookup_elem(&ipv4_map, key);
- /* use udp port 0 entry as fallback for non-tcp/udp */
- if (!value && dscp == 0xff)
+ ip_val = bpf_map_lookup_elem(&ipv4_map, key);
+ if (ip_val) {
+ if (!ip_val->seen)
+ ip_val->seen = 1;
+ dscp = ip_val->dscp;
+ } else if (dscp == 0xff) {
+ /* use udp port 0 entry as fallback for non-tcp/udp */
value = bpf_map_lookup_elem(&udp_ports, &zero_port);
- if (value)
- dscp = *value;
+ if (value)
+ dscp = *value;
+ }
check_flow(config, skb, &dscp);
parse_ipv6(struct __sk_buff *skb, __u32 *offset)
{
struct qosify_config *config;
+ struct qosify_ip_map_val *ip_val;
const __u32 zero_port = 0;
struct ipv6hdr *iph;
__u8 dscp = 0;
parse_l4proto(config, skb, *offset, ipproto, &dscp);
- value = bpf_map_lookup_elem(&ipv6_map, key);
-
- /* use udp port 0 entry as fallback for non-tcp/udp */
- if (!value)
+ ip_val = bpf_map_lookup_elem(&ipv6_map, key);
+ if (ip_val) {
+ if (!ip_val->seen)
+ ip_val->seen = 1;
+ dscp = ip_val->dscp;
+ } else if (dscp == 0xff) {
+ /* use udp port 0 entry as fallback for non-tcp/udp */
value = bpf_map_lookup_elem(&udp_ports, &zero_port);
- if (value)
- dscp = *value;
+ if (value)
+ dscp = *value;
+ }
check_flow(config, skb, &dscp);