Example #1
0
static void tcp_receive_message (IP_CX *cxp)
{
	TCP_MSG		*recv_msg;
	TCP_DATA	*dp;

	if ((dp = cxp->sproto) == NULL || !cxp->fd) {
		warn_printf ("tcp_receive_message: no TCP context for fd:%u!", cxp->fd);
		return;
	}
	ctrc_printd (TCPS_ID, TCPS_RX_MSG, &cxp->fd, sizeof (cxp->fd));
	if (!dp->recv_msg) {

		/* Prepare for receiving messages */
		dp->recv_msg = xmalloc (sizeof (TCP_MSG));
		if (!dp->recv_msg) {
			tcp_cleanup_ctx (cxp);
			return;
		}
		dp->recv_msg->size = dp->recv_msg->used = 0;
		dp->recv_msg->buffer = NULL;
	}

	if (tcp_receive_message_fragment (cxp->fd, dp->recv_msg) == -1) {
		tcp_cleanup_ctx (cxp);
		return;
	}
	if (dp->recv_msg->used == dp->recv_msg->size) {
		recv_msg = dp->recv_msg;
		dp->recv_msg = NULL;
		ctrc_printd (TCPS_ID, TCPS_NEW_MSG, &cxp->fd, sizeof (cxp->fd));
		cxp->stream_cb->on_new_message (cxp, recv_msg->buffer, recv_msg->size);
		xfree (recv_msg->buffer);
		xfree (recv_msg);
	}
}
Example #2
0
static int sfw_be_new_change (RemReader_t      *rrp,
			      Change_t         *cp,
			      HCI              hci,
			      SequenceNumber_t *snr)
{
	CCREF	*rp;

	ARG_NOT_USED (snr)

	ctrc_printd (RTPS_ID, RTPS_SFW_BE_NEW, &rrp, sizeof (rrp));
	prof_start (rtps_bw_new);

	RR_SIGNAL (rrp, "BE-NewChange");

#ifdef RTPS_MARKERS
	if (rrp->rr_writer->endpoint.mark_newch)
		rtps_marker_notify (rrp->rr_writer->endpoint.endpoint, EM_NEW_CHANGE, "sfw_be_new_change");
#endif
	rp = change_enqueue (rrp, cp, hci, CS_UNSENT);
	if (!rp)
		return (0);

	rp->ack_req = 1;
	rrp->rr_unacked++;
	if (!rrp->rr_unsent_changes) {
		rrp->rr_unsent_changes = rp;
		proxy_activate (&rrp->proxy);
	}
	NEW_RR_TSTATE (rrp, RRTS_PUSHING, 0);
	CACHE_CHECK (&rrp->rr_writer->endpoint, "sfw_be_new_change");
	prof_stop (rtps_bw_new, 1);
	return (1);
}
Example #3
0
static void sfw_be_start (RemReader_t *rrp)
{
	ctrc_printd (RTPS_ID, RTPS_SFW_BE_START, &rrp, sizeof (rrp));
	prof_start (rtps_bw_start);

	RR_SIGNAL (rrp, "BE-Start");
	NEW_RR_CSTATE (rrp, RRCS_INITIAL, 1);
	NEW_RR_CSTATE (rrp, RRCS_READY, 0);
	NEW_RR_TSTATE (rrp, RRTS_IDLE, 1);
	rrp->rr_nack_timer = NULL;

#ifdef RTPS_MARKERS
	if (rrp->rr_writer->endpoint.mark_start)
		rtps_marker_notify (rrp->rr_writer->endpoint.endpoint, EM_START, "sfw_be_start");
#endif

	/* Add existing cache entries to reader locator/proxy queue. */
	
	hc_replay (rrp->rr_writer->endpoint.endpoint->cache,
					proxy_add_change, (uintptr_t) rrp);

	if ((rrp->rr_unsent_changes = LIST_HEAD (rrp->rr_changes)) != NULL &&
	    rrp->rr_writer->endpoint.push_mode) {
		NEW_RR_TSTATE (rrp, RRTS_PUSHING, 0);
		proxy_activate (&rrp->proxy);
	}
	prof_stop (rtps_bw_start, 1);
	CACHE_CHECK (&rrp->rr_writer->endpoint, "sfw_be_start");
}
Example #4
0
DDS_ReturnCode_t DDS_Subscriber_set_qos (DDS_Subscriber sp,
					 DDS_SubscriberQos *qos)
{
	Domain_t		*dp;
	DDS_ReturnCode_t	ret;

	ctrc_printd (DCPS_ID, DCPS_S_S_QOS, &sp, sizeof (sp));
	ctrc_contd (&qos, sizeof (qos));
	ctrc_endd ();

	if (!subscriber_ptr (sp, &ret))
		return (ret);

	dp = domain_ptr (sp->domain, 1, &ret);
	if (!dp)
		return (ret);

	if (qos == DDS_PUBLISHER_QOS_DEFAULT)
		qos = &sp->domain->def_subscriber_qos;
	else if (!qos_valid_subscriber_qos (qos)) {
		ret = DDS_RETCODE_BAD_PARAMETER;
		goto done;
	}
	ret = qos_subscriber_update (&sp->qos, qos);
	if (ret == DDS_RETCODE_OK)
		sl_walk (&sp->domain->participant.p_endpoints, update_reader_qos, sp);

    done:
	lock_release (dp->lock);
	return (ret);
}
Example #5
0
DDS_ReturnCode_t DDS_Subscriber_set_listener (DDS_Subscriber sp,
					      DDS_SubscriberListener *listener,
					      DDS_StatusMask mask)
{
	Domain_t		*dp;
	DDS_ReturnCode_t	ret;

	ctrc_printd (DCPS_ID, DCPS_S_S_LIS, &sp, sizeof (sp));
	ctrc_contd (&listener, sizeof (listener));
	ctrc_contd (&mask, sizeof (mask));
	ctrc_endd ();

	if (!subscriber_ptr (sp, &ret))
		return (ret);

	dp = domain_ptr (sp->domain, 1, &ret);
	if (!dp)
		return (ret);

	dcps_update_listener ((Entity_t *) sp, &dp->lock,
			      &sp->mask, &sp->listener,
			      mask, listener);
	lock_release (dp->lock);
	return (DDS_RETCODE_OK);
}
Example #6
0
DDS_ReturnCode_t DDS_Subscriber_enable (DDS_Subscriber sp)
{
	Domain_t		*dp;
	DDS_ReturnCode_t	ret;

	ctrc_printd (DCPS_ID, DCPS_S_ENABLE, &sp, sizeof (sp));

	if (!subscriber_ptr (sp, &ret))
		return (ret);

	dp = domain_ptr (sp->domain, 1, &ret);
	if (!dp)
		return (ret);

	if ((dp->participant.p_flags & EF_ENABLED) == 0) {
		lock_release (dp->lock);
		return (DDS_RETCODE_NOT_ENABLED);
	}
	if ((sp->entity.flags & EF_ENABLED) == 0) {

		/* ... todo ... */

		sp->entity.flags |= EF_ENABLED | EF_NOT_IGNORED;
	}
	lock_release (dp->lock);
	return (DDS_RETCODE_OK);
}
Example #7
0
DDS_StatusCondition DDS_Subscriber_get_statuscondition (DDS_Subscriber sp)
{
	Domain_t		*dp;
	StatusCondition_t	*scp;

	ctrc_printd (DCPS_ID, DCPS_S_G_SCOND, &sp, sizeof (sp));

	if (!subscriber_ptr (sp, NULL))
		return (NULL);

	dp = domain_ptr (sp->domain, 1, NULL);
	if (!dp)
		return (NULL);

	scp = sp->condition;
	if (!scp) {
		scp = dcps_new_status_condition ();
		if (!scp)
			return (NULL);

		scp->entity = (Entity_t *) sp;
		sp->condition = scp;
	}
	lock_release (dp->lock);
	return ((DDS_StatusCondition) scp);
}
Example #8
0
DDS_DataWriterListener *DDS_DataWriter_get_listener (DDS_DataWriter wp)
{
	ctrc_printd (DCPS_ID, DCPS_DW_G_LIS, &wp, sizeof (wp));

	if (!writer_ptr (wp, 0, NULL))
		return (NULL);

	return (&wp->w_listener);
}
Example #9
0
DDS_TopicListener *DDS_Topic_get_listener (DDS_Topic tp)
{
	ctrc_printd (DCPS_ID, DCPS_T_G_LIS, &tp, sizeof (tp));

	if (!topic_ptr (tp, 0, NULL))
		return (NULL);

	return (&tp->listener);
}
Example #10
0
DDS_InstanceHandle_t DDS_Subscriber_get_instance_handle (DDS_Subscriber sp)
{
	ctrc_printd (DCPS_ID, DCPS_S_G_HANDLE, &sp, sizeof (sp));

	if (!subscriber_ptr (sp, NULL))
		return (0);

	return (sp->entity.handle);
}
Example #11
0
static void tcp_wait_connect_complete (SOCKET fd, short revents, void *arg)
{
	TCP_CON_REQ_ST	*p = (TCP_CON_REQ_ST *) arg;
	IP_CX		*cxp = p->cxp;
	socklen_t	s;
	int		err, r;
	socklen_t	sz;

	ctrc_begind (TCPS_ID, TCPS_WCON_EV, &fd, sizeof (fd));
	ctrc_contd (&revents, sizeof (revents));
	ctrc_endd ();

	trace_poll_events (fd, revents, arg);

	trc_con2 ("tcp_wait_connect_complete(cp=%p, cxp=%p);\r\n", (void *) p, (void *) cxp);
	p = tcp_clear_pending_connect (p);
	do {
		if ((revents & (POLLERR | POLLNVAL)) != 0) {
			sz = sizeof (err);
			r = getsockopt (cxp->fd, SOL_SOCKET, SO_ERROR, &err, &sz);
			if (r == -1 || err)  {
				log_printf (RTPS_ID, 0, "POLLERR | POLLNVAL [%d]: %d %s\r\n", cxp->fd, err, strerror (err));
				tcp_cleanup_ctx (cxp);
				break;
			}
		}
		if ((revents & POLLHUP) != 0) {
			tcp_cleanup_ctx (cxp);
			break;
		}
		if ((revents & POLLOUT) != 0) {
			s = sizeof (err);
			r = getsockopt (cxp->fd, SOL_SOCKET, SO_ERROR, &err, &s);
			if (r || err) {
				if (r)
					perror ("cc_control: getsockopt(SOL_SOCKET/SO_ERROR)");
				tcp_cleanup_ctx (cxp);
				break;
			}
		}
		log_printf (RTPS_ID, 0, "TCP: server connection established [%d]\r\n", cxp->fd);
		cxp->cx_state = CXS_OPEN;
		sock_fd_remove_socket (cxp->fd);
		sock_fd_add_socket (cxp->fd,
				    POLLIN | POLLPRI | POLLHUP | POLLNVAL,
				    tcp_socket_activity,
				    cxp, "DDS.TCP-H");
		ctrc_printd (TCPS_ID, TCPS_CON_COMPL, &fd, sizeof (fd));
		cxp->stream_cb->on_connected (cxp);
	}
	while (0);
	if (p)
		tcp_do_connect (p);
}
Example #12
0
DDS_Publisher DDS_DataWriter_get_publisher (DDS_DataWriter wp)
{
	Publisher_t	*up;

	ctrc_printd (DCPS_ID, DCPS_DW_G_PUB, &wp, sizeof (wp));

	if (!writer_ptr (wp, 0, NULL))
		return (NULL);

	up = wp->w_publisher;
	return (up);
}
Example #13
0
DDS_InstanceHandle_t DDS_Topic_get_instance_handle (DDS_Topic tp)
{
	DDS_InstanceHandle_t	h;

	ctrc_printd (DCPS_ID, DCPS_T_G_HANDLE, &tp, sizeof (tp));

	if (!topic_ptr (tp, 1, NULL))
		return (0);

	h = tp->entity.handle;
	lock_release (tp->lock);
	return (h);
}
Example #14
0
DDS_StatusMask DDS_Topic_get_status_changes (DDS_Topic tp)
{
	DDS_StatusMask	m;

	ctrc_printd (DCPS_ID, DCPS_T_G_STAT, &tp, sizeof (tp));

	if (!topic_ptr (tp, 1, NULL))
		return (0);

	m = tp->status;
	lock_release (tp->lock);
	return (m);
}
Example #15
0
static void tcp_cleanup_ctx (IP_CX *cxp)
{
	ctrc_printd (TCPS_ID, TCPS_CLEAN, &cxp->fd, sizeof (cxp->fd));
	if (cxp->stream_cb && cxp->stream_cb->on_close)
		cxp->stream_cb->on_close (cxp); /* This fd most probably became unusable. */
	else if (cxp->fd_owner) {
		close (cxp->fd);
		sock_fd_remove_socket (cxp->fd);
		cxp->cx_state = CXS_CLOSED;
		cxp->fd_owner = 0;
		cxp->fd = 0;
	}
}
Example #16
0
DDS_InstanceHandle_t DDS_DataWriter_get_instance_handle (DDS_DataWriter wp)
{
	DDS_InstanceHandle_t	h;

	ctrc_printd (DCPS_ID, DCPS_DW_G_HANDLE, &wp, sizeof (wp));

	if (!writer_ptr (wp, 1, NULL))
		return (0);

	h = wp->w_handle;
	lock_release (wp->w_lock);
	return (h);
}
Example #17
0
DDS_DomainId_t DDS_DomainParticipant_get_domain_id (DDS_DomainParticipant dp)
{
	DDS_DomainId_t		id;
	DDS_ReturnCode_t	ret;

	ctrc_printd (DCPS_ID, DCPS_DP_G_ID, &p, sizeof (p));
	if (!domain_ptr (dp, 1, &ret))
		return (0);

	id = dp->domain_id;
	lock_release (dp->lock);
	return (id);
}
Example #18
0
DDS_StatusMask DDS_DataWriter_get_status_changes (DDS_DataWriter wp)
{
	DDS_StatusMask	m;
	
	ctrc_printd (DCPS_ID, DCPS_DW_G_STAT, &wp, sizeof (wp));

	if (!writer_ptr (wp, 1, NULL))
		return (0);

	m = wp->w_status;
	lock_release (wp->w_lock);
	return (m);
}
Example #19
0
DDS_InstanceHandle_t DDS_DomainParticipant_get_instance_handle (DDS_DomainParticipant dp)
{
	DDS_InstanceHandle_t	handle;

	ctrc_printd (DCPS_ID, DCPS_DP_G_HANDLE, &dp, sizeof (dp));

	if (!domain_ptr (dp, 1, NULL))
		return (DDS_HANDLE_NIL);

	handle = dp->participant.p_handle;
	lock_release (dp->lock);
	return (handle);
}
Example #20
0
DDS_StatusMask DDS_DomainParticipant_get_status_changes (DDS_DomainParticipant dp)
{
	DDS_StatusMask	m;
	
	ctrc_printd (DCPS_ID, DCPS_DP_G_STAT, &dp, sizeof (dp));
	if (!domain_ptr (dp, 1, NULL))
		return (0);

	/* No status mask on participant for now! */
	m = 0U;

	lock_release (dp->lock);
	return (m);
}
Example #21
0
DDS_DomainParticipant DDS_TopicDescription_get_participant (DDS_TopicDescription dp)
{
	Topic_t			*tp;
	DDS_DomainParticipant	part;
	
	ctrc_printd (DCPS_ID, DCPS_TD_G_PART, &dp, sizeof (dp));
	tp = topic_ptr (dp, 1, NULL);
	if (tp) {
		part = tp->domain;
		lock_release (tp->lock);
		return (part);
	}
	else
		return (NULL);
}
Example #22
0
const char *DDS_TopicDescription_get_type_name (DDS_TopicDescription dp)
{
	Topic_t		*tp;
	const char	*name;

	ctrc_printd (DCPS_ID, DCPS_TD_G_TNAME, &dp, sizeof (dp));
	tp = topic_ptr (dp, 1, NULL);
	if (tp) {
		name = str_ptr (tp->type->type_name);
		lock_release (tp->lock);
		return (name);
	}
	else
		return (NULL);
}
Example #23
0
DDS_DomainParticipant DDS_Topic_get_participant (DDS_Topic topic)
{
	Topic_t			*tp;
	DDS_DomainParticipant	part;

	ctrc_printd (DCPS_ID, DCPS_T_G_PART, &topic, sizeof (topic));

	tp = topic_ptr (topic, 1, NULL);
	if (!tp)
		return (NULL);

	part = tp->domain;
	lock_release (tp->lock);
	return (part);
}
Example #24
0
const char *DDS_Topic_get_type_name (DDS_Topic topic)
{
	Topic_t			*tp;
	const char		*name;

	ctrc_printd (DCPS_ID, DCPS_T_G_TNAME, &topic, sizeof (topic));

	tp = topic_ptr (topic, 1, NULL);
	if (!tp)
		return (NULL);

	name = str_ptr (tp->type->type_name);
	lock_release (tp->lock);
	return (name);
}
Example #25
0
static void sfw_be_rem_change (RemReader_t *rrp, Change_t *cp)
{
	ctrc_printd (RTPS_ID, RTPS_SFW_BE_REM, &rrp, sizeof (rrp));
	prof_start (rtps_bw_rem);

	RR_SIGNAL (rrp, "BE-RemChange");

#ifdef RTPS_MARKERS
	if (rrp->rr_writer->endpoint.mark_rmch)
		rtps_marker_notify (rrp->rr_writer->endpoint.endpoint, EM_REM_CHANGE, "sfw_be_rem_change");
#endif
	change_remove (rrp, cp);
	prof_stop (rtps_bw_rem, 1);
	CACHE_CHECK (&rrp->rr_writer->endpoint, "sfw_be_rem_change");
}
Example #26
0
DDS_DomainParticipantListener *DDS_DomainParticipant_get_listener (DDS_DomainParticipant dp)
{
	DDS_DomainParticipantListener	*listener;

	ctrc_printd (DCPS_ID, DCPS_DP_G_LIS, &dp, sizeof (dp));

	/* Get Domain Participant. */
	if (!domain_ptr (dp, 1, NULL)) {
		log_printf (DCPS_ID, 0, "get_listener: domain doesn't exist!\r\n");
		return (NULL);
	}
	listener = &dp->listener;
	lock_release (dp->lock);
	return (listener);
}
Example #27
0
DDS_ReturnCode_t DDS_DomainParticipant_delete_contained_entities (DDS_DomainParticipant dp)
{
	Publisher_t		*up;
	Subscriber_t		*sp;
	Condition_t		*cp;
	DDS_ReturnCode_t	ret;

	ctrc_printd (DCPS_ID, DCPS_DP_D_CONT, &dp, sizeof (dp));
	if (!domain_ptr (dp, 1, &ret))
		return (ret);

	while ((up = dp->publishers.head) != NULL) {
		delete_publisher_entities (dp, up);
                if (up->nwriters != 0) {
			lock_release (dp->lock);
                        return (DDS_RETCODE_PRECONDITION_NOT_MET);
		}
		dtrc_printf ("participant_delete_contained_entitities: delete Publisher (%p)\r\n", (void *) up);
		qos_publisher_free (&up->qos);
		if (up->condition) {
			cp = (Condition_t *) up->condition;
			if (cp->deferred)
				dds_defer_waitset_undo (up, up->condition);
			dcps_delete_status_condition (up->condition);
		}
		publisher_delete (up);
	}
	while ((sp = dp->subscribers.head) != NULL) {
		delete_subscriber_entities (dp, sp);
                if (sp->nreaders != 0) {
			lock_release (dp->lock);
                        return (DDS_RETCODE_PRECONDITION_NOT_MET);
		}
		dtrc_printf ("participant_delete_contained_entitities: delete Subscriber (%p)\r\n", (void *) sp);
		qos_subscriber_free (&sp->qos);
		if (sp->condition) {
			cp = (Condition_t *) sp->condition;
			if (cp->deferred)
				dds_defer_waitset_undo (sp, sp->condition);
			dcps_delete_status_condition (sp->condition);
		}
		subscriber_delete (sp);
	}
	sl_walk (&dp->participant.p_topics, dcps_delete_topic, dp);
	sl_walk (&dp->types, delete_type, dp);
	lock_release (dp->lock);
	return (DDS_RETCODE_OK);
}
Example #28
0
DDS_ReturnCode_t DDS_DomainParticipant_enable (DDS_DomainParticipant dp)
{
#ifdef RTPS_USED
	int			i;
#endif
#if defined (DDS_DEBUG) && defined (DDS_SERVER)
	static int		server_running = 0;
#endif
	DDS_ReturnCode_t	error;

	ctrc_printd (DCPS_ID, DCPS_DP_ENABLE, &dp, sizeof (dp));
	if (!domain_ptr (dp, 1, &error))
		return (error);

	if ((dp->participant.p_flags & EF_ENABLED) == 0) {
		dp->participant.p_flags |= EF_ENABLED | EF_NOT_IGNORED;

#ifdef RTPS_USED

		if (rtps_used)

			/* Create RTPS and Discovery participants. */
			for (i = 0; i < 64; i++) {
				error = rtps_participant_create (dp);
				if (error &&
				    error != DDS_RETCODE_PRECONDITION_NOT_MET) {
					lock_release (dp->lock);
					return (error);
				}
				if (!error)
					break;

				domain_used (dp);
				
				if (dp->participant_id == ILLEGAL_PID) 
					return (DDS_RETCODE_OUT_OF_RESOURCES);
			}
#endif
#if defined (DDS_DEBUG) && defined (DDS_SERVER)
		if (!server_running) {
			server_running = 1;
			DDS_Debug_server_start (2, DDS_DEBUG_PORT_DEFAULT);
		}
#endif
	}
	lock_release (dp->lock);
	return (DDS_RETCODE_OK);
}
Example #29
0
DDS_Topic DDS_ContentFilteredTopic_get_related_topic (DDS_ContentFilteredTopic ftp)
{
	Topic_t		*tp;

	ctrc_printd (DCPS_ID, DCPS_FT_REL, &ftp, sizeof (ftp));
	if (!topic_ptr (ftp, 1, NULL))
		return (NULL);

	if ((ftp->topic.entity.flags & EF_FILTERED) != 0)
		tp = ftp->related;
	else
		tp = NULL;

	lock_release (ftp->topic.lock);
	return (tp);
}
Example #30
0
static void sfr_be_finish (RemWriter_t *rwp)
{
	ctrc_printd (RTPS_ID, RTPS_SFR_BE_FINISH, &rwp, sizeof (rwp));
	prof_start (rtps_br_finish);

	RW_SIGNAL (rwp, "BE-Finish");

#ifdef RTPS_MARKERS
	if (rwp->rw_reader->endpoint.mark_finish)
		rtps_marker_notify (rwp->rw_reader->endpoint.endpoint, EM_FINISH, "sfr_be_finish");
#endif

	/* We're done. */
	NEW_RW_CSTATE (rwp, RWCS_FINAL, 0);
	prof_stop (rtps_br_finish, 1);
}