cp-ip версії 4 в ядрі 2.4.7
Додаток p> Після тривалих теоретичних пошуків застосуємо їх на практиці
Нашої метою буде створення зручного для користувача інтерфейсу для зазначення в пакеті підставного ip адреси (адреси якого немає у жодного нашого інтерфейсу) Я не буду показувати, то як адреси виставляються в ядрі. Зауважу тільки те що, з сокета сімейства AF_INET і типу SOCK_RAW пакет з не своєю адресою відправити начебто можна (в ядрі 2.2, щодо 2.4 невпевнений-може там є якісь перевірки). сторінки мана говорять про опцію IP_HDRINCL. Їх можна відправляти також через тип SOCK_PACKET. Але для всього цього знати код ядра не надто необхідно. Тому ми підемо іншим шляхом. p> Найбільш легкий шлях (?) зробити це через інтерфейс 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 % Dn ", sk-> hackflag);
sk-> hackflag = 1;
get_user (val, (int *) optval);
printk ("HACKIP: setsockopt val % Dn ", 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. */p> .................................
# ifdef CONFIG_HACKIP
/* HACK:>>>>>>>>>>>>>>>>> */
struct ip_hac...