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