Почему изменение IP-адреса источника вызывает ядро ​​c, но изменение IP-адреса назначения работает нормально? - PullRequest
0 голосов
/ 29 мая 2020

Я использую следующий код (см. Полный код здесь )

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?

...