Hi,
I have been debugging this issue for quite some time and think I have
reproducible evidence that localizes this to the hardware.
I have a single nic, lspci lists it as:
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd.
RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 02)
I want to connect to a multicast session using my Fedora 9. I have
successfully connected to the same multicast session using other PCs,
some running Fedora 9, some running other distos, and some running
Windows. If I put a 3com nic into my box, I am able to successfully
connect to the multicast session using my box.
I broke this down to a very simple program. I now just do the bare
minimum to connect to the stream. I am going to attach the c file of
the program. When I run this on a working computer, it gets through
the loop grabbing data off the multicast session. When I run this on
my box with the realtek chip, the program block on the call recvfrom()
forever.
I am left to conclude this is a bug in the realtek driver that is
preventing proper joining of a multicast session.
Any idea about how to resolve this or test it further?
Thanks,
Jon
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
#include <memory.h>
#include <time.h>
#define BUF_LEN 256
#define MADDR "235.0.0.3"
#define PORT 17000
int main(int argc, char *argv[])
{
struct sockaddr_in sin;
struct ip_mreq mreq;
socklen_t sin_len;
int sock_fd;
char buf[BUF_LEN];
int bytes_received;
int i;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
if (sock_fd < 0) {
perror("unable to open socket fd\n");
exit(1);
}
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = INADDR_ANY;
sin_len = sizeof(sin);
if(bind(sock_fd, (struct sockaddr *)&sin, sin_len)) {
perror("unable to bind socket\n");
close(sock_fd);
exit(1);
}
mreq.imr_multiaddr.s_addr = inet_addr(MADDR);
mreq.imr_interface.s_addr = INADDR_ANY;
if(setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
sizeof(mreq))) {
perror("unable to add membership\n");
close(sock_fd);
exit(1);
}
for (i = 0; i < 10; i++) {
struct timespec sleeptime = {
.tv_sec = 1,
.tv_nsec = 0,
};
printf("loop %d:\n", i);
bytes_received = recvfrom(sock_fd, buf, BUF_LEN, 0, NULL, NULL);
printf("\treceived %d bytes\n", bytes_received);
nanosleep(&sleeptime, NULL);
}
setsockopt(sock_fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq,
sizeof(mreq));
close(sock_fd);
return 0;
}
--
fedora-list mailing list
[email protected]
To unsubscribe: https://www.redhat.com/mailman/listinfo/fedora-list
Guidelines: http://fedoraproject.org/wiki/Communicate/MailingListGuidelines