(usagi-users 03471) Re: IPv6 Multicast question - connect fails

Bas Vermeulen <[email protected]>
Newsgroups gmane.linux.ipv6.usagi.users
Message-ID <[email protected]>
On Wed, 2005-08-10 at 11:51 +0200, Jeroen Massar wrote:
> On Tue, 2005-08-09 at 17:01 +0200, Bas Vermeulen wrote:
> > On Tue, 2005-08-09 at 13:54 +0200, Jeroen Massar wrote:
> > > On Mon, 2005-08-08 at 15:58 +0200, Bas Vermeulen wrote:
> <SNIP>
> > > You definitely should be using getaddrinfo() See google(eva ipv6) =
> > > gsyc.escet.urjc.es/~eva/IPv6-web/ipv6.html for the details.
> > 
> > Right. I've changed the code slightly to use getaddrinfo(). I still get
> > the same result. What I do now:
> 
> Making a getaddr() function, copying that the structure you get from it
> and reusing it with the wrong lenghts is a bad idea, treat it as a big
> black box and don't touch/care about the contents.
> 
> This line:
> > if (bind(s, &addr6, sizeof(addr6)
> fails simply because sizeof(addr6) != res->ai_addrlen...
> adding a variable to store the length of res->ai_addrlen in and then
> passing this to bind might work though.

The bind actually works though.

> Another reason why the bind() might fail is because you bind to it,
> close it, and then rebind it, the OS might not have cleansed the bind,
> using additionally REUSEPORT helps a bit here, then again, the OS
> probably nicely closes it and you didn't specify a local port in the
> first place... hmm...
> 
> Also, when doing this, check that res->ai_addrlen < sizeof(struct
> sockaddr_storage) just in case it ever becomes to big, which it should
> not do, but still.
> 
> The other thing is that you are bind()'ing and connect()'ing to the same
> address, the OS will refuse to do that I hope.


> That all said, find attached a 'working' version:
> 
> jeroen@firenze:~$ ./mcast ff80::1 5060 fe80::202:55ff:fee6:21e8%eth0
> 1234
> Trying to connect to [ff80::1]:5060
> Binding local socket to [fe80::202:55ff:fee6:21e8%eth0]:1234
> Trying [fe80::202:55ff:fee6:21e8%eth0]:1234 OK
> Connecting to [ff80::1]:5060... OK
> All went fine
> Shutting down
> 
> jeroen@firenze:~$ ./mcast ff80::1
> 5060                                   
> Trying to connect to [ff80::1]:5060
> Connecting to [ff80::1]:5060... OK
> All went fine
> Shutting down
> 
> (Tested on a debianized Linux 2.6.10-1-686, thus basically stock kernel)

Well, semi-working. The following is from a stock 2.6.13-ac6:

eth0      Link encap:Ethernet  HWaddr 00:08:74:96:18:ED
          inet addr:192.168.218.67  Bcast:192.168.218.255
Mask:255.255.255.0
          inet6 addr: fe80::208:74ff:fe96:18ed/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:107026 errors:0 dropped:0 overruns:2 frame:0
          TX packets:84360 errors:0 dropped:0 overruns:0 carrier:1
          collisions:803 txqueuelen:1000
          RX bytes:37137640 (35.4 MiB)  TX bytes:7531636 (7.1 MiB)
          Interrupt:11 Base address:0xec80

[bvermeul@laptop ~]$ ./mcast ff01::1 5060
Trying to connect to [ff01::1]:5060
Connecting to [ff01::1]:5060... OK
All went fine
Shutting down
[bvermeul@laptop ~]$

[bvermeul@laptop ~]$ ./mcast ff80::1 5060
Trying to connect to [ff80::1]:5060
Connecting to [ff80::1]:5060... FAIL!
[bvermeul@laptop ~]$

[bvermeul@laptop ~]$ ./mcast ff35::1 5060
Trying to connect to [ff35::1]:5060
Connecting to [ff35::1]:5060... FAIL!
[bvermeul@laptop ~]$ 

Which is about the same as my code does. I'm trying to understand the
difference between your setup and mine, so I can actually get it
working. I'm pretty sure it's not the bind() that's causing problems,
the connect() is giving an error, perhaps because it can't get a route
out to the right scope.

> (btw using goto's ????)

I'm a kernel programmer, and am not opposed to goto's. :) This is
basically just a quick and dirty approach, and the goto was an easy way
to get the right error reporting.

-- 
Bas Vermeulen <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.