#include "netinet/in.h"
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <stdio.h>
#define MAXPACKET 128000
int main()
{
// ===========================
// Set the socket name
struct sockaddr_in6 hop1;
hop1.sin6_family = PF_INET6;
hop1.sin6_flowinfo = 0;
hop1.sin6_port = 0;
// Set address
inet_pton(AF_INET6, "2001:640:11:1::2", &hop1.sin6_addr);
// ===========================
// Form the packet (main header and an optional routing header)
u_char outpack[MAXPACKET];
int i=0;
// protocol version (4 bits)
// traffic class (8 bits)
// 20 bits flow-ID
outpack[i++] = 0x60;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
// payload length
outpack[i++] = 0x00;
outpack[i++] = 0x28;
// next header
outpack[i++] = 0x2b;
// hop limit
outpack[i++] = 0xff;
// source address
outpack[i++] = 0x20;
outpack[i++] = 0x01;
outpack[i++] = 0x06;
outpack[i++] = 0x40;
outpack[i++] = 0x00;
outpack[i++] = 0x11;
outpack[i++] = 0x00;
outpack[i++] = 0x01;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x01;
// destination address
outpack[i++] = 0x20;
outpack[i++] = 0x01;
outpack[i++] = 0x06;
outpack[i++] = 0x40;
outpack[i++] = 0x00;
outpack[i++] = 0x11;
outpack[i++] = 0x00;
outpack[i++] = 0x02;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x02;
//======================
// optional header
outpack[i++] = 0x3b;
outpack[i++] = 0x04;//length of the Routing header
outpack[i++] = 0x00;//Routing Type
outpack[i++] = 0x02;//Segments Left
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
// route address #1
outpack[i++] = 0x20;
outpack[i++] = 0x01;
outpack[i++] = 0x06;
outpack[i++] = 0x40;
outpack[i++] = 0x00;
outpack[i++] = 0x11;
outpack[i++] = 0x00;
outpack[i++] = 0x02;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x01;
// route address #2
outpack[i++] = 0x20;
outpack[i++] = 0x01;
outpack[i++] = 0x06;
outpack[i++] = 0x40;
outpack[i++] = 0x00;
outpack[i++] = 0x11;
outpack[i++] = 0x00;
outpack[i++] = 0x02;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x00;
outpack[i++] = 0x02;
struct iovec iov;
iov.iov_len = i;
iov.iov_base = outpack;
// ===========================
// Form header
struct msghdr mhdr;
memset(&mhdr, 0, sizeof(mhdr));
mhdr.msg_name = (caddr_t) &hop1;
mhdr.msg_namelen = sizeof(struct sockaddr_in6);
mhdr.msg_iov = &iov;
mhdr.msg_iovlen = 1;
// create RAW socket
int sock = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW);
if (sock < 0)
{
return 1;
}
// send IP-packet
if (sendmsg(sock, &mhdr, 0) < 0)
{
return 1;
}
return 0;
}
Дополнительный заголовок маршрутизации IPv6
Имеется сеть из 3х компьютеров, соединенных между собой последовательно. 2й компьютер имеет 2 сетевых интерфейса и служит маршрутизатором. Сеть построена на IPv6.
Адрес 1го компьютера - 2001:640:11:1::1
Адреса 2го компьютера - 2001:640:11:1::2
- 2001:640:11:2::1
Адрес 3го компьютера - 2001:640:11:2::2
На первом компьютере программа формирует пакеты с дополнительным заголовком маршрутизации и отправляет их.
Код:
С помощью снифера отслеживаю отправленные пакеты. Но в ответ приходит ICMPv6 с Type 4(Parameter problem) и Code 0(Erroneous header field encountered) Pointer 42. Т.е. ругается на ошибку в заголовке, судя по указателю(42) это Routing Type. Но он и должен быть равен 0.
Разрешение на обработку доп.заголовка установлено.
Вот и непонятно в чем ошибка.
Заранее спасибо.
Имеется сеть из 3х компьютеров, соединенных между собой последовательно. 2й компьютер имеет 2 сетевых интерфейса и служит маршрутизатором. Сеть построена на IPv6.[/QUOTE]
Средств IPv4 уже не хватает для соединения в сеть 3х машин?
Может для начала стоит воспользоваться именно стеком протокола TCP/IP v4, а потом уж, как наладите программу, браться за более сложный стек IPv6.
Кстате, за 10 летнюю историю установки OpenBSD "из коробки" в ней было обнаружено всего 2 удаленнные "критические дыры" и, как раз вторая из них - обнаружена в стеке протокола IPv6..... А у вас я как понимаю Linux наверное...
Надеюсь идея понятна :)
Мне надо использовать именно IPv6. Если будет возможность - попробую сделать то же самое, но на IPv4. Дело, думаю, всё же не в "дырах", а в неправильном формировании пакета(хотя заполнял все поля по RFC) или настройках систем. Если кто занимался этим надеюсь сможет мне помочь.