Linux - статьи



              

Реализация сети в операционной - часть 14


Наиболее легкий путь(?) сделать это через интерфейс setsockopt. После внимательного изучения кода функции sys_setsockopt -net/socket.c находим строки if ((sock = sockfd_lookup(fd, &err))!=NULL) { if (level == SOL_SOCKET) err=sock_setsockopt(sock,level,optname,optval,optlen); else err=sock->ops->setsockopt(sock, level, optname, optval,optlen); sockfd_put(sock); } return err; }

значит нам надо искать функцию setsockopt в коде для реализации для типа sock_raw это файл net/ipv4/raw.c смотрим static int raw_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen) { if (level != SOL_RAW) return ip_setsockopt(sk, level, optname, optval, optlen);

...................................

}

функция ip_setsockopt лежит в net/ipv4/ip_sockglue.c в ней идет длинный перебор опций мы остановим свой выбор на уровне SOL_IP и добавим в перебор свои строки

/*HACK:>>>>>>>>>>>>>>>*/ #ifdef CONFIG_HACKIP case IP_HACKIP: printk("HACKIP:setsockopt flag %d\n",sk->hackflag); sk->hackflag=1; get_user(val,(int *) optval); printk("HACKIP:setsockopt val %d\n",val);

sk->hackf.src_addr=val; break; #endif case IP_HDRINCL:

подробнее опишем происходящие действия

printk -выводим отлабочные сообщения

Я не уверен ,но судя по всему при солздании сокета вся структура обнуляется поэтому мы можем не смотреть флаг .Я добавил ету строку ,чтоб посмотреть всегда ли он равет 0 при не установленой опции а после установки при повторе он равен 1. get_user забираем значение ,подробности include/asm/uaccess.h но для всего етого нам надо добавить соответствующие поля в struct sock

=======sock.h=============

......................... #ifdef CONFIG_HACKIP /*HACK:>>>>>>>>>>>>>>>>>>*/ struct ip_hack { __u32 src_addr; }; #endif struct sock { /* Socket demultiplex comparisons on incoming packets. */ .................................

#ifdef CONFIG_HACKIP /*HACK:>>>>>>>>>>>>>>>>>*/ struct ip_hack hackf; int hackflag; #endif




Содержание  Назад  Вперед