Example #1
0
static void *sigh(void *arg)
{
	int signum;
	sigset_t sigcatch;

	pthread_dbg("thread started");

	sigemptyset(&sigcatch);
	sigaddset(&sigcatch, SIGHUP);
	sigaddset(&sigcatch, SIGINT);
	sigaddset(&sigcatch, SIGTERM);
#ifdef ENABLE_VT
	sigaddset(&sigcatch, SIGPIPE);
#endif

	for ( ;; ) {
		sigwait(&sigcatch, &signum);
		switch (signum) {
		case SIGHUP:
			reinit();
			break;
		case SIGINT:
		case SIGTERM:
#ifdef ENABLE_VT
		case SIGPIPE:
#endif
			terminate();
		default:
			break;
		}
	}
	pthread_exit(NULL);
}
static void *mh_listen(void *arg)
{
	uint8_t msg[MAX_PKT_LEN];
	struct in6_pktinfo pktinfo;
	struct in6_addr haoa, rta;
	struct sockaddr_in6 addr;
	struct ip6_mh *mh;
	struct in6_addr_bundle addrs;
	ssize_t len;
	struct mh_handler *h;

	pthread_dbg("thread started");

	while (1) {
		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
		len = mh_recv(msg, sizeof(msg), &addr, &pktinfo, &haoa, &rta);
		/* check if socket has closed */
		if (len == -EBADF)
			break;
		/* common validity check */
		if (len < sizeof(struct ip6_mh))
			continue;
		addrs.src = &addr.sin6_addr;
		addrs.dst = &pktinfo.ipi6_addr;
		if (!IN6_IS_ADDR_UNSPECIFIED(&haoa)) {
			addrs.remote_coa = &haoa;
		} else {
			addrs.remote_coa = NULL;
		}
		if (!IN6_IS_ADDR_UNSPECIFIED(&rta)) {
			addrs.local_coa = &rta;
		} else {
			addrs.local_coa = NULL;
		}
		addrs.bind_coa = NULL;
		mh = (struct ip6_mh *) msg;
		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
		pthread_rwlock_rdlock(&handler_lock);
		h = mh_handler_get(mh->ip6mh_type);
		if (h)
			h->recv(mh, len, &addrs, pktinfo.ipi6_ifindex);

		pthread_rwlock_unlock(&handler_lock);
	}
	pthread_exit(NULL);
}
Example #3
0
static void *icmp6_listen(void *arg)
{
	uint8_t msg[MAX_PKT_LEN];
	struct sockaddr_in6 addr;
	struct in6_addr *saddr, *daddr;
	struct in6_pktinfo pkt_info;
	struct icmp6_hdr *ih;
	int iif, hoplimit;
	ssize_t len;
	struct icmp6_handler *h;

	pthread_dbg("thread started");

	while (1) {
		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
		len = icmp6_recv(icmp6_sock.fd, msg, sizeof(msg),
				 &addr, &pkt_info, &hoplimit);
		/* check if socket has closed */
		if (len == -EBADF)
			break;
		/* common validity check */
		if (len < sizeof(struct icmp6_hdr))
			continue;
		saddr = &addr.sin6_addr;
		daddr = &pkt_info.ipi6_addr;
		iif = pkt_info.ipi6_ifindex;

		ih = (struct icmp6_hdr *)msg;
		/* multiplex to right handler */
		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
		pthread_rwlock_rdlock(&handler_lock);
		if ((h = icmp6_handler_get(ih->icmp6_type)) != NULL)
			h->recv(ih, len, saddr, daddr, iif, hoplimit);
		pthread_rwlock_unlock(&handler_lock);
	}
	pthread_exit(NULL);
}