Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

listen É IPv6

0 views
Skip to first unread message

Evgeny Chevtaev

unread,
Jun 3, 2021, 8:35:01 PM6/3/21
to
Hi All!

Кто-нибудь знает, в каком виде в директиве listen указывать IPv6-адрес? Это я
про конфиг эхотага, конечно же...


Если указывать как есть, то он считает, что всё после первого двоеточия есть
порт:

? 04 Jun 04:56:50 [915] e2c0:574:5555:f1d0:2:5010:275: incorrect port
(getaddrinfo: Service was not recognized for socket type)
? 04 Jun 04:56:50 [915] e2c0:574:5555:f1d0:2:5010:275: bad port number


Если указывать в квадратных скобках, то пытается ресолвить:

? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve (8)


Пока что прописал в hosts буквенное имя для адреса и сказал слушать его.

With best regards,
Evgeny

Nil A

unread,
Jun 4, 2021, 12:00:01 AM6/4/21
to
Hello, Evgeny!

Friday June 04 2021 05:29, from Evgeny Chevtaev -> All:

EC> Кто-нибудь знает, в каком виде в директиве listen указывать
EC> IPv6-адрес? Это я про конфиг эхотага, конечно же...

В директиве listen адрес IPv6 пишется в квадратных скобках [], и также
опционально можно задать порт через двоеточие.

EC> Если указывать как есть, то он считает, что всё после первого
EC> двоеточия есть порт:

Поэтому парсер binkd конфига и ищет '[', чтобы понять, что это IPv6, в котором
двоеточие является частью адреса.

EC> Если указывать в квадратных скобках, то пытается ресолвить:
EC> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve
EC> (8)

Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный вместе со
скобочками [].
Я не знаю, как у других это работает.

Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в таком виде
у меня getaddrinfo() работает как ожидается.

-+- a/readcfg.c
+++ b/readcfg.c
@@ -1650,12 +1650,13 @@ static int read_listen (KEYWORD *key, int wordcount,
char **words)
new_entry.port[0] = '\0';
if (words[i][0] == '[')
{ /* IPv6 */
- p = strchr(words[i], ']');
- if (p && p[1] == ':')
+ strncpy(new_entry.addr, words[i]+1, sizeof(new_entry.addr));
+ p = strchr(new_entry.addr, ']');
+ if (p)
{
- snprintf(new_entry.port, sizeof(new_entry.port), "%s", p + 2);
- p = strchr(new_entry.addr, ']');
- if (p) p[1] = '\0';
+ p[0] = '\0';
+ if (p[1] == ':')
+ snprintf(new_entry.port, sizeof(new_entry.port), "%s", p + 2);
}
} else if ((p = strchr(words[i], ':')) != NULL)
{

Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть длинными,
особенно если ещё порт указать.

-+- a/readcfg.h
+++ b/readcfg.h
@@ -54,7 +54,7 @@ struct akachain
struct listenchain
{
struct listenchain *next;
- char addr[42];
+ char addr[256];
char port[MAXSERVNAME + 1];
};
#if defined(WITH_ZLIB) || defined(WITH_BZLIB2)


Best Regards, Nil

Nil A

unread,
Jun 4, 2021, 12:05:01 AM6/4/21
to
Hello, Evgeny!

Friday June 04 2021 05:29, from Evgeny Chevtaev -> All:

EC> Кто-нибудь знает, в каком виде в директиве listen указывать
EC> IPv6-адрес? Это я про конфиг эхотага, конечно же...

В директиве listen адрес IPv6 пишется в квадратных скобках [], и также
опционально можно задать порт через двоеточие.

EC> Если указывать как есть, то он считает, что всё после первого
EC> двоеточия есть порт:

Поэтому парсер binkd конфига и ищет '[', чтобы понять, что это IPv6, в котором
двоеточие является частью адреса.

EC> Если указывать в квадратных скобках, то пытается ресолвить:
EC> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not resolve
EC> (8)

Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный вместе со
скобочками [].
Я не знаю, как у других это работает.

Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в таком виде
у меня getaddrinfo() работает как ожидается.

-+- a/readcfg.c
+++ b/readcfg.c
@@ -1650,12 +1650,14 @@ static int read_listen (KEYWORD *key, int wordcount,
char **words)
new_entry.port[0] = '\0';
if (words[i][0] == '[')
{ /* IPv6 */
- p = strchr(words[i], ']');
- if (p && p[1] == ':')
+ strncpy(new_entry.addr, words[i]+1, sizeof(new_entry.addr));
+ new_entry.addr[sizeof(new_entry.addr)-1] = '\0';

Evgeny Chevtaev

unread,
Jun 4, 2021, 4:10:01 AM6/4/21
to
Hi Nil!

Friday June 04 2021 06:47, Nil A wrote to Evgeny Chevtaev:

EC>> Если указывать в квадратных скобках, то пытается ресолвить:
EC>> ? 04 Jun 05:17:21 [1767] servmgr getaddrinfo: Name does not
EC>> resolve (8)
NA> Мой getaddrinfo() из линксового glibc отбраковывает адрес указанный
NA> вместе со скобочками []. Я не знаю, как у других это работает.
NA> Далее идёт мой патч, который выкидывает скобочки из адреса IPv6, и в
NA> таком виде у меня getaddrinfo() работает как ожидается.

Во, с этим патчем заработало!

NA> Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть
NA> длинными, особенно если ещё порт указать.
NA> - char addr[42];

Видимо, расчёт был такой, что 42 - это 8 групп по 4 символа, разделённых 7
двоеточиями, в 2 квадратных скобках и в конце \0. ;) А порт забыли.

With best regards,
Evgeny

Alexey Vissarionov

unread,
Jun 4, 2021, 4:30:01 AM6/4/21
to
Доброго времени суток, Evgeny!
04 Jun 2021 13:03:26, ты -> Nil A:

NA>> Ещё надо бы увеличить буфер для адреса, а то IPv6 адреса могут быть
NA>> длинными, особенно если ещё порт указать.
NA>> - char addr[42];
EC> Видимо, расчёт был такой, что 42 - это 8 групп по 4 символа,
EC> разделённых 7 двоеточиями, в 2 квадратных скобках и в конце \0. ;)
EC> А порт забыли.

+ uint8_t addr[48];

Не надо использовать char для байтов. Да, уже сейчас.
А uint16_t в 5 десятичных цифр заведомо укладывается.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Не рой другому яму - перебьешь свой кабель
0 new messages