- first_action += f"\t\t{accessor} = 1;\n"
- first_action += "\t\trate->sent_time = time;\n"
- first_action += "\t\tbpf_spin_unlock(&rate->lock);\n"
- first_action += "\t} else {\n"
- first_action += "\t\tbpf_spin_unlock(&rate->lock);\n"
- first_action += "\t\treturn XDP_DROP;\n"
- first_action += "\t}\n"
+ if proto == 4:
+ if mid_byte > 32:
+ continue
+ first_action += f"const uint32_t srcip = ip->saddr & MASK4({mid_byte});\n"
+ first_action += f"void *rate_map = &v4_src_rate_{len(v4persrcratelimits)};\n"
+ first_action += f"int matched = check_v4_persrc_ratelimit(srcip, rate_map, {(high_byte + 1) * 4096}, time_masked, amt, per_pkt_ns);\n"
+ v4persrcratelimits.append((high_byte + 1) * 4096)
+ elif mid_byte <= 64:
+ first_action += f"const uint64_t srcip = BE128BEHIGH64(ip6->saddr & MASK6({mid_byte}));\n"
+ first_action += f"void *rate_map = &v5_src_rate_{len(v5persrcratelimits)};\n"
+ first_action += f"int matched = check_v5_persrc_ratelimit(srcip, rate_map, {(high_byte + 1) * 4096}, time_masked, amt, per_pkt_ns);\n"
+ v5persrcratelimits.append((high_byte + 1) * 4096)
+ else:
+ if mid_byte > 128:
+ continue
+ first_action += f"const uint128_t srcip = ip6->saddr & MASK6({mid_byte});\n"
+ first_action += f"void *rate_map = &v6_src_rate_{len(v6persrcratelimits)};\n"
+ first_action += f"int matched = check_v6_persrc_ratelimit(srcip, rate_map, {(high_byte + 1) * 4096}, time_masked, amt, per_pkt_ns);\n"
+ v6persrcratelimits.append((high_byte + 1) * 4096)
+ first_action += "if (matched) {\n"
+ first_action += "\t{stats_replace}\n"
+ first_action += "\treturn XDP_DROP;\n"