The OpenNET Project / Index page

[ новости/++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"net, SCTP - граблехождение"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Сеть, сокеты)
Изначальное сообщение [ Отслеживать ]

"net, SCTP - граблехождение"  +/
Сообщение от никто (??) on 13-Мрт-11, 12:07 
Возможно ли привязаться к IPv4 "0.0.0.0" после привязки к первичному IPv6 "::"?
Просьба подсобить или ткнуть урл-ом на стандарт или обсуждение.

Исходный выхлоп (gcc -lsctp -o sctp sctp.c && strace ./sctp),
...
socket(PF_INET6, SOCK_STREAM, 0x84 /* IPPROTO_??? */) = 3
setsockopt(3, 0x84 /* SOL_?? */, 11, "\1\1\0\0\0\0\0\0\0", 9) = 0
setsockopt(3, 0x84 /* SOL_?? */, 2, "\4\0\4\0\4\0\0\0", 8) = 0
bind(3, {sa_family=AF_INET6, sin6_port=htons(55555), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
setsockopt(3, 0x84 /* SOL_?? */, 100, "\2\0\331\3\0\0\0\0\0\0\0\0\0\0\0\0", 16) = -1 EINVAL (Invalid argument)

...


Исходник (sctp.c),

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/sctp.h>
#include <arpa/inet.h>
#include <errno.h>

#include "hassalen.h"


#if !defined(SHOULD_IPPROTO_SCTP)
#define SHOULD_IPPROTO_SCTP 132
#endif


#define MAX_STREAM 4


struct sctp_initmsg initmsg = {0};
struct sctp_event_subscribe events = {0};

int fd1;
int fd2;

struct sockaddr *sa;

struct sockaddr_in  a4 = {0};
struct sockaddr_in6 a6 = {0};

char *addr4 = "0.0.0.0";
char *addr6 = "::";

unsigned int port1 = 55555;
unsigned int port2 = 55555;

int main() {

  int ret;

  if (inet_pton(AF_INET6,addr6,(void *) &a6.sin6_addr) <= 0)
    _exit(1);

  a6.sin6_port        = htons((unsigned short) port1);
  a6.sin6_family      = AF_INET6;
#if defined(HASSALEN)
  a6.sin6_len         = sizeof (struct sockaddr_in6);
#endif

  fd1 = socket(AF_INET6,SOCK_STREAM,SHOULD_IPPROTO_SCTP);
  if (fd1 < 0) _exit(1);

  events.sctp_association_event = 1;
  events.sctp_data_io_event = 1;

  ret = setsockopt(fd1, IPPROTO_SCTP, SCTP_EVENTS, &events,sizeof (events));
  if (ret < 0) _exit(1);

  initmsg.sinit_num_ostreams  = MAX_STREAM;
  initmsg.sinit_max_instreams = MAX_STREAM;
  initmsg.sinit_max_attempts  = MAX_STREAM;

  ret = setsockopt(fd1, IPPROTO_SCTP, SCTP_INITMSG, &initmsg, sizeof(struct sctp_initmsg));
  if (ret < 0) _exit(1);

  ret = bind(fd1,(struct sockaddr *) &a6,sizeof(a6));
  if (ret < 0) _exit(1);
//
  if (inet_pton(AF_INET,addr4,(void *) &a4.sin_addr) <= 0)
    _exit(1);

  a4.sin_port        = htons((unsigned short) port2);
  a4.sin_family      = AF_INET;

#if defined(HASSALEN)
  a4.sin_len = sizeof(struct sockaddr_in);
#endif

  sa = (struct sockaddr *) &a4;

  ret = sctp_bindx(fd1,sa,1,SCTP_BINDX_ADD_ADDR);
  if (ret != 0) _exit(1);

  close(fd1);

  _exit(0);
}

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "net, SCTP - граблехождение"  +/
Сообщение от guest (??) on 13-Мрт-11, 20:08 
http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-15#se...
Note
   that the wildcard addresses cannot be used with this function, doing
   so will result in an error.

Похоже оно...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "net, SCTP - граблехождение"  +/
Сообщение от nikto on 14-Мрт-11, 12:27 
> http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-15#se...
> Note
>    that the wildcard addresses cannot be used with this
> function, doing
>    so will result in an error.
> Похоже оно...

В том-то и анекдот, что порядок вызова для разных стеков(v4 & v6) корректен.

>If sd is an IPv4 socket, the addresses passed must be IPv4 addresses.
>If the sd is an IPv6 socket, the addresses passed can either be IPv4
>or IPv6 addresses.

Досадно, что в стандарте ничего не сказано по поводу явной привязки ANY_ADDRESS(v4 and v6), тем более что привязка по первичному адрессу IPv6 проходит успешно и параметры второго вызова синтаксически корректны

...
bind(3, {sa_family=AF_INET6, sin6_port=htons(55555), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
setsockopt(3, 0x84 /* SOL_?? */, 100, "\2\0\331\3\0\0\0\0\0\0\0\0\0\0\0\0", 16) = -1 EINVAL (Invalid argument)
...

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 13:08 
Вопрос реально очень интересный, сам давно облизываюсь на sctp но работать с ним пока не приходилось.

> В том-то и анекдот, что порядок вызова для разных стеков(v4 & v6)
> корректен.

Эм... лично я понял этот абзац так:
wildcard адрес может быть _только_ один.
Т.е. если мы сделали bind() на in6addr_any то на INADDR_ANY sctp_bindx() уже не пройдет.
Вы понимаете этот текст иначе?

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "net, SCTP - граблехождение"  +/
Сообщение от nikto on 14-Мрт-11, 13:34 
> Эм... лично я понял этот абзац так:
> wildcard адрес может быть _только_ один.
> Т.е. если мы сделали bind() на in6addr_any то на INADDR_ANY sctp_bindx() уже
> не пройдет.
> Вы понимаете этот текст иначе?

Щаз прикручиваю к одному своему проекту.
Явно не указано по поводу количествa ANY, указан только порядок для разных "family"

Граблехождение показало, что после привязки первого ANY, независимо от семейства и OC дальнейшая привязка любого адреса, даже того же семейства, обламывается.


И по поводу SCTP, там есть одна грабля специфическая и возможные пути обхода, описание в поисковик: sctp tsvwg-1.pdf

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 13:44 
> Граблехождение показало, что после привязки первого ANY, независимо от семейства и OC
> дальнейшая привязка любого адреса, даже того же семейства, обламывается.

Т.е. тот абзац следует понимать так:
после bind(x) на ANY больше ни к каким адресам не привязаться?

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 13:47 
> И по поводу SCTP, там есть одна грабля специфическая и возможные пути
> обхода, описание в поисковик: sctp tsvwg-1.pdf

Это как я понимаю уже про добавление адресов после установки соединения.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

9. "net, SCTP - граблехождение"  +/
Сообщение от nikto on 14-Мрт-11, 13:59 
>> И по поводу SCTP, там есть одна грабля специфическая и возможные пути
>> обхода, описание в поисковик: sctp tsvwg-1.pdf
> Это как я понимаю уже про добавление адресов после установки соединения.

Нет, там засада с multihoming небольшая, самый изящный вариант решения на ядренном уровне решить, но пока насколько мне известно вопрос открытый.

Стендовые прогоны показали, что к heartbiting`y не хватает, стр.9 документа: Adding New State in Path Management, игры с таймингами RTO/RTT/и пр. - есть полумеры, а выносить в user-space как-то не камильфо, в общем нет в жизни полного счастья.

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

10. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 14:03 
> Нет, там засада с multihoming небольшая, самый изящный вариант решения на ядренном
> уровне решить, но пока насколько мне известно вопрос открытый.

Тогда вы мне не тот документ подсунули)

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

11. "net, SCTP - граблехождение"  +/
Сообщение от nikto on 14-Мрт-11, 14:16 
>> Нет, там засада с multihoming небольшая, самый изящный вариант решения на ядренном
>> уровне решить, но пока насколько мне известно вопрос открытый.
> Тогда вы мне не тот документ подсунули)

Там другое, имо там самый существенная проблема sctp:
Документ: Quick failover algrotithn in sctp
Авторы: Yoshifumi Nishida, Preethi Natarajan

Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

12. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 14:22 
> Там другое, имо там самый существенная проблема sctp:
> Документ: Quick failover algrotithn in sctp
> Авторы: Yoshifumi Nishida, Preethi Natarajan

Cпс нашлось.
Просто 1е, что выпадает в гугле на "sctp tsvwg-1.pdf" завется Authenticated Chunks for SCTP :)

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

7. "net, SCTP - граблехождение"  +/
Сообщение от nikto on 14-Мрт-11, 13:48 
>> Эм... лично я понял этот абзац так:
>> wildcard адрес может быть _только_ один.
>> Т.е. если мы сделали bind() на in6addr_any то на INADDR_ANY sctp_bindx() уже
>> не пройдет.
>> Вы понимаете этот текст иначе?
> Явно не указано по поводу количествa ANY, указан только порядок для разных
> "family"

Моя вина упустил, все-таки явно указано.

Досадно всё же, что при использовании ANY происходит такая хрень:

>Граблехождение показало, что после привязки первого ANY, независимо от семейства и OC
>дальнейшая привязка любого адреса, даже того же семейства, обламывается.

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

8. "net, SCTP - граблехождение"  +/
Сообщение от guest email(??) on 14-Мрт-11, 13:55 
> Моя вина упустил, все-таки явно указано.
> Досадно всё же, что при использовании ANY происходит такая хрень:

По факту да. происходит.
   A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see
   Section 3.1.2 for this usage.
Меня настораживает, что тут single. Если бы там было что-то вроди only one
то было бы однозначно, а так я не уверен что правильно понимаю.
Но опять же ваш тест показывает...
Наверное надо идти к авторам lksctp и просить разъяснений в их рассылках.


Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема


  Закладки на сайте
  Проследить за страницей
Created 1996-2018 by Maxim Chirkov  
ДобавитьПоддержатьВебмастеруГИД  
Hosting by Ihor