bind(2) na neexistujici rozhrani
Jirka Kosina
jikos na jikos.cz
Úterý Listopad 27 13:47:30 CET 2001
On Tue, 27 Nov 2001, Jan Kasprzak wrote:
> : serv_addr.sin_addr.s_addr = htonl(random()/1000); //nahodne cislo ;)
> Zkuste tady dat neco, co v nejvyssim bajtu nema nulu. Treba
> 0x11223344, nebo jen random(). Bez teto modifikace mi vas program prosel,
> s ni hlasi chybu bind().
> Dalo mi to asi hodinu zkoumani, proc muj temer identicky
> program (bez toho setsockopt(...SO_REUSEADDR...)) nefungoval, a vas ano.
> Pridal jsem setsockopt(), dokonce jsem menil poradi direktiv #include
> presne podle vaseho programu, a muj furt padal a vas ne. Bylo to
> v IP adrese.
> Kernel 2.4.14.
No, koukal jsem ted do ipv4/af_inet.c, a je tam tahle konstrukce (u funkce
inet_bind())
/* It is off by default, see below. */
int sysctl_ip_nonlocal_bind;
static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int
addr_len)
{
...
chk_addr_ret = inet_addr_type(addr->sin_addr.s_addr);
/* Not specified by any standard per-se, however it breaks too
* many applications when removed. It is unfortunate since
* allowing applications to make a non-local bind solves
* several problems with systems using dynamic addressing.
* (ie. your servers still start up even if your ISDN link
* is temporarily down)
*/
if (sysctl_ip_nonlocal_bind == 0 &&
sk->protinfo.af_inet.freebind == 0 &&
addr->sin_addr.s_addr != INADDR_ANY &&
chk_addr_ret != RTN_LOCAL &&
chk_addr_ret != RTN_MULTICAST &&
chk_addr_ret != RTN_BROADCAST)
return -EADDRNOTAVAIL;
Z cehoz je videt, ze kdyz se udela neco jako
[root na twin /root]# sysctl -w net.ipv4.ip_nonlocal_bind=1
tak to bude fungovat. Vyzkousel jsem, a sktuecne to zaclo bindovat i
adresy s nenulovym nejvyssim bajtem.
Je to uspokojive reseni? ;)
Vysvetleni pro to, ze to nebinduje nektere adresy bych hledal v testovani
na neshodu s RTN_*, kterezto souvisi s (makry ? nehledal jsem)
ZERONET(), BADCLASS(), MULTICAST(), ktere jsou volany ve funkci
inet_addr_type() v fib_frontend.c, a na jejichz vysledku zavisi navratova
hodnota zpet do inet_bind(), a nasledne testovani te konjuknce, na jejimz
zaklade muze dojit k return -EADDRNOTAVAIL.
--
JiKos.
Další informace o konferenci Linux