Здравствуйте. Имеется сеть из 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
На первом компьютере программа формирует пакеты с дополнительным заголовком маршрутизации и отправляет их.
Код | #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; }
|
С помощью снифера отслеживаю отправленные пакеты. Но в ответ приходит ICMPv6 с Type 4(Parameter problem) и Code 0(Erroneous header field encountered) Pointer 42. Т.е. ругается на ошибку в заголовке, судя по указателю(42) это Routing Type. Но он и должен быть равен 0. Разрешение на обработку доп.заголовка установлено.
Вот и непонятно в чем ошибка.
Заранее спасибо. |