CentOS Icon CentOS Logo
CentOS Text
   
  
www.centos.org Forum Index
   CentOS 6 - Software Support
  Getting Multicast to work on a VLAN interface

 

 Bottom   Previous Topic   Next Topic
  •  Rate Thread
      Rate this Thread
      Excellent
      Good
      Average
      Bad
      Terrible
Poster Thread
  •  Jiro
      Jiro
Re: Getting Multicast to work on a VLAN interface
#3
Newbie
Joined: 2012/7/9
From
Posts: 3
Helllo,
i have some new information regarding to my problem:

It works without any issues on a Windows XP system!

BR Jiro
Posted on: 2012/7/12 7:02
Create PDF from Post Print
Top
  •  Jiro
      Jiro
Re: Getting Multicast to work on a VLAN interface
#2
Newbie
Joined: 2012/7/9
From
Posts: 3
Bump!

I have another interesting fact about my Problem:

It looks like the code is working fine on a 64 bit version of CentOS:

Linux localhost 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux


So what could i have done wrong on the other machine?

BR
Jiro
Posted on: 2012/7/10 6:50
Create PDF from Post Print
Top
  •  Jiro
      Jiro
Getting Multicast to work on a VLAN interface
#1
Newbie
Joined: 2012/7/9
From
Posts: 3
Hello I am trying to get IP Multicast to work on a VLAN interface.

My code looks like this:

int getInterfaceInfo(const char *ifc, uint32_t *ipaddr, uint8_t *mac)
{
# define MAX_IFC_SETS 16

  printf("get InterfaceInfo ifc: <%s>, len: %i\n", ifc,strlen(ifc));

  struct ifconf ifr_conf;
  struct ifreq set[MAX_IFC_SETS];
  int s;
  unsigned i;
  struct sockaddr_in *addr;

  if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
    printf("Error Socket!\n");
    return -1;
  }

  ifr_conf.ifc_len = sizeof(struct ifreq) * MAX_IFC_SETS;
  ifr_conf.ifc_req = set;

  if (ioctl(s, SIOCGIFCONF, & ifr_conf) < 0) {
    printf("Error SIOCGICONF!\n");
    return -1;
  }

  for (i = 0; i < ifr_conf.ifc_len / sizeof(struct ifreq); i++){
    if ((!ifc[0] && strncmp(ifr_conf.ifc_req[i].ifr_name, "eth0", IFNAMSIZ) == 0) || 
        (ifc[0] && strncmp(ifr_conf.ifc_req[i].ifr_name, ifc, IFNAMSIZ) == 0)) {
       addr = (struct sockaddr_in *) & ifr_conf.ifc_req[i].ifr_addr;
       *ipaddr =  addr->sin_addr.s_addr;
       // return interface index
       printf("Our Interface: index: %i, name: %s, ip: %s\n",i,ifr_conf.ifc_req[i].ifr_name,inet_ntoa(addr->sin_addr));

       // get also mac
       if (ioctl(s, SIOCGIFHWADDR, &ifr_conf.ifc_req[i])  < 0) 
         return -1;
       memcpy(mac, ifr_conf.ifc_req[i].ifr_hwaddr.sa_data, 6);
       close(s);
       return i;
    }
  }
  close(s);

  return -1;
}

MCPort::MCPort(const PortAddress_t mcaddr, const uint16_t port, const char *laddr) {

  struct sockaddr_in ssock;
  struct ip_mreq mreq;
  int one = 1;
  int zero = 0;
  int ttl = 64;

  m_port = port;
  uint8_t mac[6];
  // initialize 
  memset(&ssock, 0, sizeof(ssock));
  ssock.sin_family = AF_INET;
  ssock.sin_addr.s_addr = INADDR_ANY;

  // create datagram socket
  if ((m_sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
    return;
  
  setsockopt(m_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one));

  // bind to port
  ssock.sin_port = htons(port);
  if (bind(m_sock, (struct sockaddr *)&ssock, 
           sizeof(struct sockaddr_in)) < 0){
    m_sock = -1;
    return;
  }

  // to be able to receive multicast packets
  memcpy(&mreq.imr_multiaddr.s_addr,&mcaddr.addr,sizeof(mreq.imr_multiaddr.s_addr));
  uint32_t ipaddr;
  int index = getInterfaceInfo(laddr, &ipaddr, mac);
  mreq.imr_interface.s_addr = ipaddr; 
  if (setsockopt(m_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0) {
    m_sock = -3;
    return;
  }
  // prevent from receiving own multicast packet
  if (setsockopt(m_sock, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&zero, sizeof(zero)) < 0) {
    m_sock = -4;
    return;
  }

  // to be able to send multicast packets from the right interface
  struct in_addr localInterface;
  localInterface.s_addr = ipaddr;
  printf("sockopt ip: %s\n",inet_ntoa(localInterface));
  if (setsockopt(m_sock, IPPROTO_IP, IP_MULTICAST_IF, (char*)&localInterface, sizeof(localInterface)) < 0)
  {
     printf("Error %i: %s\n",errno,strerror(errno));
     m_sock = -6;
     return;
  }
}


Network configuration is as follows:
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:78:EC:49
          inet addr:192.168.102.166  Bcast:192.168.103.255  Mask:255.255.254.0
          inet6 addr: fe80::a00:27ff:fe78:ec49/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:827107 errors:0 dropped:0 overruns:0 frame:0
          TX packets:678985 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:419623378 (400.1 MiB)  TX bytes:547112945 (521.7 MiB)

eth0.57   Link encap:Ethernet  HWaddr 08:00:27:78:EC:49
          inet addr:11.0.0.66  Bcast:11.255.255.255  Mask:255.0.0.0
          inet6 addr: fe80::a00:27ff:fe78:ec49/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:4177 (4.0 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


Kernel Info:
[root@localhost ~]# uname -a
Linux LiveLinVM 2.6.32-220.el6.i686 #1 SMP Tue Dec 6 16:15:40 GMT 2011 i686 i686 i386 GNU/Linux


My code is called with the following parameters:

mcaddr is "\xE0\x00\x00\x0a"
port 200
laddr eth0 or eth0.57

What happens is this:
When laddr is "eth0" all is fine and working as expected. I can receive UDP-Pakets sent to the Multicast-Address and sent UDP-Pakets go out on the correct interface

When laddr is "eth0.57" the "setsockopt IP_MULTICAST_IF" call fails with EINVAL.

Can anybody point me in the right direction where my mistake is?

BR
Jiro
Posted on: 2012/7/9 12:46
Create PDF from Post Print
Top
 Top   Previous Topic   Next Topic

 


 You cannot start a new topic.
 You can view topic.
 You cannot reply to posts.
 You cannot edit your posts.
 You cannot delete your posts.
 You cannot add new polls.
 You cannot vote in polls.
 You cannot attach files to posts.
 You cannot post without approval.




"Linux" is a registered trademark of Linus Torvalds. | All other trademarks are property of their respective owners. | All other content is Copyright @ 2004-2009 by the CentOS Project or "each individual contributor (forums, comments, etc.) unless otherwise assigned".| Theme based on a theme by 7dana.com