Exemplo n.º 1
0
int netconn_send_packet(struct netconn *nc, const uint8_t * buffer, int len)
{
	int n;
	while ((n = sendto(nc->sock, buffer, len, 0,
			   (struct sockaddr *) &nc->addr,
			   sock_addrlen((struct sockaddr *) &nc->addr))) < 0) {

		if (errno == EINTR)
			continue;


		return n;
	}

	return n;
}
Exemplo n.º 2
0
int socklist_add_unicast(const char *addr, const char * port, int ac_proto) 
{
	struct addrinfo hints;
	struct addrinfo * res,*res0;
	memset(&hints,0,sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;
	hints.ai_flags=AI_PASSIVE;

	int rc = getaddrinfo(addr,port,&hints,&res0);
	if (rc!=0) {
		cw_log(LOG_ERR,"Can't bind multicast address '%s': %s",addr,gai_strerror(rc));
		return 0;
	}

	for(res=res0; res; res=res->ai_next){
		struct sockaddr *sa = res->ai_addr;
		int sockfd = socket(res->ai_addr->sa_family, SOCK_DGRAM, 0);
		/* create socket */
		if (sockfd==-1){
			cw_log(LOG_ERR,"Can't create unicast socket: %",strerror(errno));
			continue;
		}

		/* bind address */
		if ( bind(sockfd,sa,sock_addrlen(sa)) < 0) {
			close(sockfd);
			cw_log(LOG_ERR,"Can't bind  unicast socket %s: %s",addr,strerror(errno));
			continue;
		}


		socklist[socklist_len].sockfd=sockfd;
		socklist[socklist_len].reply_sockfd=sockfd;
		socklist[socklist_len].family=sa->sa_family;
		socklist[socklist_len].type=SOCKLIST_UNICAST_SOCKET;
		socklist[socklist_len].ac_proto=ac_proto;
	
		socklist_len++;
		cw_log(LOG_INFO,"Bound to: %s (%i)\n",addr,sockfd);
	}

	freeaddrinfo(res0);	
	return 1;
}
Exemplo n.º 3
0
/**
 * Run discovery for on address (eg broadcast 255.255.255.255)
 */
static int cw_run_discovery(struct conn *conn, const char *acaddr)
{

	/* get addr of destination */
	struct addrinfo hints;
	struct addrinfo *res, *res0;
	memset(&hints, 0, sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;

	int rc = getaddrinfo(acaddr, conf_control_port, &hints, &res0);
	if (rc) {
		cw_log(LOG_ERR, "Can't connect to AC %s: %s", acaddr, gai_strerror(rc));
		return 0;
	}

	for (res = res0; res; res = res->ai_next) {

		int sockfd;
		int opt;
		sockfd = socket(res->ai_family, SOCK_DGRAM, 0);
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create socket for %s: %s", acaddr,
			       strerror(errno));
			continue;
		}

		opt = 1;
		if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) < 0) {
			cw_log(LOG_ERR, "Can't set broadcast sockopt");
		}
		sock_set_recvtimeout(sockfd, 1);
		sock_set_dontfrag(sockfd, 0);

		sock_copyaddr(&conn->addr, res->ai_addr);

		
		if (conf_ip){		
			struct sockaddr bind_address;
			sock_strtoaddr(conf_ip,&bind_address); 
			int brc = bind(sockfd,&bind_address,sock_addrlen(&bind_address));
			if (brc<0) {
				cw_log(LOG_ERR,"Can't bind to %s",sock_addr2str(&bind_address));
				return 0;
			}
		}


		conn->sock = sockfd;
		conn->readfrom = conn_recvfrom_packet;

		run_discovery(conn);

		conn->readfrom=NULL;
		close(sockfd);


	}

	freeaddrinfo(res0);

	return 0;
}
Exemplo n.º 4
0
int join(struct sockaddr *sa)
{
	int sockfd;
	int rc;

	sockfd = socket(AF_INET,SOCK_DGRAM,0);
	if (sockfd==-1){
		cw_log(LOG_ERR,"Can't create socket: %s\n",strerror(errno));
		return -1;
	}

	sock_set_recvtimeout(sockfd,1);

	rc = connect(sockfd,(struct sockaddr*)sa,sock_addrlen((struct sockaddr*)sa));
	if (rc<0){
		char str[100];
		sock_addrtostr(sa,str,100);
		cw_log(LOG_ERR,"Can't connect to %s: %s\n",str,strerror(errno));
		close(sockfd);
		return -1;
	}

	struct conn * conn = get_conn();
	conn->sock=sockfd;
	sock_copyaddr(&conn->addr,sa);

	
#ifdef WITH_DTLS
	cw_dbg (DBG_DTLS,"Establishing DTLS session with %s",sock_addr2str(sa)); 

/*
	#ifdef WITH_CW_LOG_DEBUG
	{
		char str[100];
		sock_addrtostr(sa,str,100);
		cw_log_debug0("Establishing DTLS connection to %s",str);
	}
	#endif
*/
	if (conf_dtls_psk){
		conn->dtls_psk=conf_dtls_psk;
		conn->dtls_psk_len=strlen(conn->dtls_psk);
		conn->dtls_cipher=conf_dtls_cipher;
	}

	if (conf_sslkeyfilename && conf_sslcertfilename){

		conn->dtls_key_file = conf_sslkeyfilename;
		conn->dtls_cert_file = conf_sslcertfilename;
		conn->dtls_key_pass = conf_sslkeypass;
		conn->dtls_cipher=conf_dtls_cipher;
	
	}



	rc = dtls_connect(conn);
	if (rc!=1){
		dtls_shutdown(conn);
		char str[100];
		sock_addrtostr(sa,str,100);
		cw_log(LOG_ERR,"Cant establish DTLS connection to %s",str);
		close(sockfd);
		return 0;
	}

#endif	
	cw_dbg (DBG_DTLS,"DTLS session established with %s, cipher=%s",sock_addr2str(sa),dtls_get_cipher(conn)); 
exit(0);


	#ifdef WITH_CW_LOG_DEBUG
	{
		char str[100];
		sock_addrtostr(sa,str,100);
		cw_log_debug0("DTLS connection to %s established",str);
	}
	#endif

	join_state(conn);

	return 1;
}
Exemplo n.º 5
0
int socklist_add_broadcast(const char *addr, const char *port, int ac_proto)
{
	if (!socklist_check_size())
		return 0;

	struct addrinfo hints;
	struct addrinfo *res, *res0;
	memset(&hints, 0, sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;
	hints.ai_flags = AI_PASSIVE;


	int rc = getaddrinfo(addr, port, &hints, &res0);
	if (rc != 0) {
		cw_log(LOG_ERR, "Can't bind broadcast address '%s': %s", addr,
		       gai_strerror(rc));
		return 0;
	}

	int sockfd;
	for (res = res0; res; res = res->ai_next) {

		struct sockaddr *sa = res->ai_addr;
		sockfd = socket(res->ai_addr->sa_family, SOCK_DGRAM, 0);

		/* create socket */
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create broadcast socket: %",
			       strerror(errno));
			continue;
		}
#ifdef IP_BINDANY
		struct sockaddr_in *sain = (struct sockaddr_in *) sa;
		if (sain->sin_addr.s_addr == INADDR_BROADCAST) {
			int opt = 1;
			if (setsockopt(sockfd, IPPROTO_IP, IP_BINDANY, &opt, sizeof(opt))) {
				cw_log(LOG_ERR, "Can't set sockopt IP_BIND_ANY: %s",
				       strerror(errno));
				continue;
			};
		}
#endif

		/* bind address */
		if (bind(sockfd, sa, sock_addrlen(sa)) < 0) {
			close(sockfd);
			sockfd = -1;
			cw_log(LOG_ERR, "Can't bind  broadcast %s: %s", addr,
			       strerror(errno));
			continue;
		}


		int rfd = find_reply_socket(sa, 1);

		socklist[socklist_len].sockfd = sockfd;
//		socklist[socklist_len].reply_sockfd = rfd;
		socklist[socklist_len].type = SOCKLIST_BCASTMCAST_SOCKET;
		socklist[socklist_len].family = sa->sa_family;
		socklist[socklist_len].ac_proto = ac_proto;

		memcpy(&socklist[socklist_len].addr, res->ai_addr,
		       sock_addrlen(res->ai_addr));

//              printf ("AC INIT PROTO : %d, i %i\n",ac_proto,socklist_len);
//              printf ("sock proto %d\n",socklist[socklist_len].ac_proto);
		socklist_len++;

		cw_log(LOG_INFO, "Bound to broadcast: %s:%s (%i,R:%i,I:%d)", addr, port,
		       sockfd, rfd, socklist_len - 1);
	}

	freeaddrinfo(res0);
	return 1;
}
Exemplo n.º 6
0
int socklist_add_unicast(const char *addr, const char *port, int ac_proto)
{


	if (!socklist_check_size())
		return 0;
	

	struct addrinfo hints;
	struct addrinfo *res, *res0;
	memset(&hints, 0, sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;
	hints.ai_flags = AI_PASSIVE;

	int rc = getaddrinfo(addr, port, &hints, &res0);
	if (rc != 0) {
		cw_log(LOG_ERR, "Can't bind unicast address '%s': %s", addr,
		       gai_strerror(rc));
		return 0;
	}

	for (res = res0; res; res = res->ai_next) {
		char ifname[64];
		struct sockaddr netmask;
		struct sockaddr broadcast;

		ifname[0] = 0;
		rc = sock_getifinfo(res->ai_addr, ifname, &broadcast, &netmask);
		if (!rc) {
			cw_log(LOG_ERR, "No interface found for %s, can't bind.", addr);
			continue;
		}

		/* Bind the control port */
		struct sockaddr *sa = res->ai_addr;
		int sockfd = socket(res->ai_addr->sa_family, SOCK_DGRAM, 0);
		/* create socket */
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create unicast socket: %s",
			       strerror(errno));
			continue;
		}

		/* bind address */
		if (bind(sockfd, sa, sock_addrlen(sa)) < 0) {
			close(sockfd);
			cw_log(LOG_ERR, "Can't bind unicast socket %s: %s", addr,
			       strerror(errno));
			continue;
		}


		socklist[socklist_len].sockfd = sockfd;
//		socklist[socklist_len].reply_sockfd = sockfd;
		socklist[socklist_len].family = sa->sa_family;
		socklist[socklist_len].type = SOCKLIST_UNICAST_SOCKET;
		socklist[socklist_len].ac_proto = ac_proto;


		



		if (res->ai_addr->sa_family == AF_INET) {
			memcpy(&socklist[socklist_len].netmask, &netmask,
			       sock_addrlen(&netmask));
			memcpy(&socklist[socklist_len].addr, res->ai_addr,
			       sock_addrlen(res->ai_addr));
			cw_log(LOG_INFO,
			       "Bound to: %s:%s (%i) on interface %s, netmask %s", addr,
			       port, sockfd, ifname, sock_addr2str(&netmask));
		} else {
			cw_log(LOG_INFO, "Bound to: [%s]:%s (%i) on interface %s", addr,
			       port, sockfd, ifname);
		}

		
		/* Bind the data port */
		sa = res->ai_addr;

		/* XXX data port is currently hard coded */
		sock_setport(sa,5247);

		sockfd = socket(res->ai_addr->sa_family, SOCK_DGRAM, 0);
		/* create socket */
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create unicast data socket: %s",
			       strerror(errno));
			continue;
		}

		/* bind address */
		if (bind(sockfd, sa, sock_addrlen(sa)) < 0) {
			close(sockfd);
			cw_log(LOG_ERR, "Can't bind unicast data socket %s: %s", addr,
			       strerror(errno));
			continue;
		}

		cw_log(LOG_INFO, "Bound to data port: [%s]:%s (%i) on interface %s", addr,
			       "5247", sockfd, ifname);

		socklist[socklist_len].data_sockfd = sockfd;

		socklist_len++;

	}

	freeaddrinfo(res0);
	return 1;
}
Exemplo n.º 7
0
int socklist_add_multicast(const char *addr, const char *port, int ac_proto)
{

	struct addrinfo hints;
	struct addrinfo *res, *res0;
	memset(&hints, 0, sizeof(hints));

	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_family = PF_UNSPEC;
	hints.ai_flags = AI_PASSIVE;

	int rc = getaddrinfo(addr, port, &hints, &res0);
	if (rc != 0) {
		cw_log(LOG_ERR, "Can't bind multicast address '%s': %s", addr,
		       gai_strerror(rc));
		return 0;
	}

	for (res = res0; res; res = res->ai_next) {
		struct sockaddr *sa = res->ai_addr;
		int sockfd = socket(res->ai_addr->sa_family, SOCK_DGRAM, 0);
		/* create socket */
		if (sockfd == -1) {
			cw_log(LOG_ERR, "Can't create multicast socket: %",
			       strerror(errno));
			continue;
		}


		/* bind address */
		if (bind(sockfd, sa, sock_addrlen(sa)) < 0) {
			close(sockfd);
			cw_log(LOG_ERR, "Can't bind multicast %s: %s", addr,
			       strerror(errno));
			continue;
		}

		/* use setsockopt() to request that the kernel joins a multicast group */
		void *opt;
		int optlen;
		if (res->ai_addr->sa_family == AF_INET) {

			struct ip_mreq mreq;
			memset(&mreq, 0, sizeof(mreq));
			struct sockaddr_in *sain = (struct sockaddr_in *) res->ai_addr;
			mreq.imr_multiaddr.s_addr = sain->sin_addr.s_addr;
			mreq.imr_interface.s_addr = htonl(INADDR_ANY);
			opt = &mreq;
			optlen = sizeof(mreq);

			char sinin[100];
			sock_addrtostr((struct sockaddr *) sain, sinin, 100,1);

			if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, opt, optlen)
			    < 0) {
				close(sockfd);
				cw_log(LOG_ERR, "Can't add multicast membership %s: %s",
				       addr, strerror(errno));
				continue;
			}

		}
		if (res->ai_addr->sa_family == AF_INET6) {
			struct ipv6_mreq mreq;
			memset(&mreq, 0, sizeof(mreq));
			struct sockaddr_in6 *sain6 = (struct sockaddr_in6 *) res->ai_addr;
//                      mreq.ipv6mr_multiaddr.s_addr=sain->sin_addr.s_addr;
			memcpy(&mreq.ipv6mr_multiaddr.s6_addr, &sain6->sin6_addr.s6_addr,
			       sizeof(sain6->sin6_addr.s6_addr));
//                      int si  = sizeof(sain6->sin6_addr.s6_addr);

//                      int i = sain6->sin6_addr.s6_addr;                       
			mreq.ipv6mr_interface = 0;	//htonl(INADDR_ANY);
			opt = &mreq;
			optlen = sizeof(mreq);
			if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, opt, optlen)
			    < 0) {
				close(sockfd);
				cw_log(LOG_ERR, "Can't join multicast group %s: %s", addr,
				       strerror(errno));
				continue;
			}
		}

		int rfd = find_reply_socket(sa, 0);

		socklist[socklist_len].sockfd = sockfd;
//		socklist[socklist_len].reply_sockfd = rfd;
		socklist[socklist_len].type = SOCKLIST_BCASTMCAST_SOCKET;
		socklist[socklist_len].family = sa->sa_family;
		socklist[socklist_len].ac_proto = ac_proto;

		socklist_len++;

		cw_log(LOG_INFO, "Bound to multicast group: %s (fd=%i,r:%i)", addr,
		       sockfd, rfd);
	}

	freeaddrinfo(res0);
	return 1;
}