Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дополнительный заголовок маршрутизации IPv6

31K
24 августа 2008 года
PAB
5 / / 20.10.2007
Здравствуйте.
Имеется сеть из 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.
Разрешение на обработку доп.заголовка установлено.

Вот и непонятно в чем ошибка.

Заранее спасибо.
502
25 августа 2008 года
Jail
550 / / 30.01.2007
[QUOTE=PAB]Здравствуйте.
Имеется сеть из 3х компьютеров, соединенных между собой последовательно. 2й компьютер имеет 2 сетевых интерфейса и служит маршрутизатором. Сеть построена на IPv6.[/QUOTE]
Средств IPv4 уже не хватает для соединения в сеть 3х машин?
Может для начала стоит воспользоваться именно стеком протокола TCP/IP v4, а потом уж, как наладите программу, браться за более сложный стек IPv6.
Кстате, за 10 летнюю историю установки OpenBSD "из коробки" в ней было обнаружено всего 2 удаленнные "критические дыры" и, как раз вторая из них - обнаружена в стеке протокола IPv6..... А у вас я как понимаю Linux наверное...
Надеюсь идея понятна :)
31K
25 августа 2008 года
PAB
5 / / 20.10.2007
Да, линукс.
Мне надо использовать именно IPv6. Если будет возможность - попробую сделать то же самое, но на IPv4. Дело, думаю, всё же не в "дырах", а в неправильном формировании пакета(хотя заполнял все поля по RFC) или настройках систем. Если кто занимался этим надеюсь сможет мне помочь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог