Ejemplo n.º 1
0
void
exec_command_set_mcast_iface (char * str, int sock)
{
	char cmd[CONTROL_CMD_BUF_LEN];
	char ifname[CONTROL_CMD_BUF_LEN];
	char errbuf[256];
	
	if (sscanf (str, "%s %s", cmd, ifname) < 2) {
		write (sock, CONTROL_ERRMSG, sizeof (CONTROL_ERRMSG));
		return;
	}

	if (set_ipv4_mcast_iface (vxlan.udp_sock, ifname) < 0) {
		sprintf (errbuf, "failed: can not set interface \"%s\"", ifname);
		write (sock, errbuf, strlen (errbuf));
		return;
	}
	
	set_ipv4_multicast_loop (vxlan.udp_sock, 0);
	set_ipv4_multicast_ttl (vxlan.udp_sock, VXLAN_MCAST_TTL);

	strncpy (vxlan.if_name, ifname, IFNAMSIZ);

	return;
}	
Ejemplo n.º 2
0
bool
init_net( struct vxlan *_vxlan ) {
  assert( _vxlan != NULL );

  vxlan = _vxlan;

  vxlan->udp_sock = socket( AF_INET, SOCK_DGRAM, 0 );
  if ( vxlan->udp_sock < 0 ) {
    char buf[ 256 ];
    char *error_string = safe_strerror_r( errno, buf, sizeof( buf ) );
    error( "Failed to create a socket for IPv4 ( ret = %d, errno = %s [%d] ).",
           vxlan->udp_sock, error_string, errno );
    goto error;
  }

  bool ret = bind_ipv4_inaddrany( vxlan->udp_sock, vxlan->port );
  if ( !ret ) {
    goto error;
  }
  ret = set_ipv4_multicast_loop( vxlan->udp_sock, 0 );
  if ( !ret ) {
    goto error;
  }
  ret = set_ipv4_multicast_ttl( vxlan->udp_sock, VXLAN_MCAST_TTL );
  if ( !ret ) {
    goto error;
  }

  ret = update_interface_state();
  if ( !ret ) {
    goto error;
  }

  ret = init_multicast_group_table();
  if ( !ret ) {
    goto error;
  }

  return true;

error:
  if ( vxlan->udp_sock >= 0 ) {
    close( vxlan->udp_sock );
  }

  return false;
}
Ejemplo n.º 3
0
void
exec_command_set_mcast_addr (char * str, int sock)
{
	char cmd[CONTROL_CMD_BUF_LEN];
	char addr[CONTROL_CMD_BUF_LEN];
	char errbuf[256];
	struct in_addr m_addr;
	
	if (sscanf (str, "%s %s", cmd, addr) < 2) {
		write (sock, CONTROL_ERRMSG, sizeof (CONTROL_ERRMSG));
		return;
	}
	
	if (inet_pton (AF_INET, addr, &m_addr) < 1) {
		sprintf (errbuf, "failed: invalid address \"%s\"", addr);
		write (sock, errbuf, strlen (errbuf));
		return;
	}

	if (drop_ipv4_mcast_addr (vxlan.udp_sock, 
				  EXTRACT_INADDR (vxlan.mcast_addr)) < 0) {
		strcpy (errbuf, "failed: can not leave existing group");
		write (sock, errbuf, strlen (errbuf));
		return;
	}

	if (set_ipv4_mcast_addr (vxlan.udp_sock, m_addr)) {
		sprintf (errbuf, "failed: invalid multicast address \"%s\"",
			 inet_ntoa (m_addr));
		write (sock, errbuf, strlen (errbuf));
		set_ipv4_mcast_addr (vxlan.udp_sock, EXTRACT_INADDR (vxlan.mcast_addr));
		return;
	}

	set_ipv4_multicast_loop (vxlan.udp_sock, 0);
	set_ipv4_multicast_ttl (vxlan.udp_sock, VXLAN_MCAST_TTL);

	((struct sockaddr_in *)&vxlan.mcast_addr)->sin_addr = m_addr;

	return;
}