Я использую следующий код (см. Полный код здесь )
static errno_t myipfilter_output_redirect(void *cookie, mbuf_t *data, ipf_pktopts_t options)
{
struct in_addr addr_old;
struct in_addr addr_new;
int ret;
struct ip *ip = (struct ip*)mbuf_data(*data);
if (ip->ip_v != 4)
return 0;
inet_aton("8.8.8.8", &addr_old);
inet_aton("127.0.0.1", &addr_new);
// redirect packets to 8.8.8.8 to the IP address 127.0.0.1
if (ip->ip_dst.s_addr == addr_old.s_addr)
{
ip->ip_dst = addr_new;
myipfilter_update_cksum(*data);
ret = ipf_inject_output(*data, g_filter_ref, options);
return ret == 0 ? EJUSTRETURN : ret;
}
return 0;
}
Он отлично работает и так; это когда i ping 8.8.8.8
вместо этого ping 127.0.0.1
(т.е. он перезаписывает IP-адрес назначения). Однако, если я вместо этого изменю ip->ip_src
, чтобы он соответствовал другому IP-адресу моего адаптера, вместо этого я получаю ядро pani c. Это почему? И как бы это написать, чтобы не вызывала паника ядра c?