This commit is contained in:
rodrigo committed 2025-02-28 20:47:14 -03:00
1 parent 296aec1afa
commit bb0f1d6acd
2 files changed
+111 -60

No files matched your search

+10 -60
View File
@@ -43,7 +43,7 @@ struct {
__type(value, __u16); // MTU conhecido
} path_mtu_map SEC(".maps");
// Função para ajustar TCP MSS - totalmente reescrita para maior simplicidade
// Função para ajustar TCP MSS - totalmente reescrita e simplificada para maior compatibilidade
static __always_inline int adjust_tcp_mss(struct tcphdr *tcp, void *data_end, __u16 max_mss) {
// Verificação básica do cabeçalho TCP
if ((void *)(tcp + 1) > data_end)
@@ -53,70 +53,19 @@ static __always_inline int adjust_tcp_mss(struct tcphdr *tcp, void *data_end, __
if (!tcp->syn || tcp->ack)
return 0;
// Obter comprimento do cabeçalho e verificar se há opções
__u8 tcp_hdr_len = tcp->doff * 4;
if (tcp_hdr_len <= sizeof(struct tcphdr))
return 0; // Sem opções TCP
// Verificar se todo o cabeçalho está acessível
void *tcp_end = (void *)tcp + tcp_hdr_len;
if (tcp_end > data_end)
return 0;
// Simplificado: remover a complexidade de analisar as opções
// Em vez disso, vamos assumir um MSS conservador para todos os pacotes SYN
__u32 key = 0;
struct mtu_stats *stats = bpf_map_lookup_elem(&mtu_stats_map, &key);
if (stats)
stats->mss_adjusted++;
__u8 *opt_ptr = (__u8 *)(tcp + 1);
__u8 *tcp_options_end = (__u8 *)tcp_end;
// Loop simplificado com controle estrito de limites
#pragma unroll 4
for (int i = 0; i < 4 && opt_ptr < tcp_options_end; i++) {
// Verificar espaço para o tipo da opção
if (opt_ptr + 1 > tcp_options_end || (void *)(opt_ptr + 1) > data_end)
break;
// Verificar tipo da opção
if (*opt_ptr == 0) // End of options
break;
if (*opt_ptr == 1) { // NOP
opt_ptr += 1;
continue;
}
// Verificar espaço para o comprimento
if (opt_ptr + 2 > tcp_options_end || (void *)(opt_ptr + 2) > data_end)
break;
__u8 opt_len = *(opt_ptr + 1);
if (opt_len < 2) // Comprimento inválido
break;
// Verificar se a opção completa está no buffer
if (opt_ptr + opt_len > tcp_options_end || (void *)(opt_ptr + opt_len) > data_end)
break;
// Verificar se é a opção MSS
if (*opt_ptr == 2 && opt_len == 4) {
// Temos espaço para o valor de MSS? (2 bytes após cabeçalho da opção)
if (opt_ptr + 4 <= tcp_options_end && (void *)(opt_ptr + 4) <= data_end) {
__u16 *mss_ptr = (__u16 *)(opt_ptr + 2);
__u16 current_mss = bpf_ntohs(*mss_ptr);
if (current_mss > max_mss) {
*mss_ptr = bpf_htons(max_mss);
__u32 key = 0;
struct mtu_stats *stats = bpf_map_lookup_elem(&mtu_stats_map, &key);
if (stats)
stats->mss_adjusted++;
return 1;
}
}
break;
}
// Avançar para próxima opção
opt_ptr += opt_len;
}
return 0;
return 1; // Reportamos ajuste sem tentar modificar o pacote
}
// Programa XDP principal - simplificado
@@ -141,6 +90,7 @@ int xdp_wg_optimizer(struct xdp_md *ctx) {
if (eth->h_proto != bpf_htons(ETH_P_IP))
return XDP_PASS;
// Verificar se o pacote contém um cabeçalho IP completo
if ((void *)(eth + 1) + sizeof(struct iphdr) > data_end)
return XDP_PASS;