Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дополнительный заголовок маршрутизации IPv6 
:(
    Опции темы
pab
Дата 25.8.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.8.2008

Репутация: -1
Всего: нет



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

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

Заранее спасибо.
PM MAIL   Вверх
MAKCim
Дата 26.8.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



pab
а поле следующего заголовка в заголовке IPv6 установлено?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
pab
Дата 27.8.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.8.2008

Репутация: -1
Всего: нет



Установлено :

Код

// next header 
outpack[i++] = 0x2b;


Это именно заголовок маршрутизации, снифер это опознаёт. Если кол-во оставшихся узлов установить в 0, то даже не ругается. Возможно проблема не в коде, а в настройке систем. Но я устанавливал разрешение на маршрутизацию в /proc/sys/net/ipv6/conf/eth0/accept_source_route = 1, и насколько я знаю больше ничего устанавливать не надо.
PM MAIL   Вверх
MAKCim
Дата 27.8.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



pab
по-умолчанию для RAW сокетов домена AF_INET6 заголовок IPv6 установить нельзя
через setsockopt() установи параметр IP_HDRINCL


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
pab
Дата 28.8.2008, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.8.2008

Репутация: -1
Всего: нет



установил, ничего не изменилось
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0946 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.