This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Multi-cast support in Ethernet drivers


On 7/9/07, Andrew Lunn <andrew@lunn.ch> wrote:
On Mon, Jul 09, 2007 at 10:59:42AM +0400, Alexander Aganichev wrote:
> On 7/8/07, Andrew Lunn <andrew@lunn.ch> wrote:
>> On Fri, Jul 06, 2007 at 05:06:41PM +0400, Alexander Aganichev wrote:
>> > Hello,
>> >
>> > I noticed that when I use DM9000 driver I have a complaint from the IO
>> > subsystem that multi-cast is not supported, but wanted by FreeBSD
>> > stack. I added this support and everything stop working. I dig it a
>> > bit and found that FreeBSD wanted some bogus address to be added. It
>> > seems it cannot work at all since link level address is seems not
>> > filled in the struct sockaddr_dl anywhere in the eCos tree (correct me
>> > if I'm wrong, but I was unable to find it). So now I'm confused why
>> > this complaint was ever introduced and how it works for the Ethernet
>> > drivers that support multi-cast mode already... For now I just
>> > disabled the feature and return good result to prevent complaint. Any
>> > ideas how it should work correctly?
>>
>> Multicast support is required for IPv6 support. It is not needed for
>> IPv4.
>>
>> It looks like the IPv4 code is joining the all hosts group at start
>> up. See packages/net/bsd_tcpip/current/src/sys/netinet/in.c:738 Is it
>> this call which is causing your problems?
>
> Yes, it is this call. What is the best way to resolve that?

The call looks valid. At least it does not cause other platforms to
break. I suggests that the problem is in your modifications to the
DM9000 driver to support this IOCTL call.

I dig a little bit more, and found that address I suspect in incorrectness is generated with this macro in netinet/if_ether.h:

/*
* Macro to map an IP multicast address to an Ethernet multicast address.
* The high-order 25 bits of the Ethernet address are statically assigned,
* and the low-order 23 bits are taken from the low end of the IP address.
*/
#define ETHER_MAP_IP_MULTICAST(ipaddr, enaddr) \
	/* struct in_addr *ipaddr; */ \
	/* u_char enaddr[ETHER_ADDR_LEN];	   */ \
{ \
	(enaddr)[0] = 0x01; \
	(enaddr)[1] = 0x00; \
	(enaddr)[2] = 0x5e; \
	(enaddr)[3] = ((u_char *)ipaddr)[1] & 0x7f; \
	(enaddr)[4] = ((u_char *)ipaddr)[2]; \
	(enaddr)[5] = ((u_char *)ipaddr)[3]; \
}

The stack sets up multi-cast MAC to 01:00:5e:00:00:01 and cannot talk
to my DHCP anymore.

--
WBR, Alexander

--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]