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; }
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; }
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; }