diff --git a/docs/manual/options.md b/docs/manual/options.md index fbdd2aa..a5534b2 100644 --- a/docs/manual/options.md +++ b/docs/manual/options.md @@ -554,7 +554,7 @@ The default value is: "default". ### //CycloneDDS/Domain/Internal -Children: [AccelerateRexmitBlockSize](#cycloneddsdomaininternalacceleraterexmitblocksize), [AssumeMulticastCapable](#cycloneddsdomaininternalassumemulticastcapable), [AutoReschedNackDelay](#cycloneddsdomaininternalautoreschednackdelay), [BindUnicastToInterfaceAddr](#cycloneddsdomaininternalbindunicasttointerfaceaddr), [BuiltinEndpointSet](#cycloneddsdomaininternalbuiltinendpointset), [ControlTopic](#cycloneddsdomaininternalcontroltopic), [DDSI2DirectMaxThreads](#cycloneddsdomaininternalddsi2directmaxthreads), [DefragReliableMaxSamples](#cycloneddsdomaininternaldefragreliablemaxsamples), [DefragUnreliableMaxSamples](#cycloneddsdomaininternaldefragunreliablemaxsamples), [DeliveryQueueMaxSamples](#cycloneddsdomaininternaldeliveryqueuemaxsamples), [EnableExpensiveChecks](#cycloneddsdomaininternalenableexpensivechecks), [GenerateKeyhash](#cycloneddsdomaininternalgeneratekeyhash), [HeartbeatInterval](#cycloneddsdomaininternalheartbeatinterval), [LateAckMode](#cycloneddsdomaininternallateackmode), [LeaseDuration](#cycloneddsdomaininternalleaseduration), [LivelinessMonitoring](#cycloneddsdomaininternallivelinessmonitoring), [MaxParticipants](#cycloneddsdomaininternalmaxparticipants), [MaxQueuedRexmitBytes](#cycloneddsdomaininternalmaxqueuedrexmitbytes), [MaxQueuedRexmitMessages](#cycloneddsdomaininternalmaxqueuedrexmitmessages), [MaxSampleSize](#cycloneddsdomaininternalmaxsamplesize), [MeasureHbToAckLatency](#cycloneddsdomaininternalmeasurehbtoacklatency), [MinimumSocketReceiveBufferSize](#cycloneddsdomaininternalminimumsocketreceivebuffersize), [MinimumSocketSendBufferSize](#cycloneddsdomaininternalminimumsocketsendbuffersize), [MonitorPort](#cycloneddsdomaininternalmonitorport), [MultipleReceiveThreads](#cycloneddsdomaininternalmultiplereceivethreads), [NackDelay](#cycloneddsdomaininternalnackdelay), [PreEmptiveAckDelay](#cycloneddsdomaininternalpreemptiveackdelay), [PrimaryReorderMaxSamples](#cycloneddsdomaininternalprimaryreordermaxsamples), [PrioritizeRetransmit](#cycloneddsdomaininternalprioritizeretransmit), [RediscoveryBlacklistDuration](#cycloneddsdomaininternalrediscoveryblacklistduration), [RetransmitMerging](#cycloneddsdomaininternalretransmitmerging), [RetransmitMergingPeriod](#cycloneddsdomaininternalretransmitmergingperiod), [RetryOnRejectBestEffort](#cycloneddsdomaininternalretryonrejectbesteffort), [SPDPResponseMaxDelay](#cycloneddsdomaininternalspdpresponsemaxdelay), [ScheduleTimeRounding](#cycloneddsdomaininternalscheduletimerounding), [SecondaryReorderMaxSamples](#cycloneddsdomaininternalsecondaryreordermaxsamples), [SendAsync](#cycloneddsdomaininternalsendasync), [SquashParticipants](#cycloneddsdomaininternalsquashparticipants), [SynchronousDeliveryLatencyBound](#cycloneddsdomaininternalsynchronousdeliverylatencybound), [SynchronousDeliveryPriorityThreshold](#cycloneddsdomaininternalsynchronousdeliveryprioritythreshold), [Test](#cycloneddsdomaininternaltest), [UnicastResponseToSPDPMessages](#cycloneddsdomaininternalunicastresponsetospdpmessages), [UseMulticastIfMreqn](#cycloneddsdomaininternalusemulticastifmreqn), [Watermarks](#cycloneddsdomaininternalwatermarks), [WriteBatch](#cycloneddsdomaininternalwritebatch), [WriterLingerDuration](#cycloneddsdomaininternalwriterlingerduration) +Children: [AccelerateRexmitBlockSize](#cycloneddsdomaininternalacceleraterexmitblocksize), [AssumeMulticastCapable](#cycloneddsdomaininternalassumemulticastcapable), [AutoReschedNackDelay](#cycloneddsdomaininternalautoreschednackdelay), [BuiltinEndpointSet](#cycloneddsdomaininternalbuiltinendpointset), [ControlTopic](#cycloneddsdomaininternalcontroltopic), [DDSI2DirectMaxThreads](#cycloneddsdomaininternalddsi2directmaxthreads), [DefragReliableMaxSamples](#cycloneddsdomaininternaldefragreliablemaxsamples), [DefragUnreliableMaxSamples](#cycloneddsdomaininternaldefragunreliablemaxsamples), [DeliveryQueueMaxSamples](#cycloneddsdomaininternaldeliveryqueuemaxsamples), [EnableExpensiveChecks](#cycloneddsdomaininternalenableexpensivechecks), [GenerateKeyhash](#cycloneddsdomaininternalgeneratekeyhash), [HeartbeatInterval](#cycloneddsdomaininternalheartbeatinterval), [LateAckMode](#cycloneddsdomaininternallateackmode), [LeaseDuration](#cycloneddsdomaininternalleaseduration), [LivelinessMonitoring](#cycloneddsdomaininternallivelinessmonitoring), [MaxParticipants](#cycloneddsdomaininternalmaxparticipants), [MaxQueuedRexmitBytes](#cycloneddsdomaininternalmaxqueuedrexmitbytes), [MaxQueuedRexmitMessages](#cycloneddsdomaininternalmaxqueuedrexmitmessages), [MaxSampleSize](#cycloneddsdomaininternalmaxsamplesize), [MeasureHbToAckLatency](#cycloneddsdomaininternalmeasurehbtoacklatency), [MinimumSocketReceiveBufferSize](#cycloneddsdomaininternalminimumsocketreceivebuffersize), [MinimumSocketSendBufferSize](#cycloneddsdomaininternalminimumsocketsendbuffersize), [MonitorPort](#cycloneddsdomaininternalmonitorport), [MultipleReceiveThreads](#cycloneddsdomaininternalmultiplereceivethreads), [NackDelay](#cycloneddsdomaininternalnackdelay), [PreEmptiveAckDelay](#cycloneddsdomaininternalpreemptiveackdelay), [PrimaryReorderMaxSamples](#cycloneddsdomaininternalprimaryreordermaxsamples), [PrioritizeRetransmit](#cycloneddsdomaininternalprioritizeretransmit), [RediscoveryBlacklistDuration](#cycloneddsdomaininternalrediscoveryblacklistduration), [RetransmitMerging](#cycloneddsdomaininternalretransmitmerging), [RetransmitMergingPeriod](#cycloneddsdomaininternalretransmitmergingperiod), [RetryOnRejectBestEffort](#cycloneddsdomaininternalretryonrejectbesteffort), [SPDPResponseMaxDelay](#cycloneddsdomaininternalspdpresponsemaxdelay), [ScheduleTimeRounding](#cycloneddsdomaininternalscheduletimerounding), [SecondaryReorderMaxSamples](#cycloneddsdomaininternalsecondaryreordermaxsamples), [SendAsync](#cycloneddsdomaininternalsendasync), [SquashParticipants](#cycloneddsdomaininternalsquashparticipants), [SynchronousDeliveryLatencyBound](#cycloneddsdomaininternalsynchronousdeliverylatencybound), [SynchronousDeliveryPriorityThreshold](#cycloneddsdomaininternalsynchronousdeliveryprioritythreshold), [Test](#cycloneddsdomaininternaltest), [UnicastResponseToSPDPMessages](#cycloneddsdomaininternalunicastresponsetospdpmessages), [UseMulticastIfMreqn](#cycloneddsdomaininternalusemulticastifmreqn), [Watermarks](#cycloneddsdomaininternalwatermarks), [WriteBatch](#cycloneddsdomaininternalwritebatch), [WriterLingerDuration](#cycloneddsdomaininternalwriterlingerduration) The Internal elements deal with a variety of settings that evolving and @@ -600,15 +600,6 @@ Valid values are finite durations with an explicit unit or the keyword The default value is: "1 s". -#### //CycloneDDS/Domain/Internal/BindUnicastToInterfaceAddr -Boolean - -Bind unicast sockets to the address of the preferred interface; if false, -bind to 0.0.0.0 (IPv4) or its equivalent - -The default value is: "true". - - #### //CycloneDDS/Domain/Internal/BuiltinEndpointSet One of: full, writers, minimal diff --git a/etc/cyclonedds.rnc b/etc/cyclonedds.rnc index f3e4395..0edc899 100644 --- a/etc/cyclonedds.rnc +++ b/etc/cyclonedds.rnc @@ -491,13 +491,6 @@ day.
The default value is: "1 s".
""" ] ] duration_inf }? & [ a:documentation [ xml:lang="en" """ -Bind unicast sockets to the address of the preferred interface; if -false, bind to 0.0.0.0 (IPv4) or its equivalent
The default value -is: "true".
""" ] ] - element BindUnicastToInterfaceAddr { - xsd:boolean - }? - & [ a:documentation [ xml:lang="en" """This element controls which participants will have which built-in endpoints for the discovery and liveliness protocols. Valid values are:
diff --git a/etc/cyclonedds.xsd b/etc/cyclonedds.xsd index dbcab47..49d4378 100644 --- a/etc/cyclonedds.xsd +++ b/etc/cyclonedds.xsd @@ -638,7 +638,6 @@ reserved. This includes renaming or moving options.</p>This element controls whether retransmits are prioritized over new data, speeding up recovery.
") }, { LEAF("UseMulticastIfMreqn"), 1, "0", ABSOFF(use_multicast_if_mreqn), 0, uf_int, 0, pf_int, BLURB("Do not use.
") }, - { LEAF("BindUnicastToInterfaceAddr"), 1, "true", ABSOFF(bind_unicast_to_interface_addr), 0, uf_boolean, 0, pf_boolean, - BLURB("Bind unicast sockets to the address of the preferred interface; if false, bind to 0.0.0.0 (IPv4) or its equivalent
") }, { LEAF("SendAsync"), 1, "false", ABSOFF(xpack_send_async), 0, uf_boolean, 0, pf_boolean, BLURB("This element controls whether the actual sending of packets occurs on the same thread that prepares them, or is done asynchronously by another thread.
") }, { LEAF_W_ATTRS("RediscoveryBlacklistDuration", rediscovery_blacklist_duration_attrs), 1, "10s", ABSOFF(prune_deleted_ppant.delay), 0, uf_duration_inf, 0, pf_duration, diff --git a/src/core/ddsi/src/q_entity.c b/src/core/ddsi/src/q_entity.c index f52cddb..0790a00 100644 --- a/src/core/ddsi/src/q_entity.c +++ b/src/core/ddsi/src/q_entity.c @@ -652,7 +652,8 @@ dds_return_t new_participant_guid (const ddsi_guid_t *ppguid, struct ddsi_domain if (gv->config.many_sockets_mode == MSM_MANY_UNICAST) { - pp->m_conn = ddsi_factory_create_conn (gv->m_factory, 0, NULL); + const ddsi_tran_qos_t qos = { .m_purpose = DDSI_TRAN_QOS_RECV_UC, .m_diffserv = 0 }; + pp->m_conn = ddsi_factory_create_conn (gv->m_factory, 0, &qos); ddsi_conn_locator (pp->m_conn, &pp->m_locator); } else diff --git a/src/core/ddsi/src/q_init.c b/src/core/ddsi/src/q_init.c index 46ac147..7cb0fb3 100644 --- a/src/core/ddsi/src/q_init.c +++ b/src/core/ddsi/src/q_init.c @@ -96,14 +96,15 @@ static enum make_uc_sockets_ret make_uc_sockets (struct ddsi_domaingv *gv, uint3 if (!ddsi_is_valid_port (gv->m_factory, *pdisc) || !ddsi_is_valid_port (gv->m_factory, *pdata)) return MUSRET_INVALID_PORTS; - gv->disc_conn_uc = ddsi_factory_create_conn (gv->m_factory, *pdisc, NULL); + const ddsi_tran_qos_t qos = { .m_purpose = DDSI_TRAN_QOS_RECV_UC, .m_diffserv = 0 }; + gv->disc_conn_uc = ddsi_factory_create_conn (gv->m_factory, *pdisc, &qos); if (gv->disc_conn_uc) { /* Check not configured to use same unicast port for data and discovery */ if (*pdata != 0 && (*pdata != *pdisc)) { - gv->data_conn_uc = ddsi_factory_create_conn (gv->m_factory, *pdata, NULL); + gv->data_conn_uc = ddsi_factory_create_conn (gv->m_factory, *pdata, &qos); } else { @@ -663,10 +664,9 @@ int joinleave_spdp_defmcip (struct ddsi_domaingv *gv, int dojoin) int create_multicast_sockets (struct ddsi_domaingv *gv) { - ddsi_tran_qos_t qos = ddsi_tran_create_qos (); + const ddsi_tran_qos_t qos = { .m_purpose = DDSI_TRAN_QOS_RECV_MC, .m_diffserv = 0 }; ddsi_tran_conn_t disc, data; uint32_t port; - qos->m_multicast = 1; port = ddsi_get_port (&gv->config, DDSI_PORT_MULTI_DISC, 0); if (!ddsi_is_valid_port (gv->m_factory, port)) @@ -675,7 +675,7 @@ int create_multicast_sockets (struct ddsi_domaingv *gv) gv->config.extDomainId.value, port); goto err_disc; } - if ((disc = ddsi_factory_create_conn (gv->m_factory, port, qos)) == NULL) + if ((disc = ddsi_factory_create_conn (gv->m_factory, port, &qos)) == NULL) goto err_disc; if (gv->config.many_sockets_mode == MSM_NO_UNICAST) { @@ -691,12 +691,11 @@ int create_multicast_sockets (struct ddsi_domaingv *gv) gv->config.extDomainId.value, port); goto err_disc; } - if ((data = ddsi_factory_create_conn (gv->m_factory, port, qos)) == NULL) + if ((data = ddsi_factory_create_conn (gv->m_factory, port, &qos)) == NULL) { goto err_data; } } - ddsi_tran_free_qos (qos); gv->disc_conn_mc = disc; gv->data_conn_mc = data; @@ -707,7 +706,6 @@ int create_multicast_sockets (struct ddsi_domaingv *gv) err_data: ddsi_conn_free (disc); err_disc: - ddsi_tran_free_qos (qos); return 0; } @@ -964,7 +962,7 @@ int rtps_init (struct ddsi_domaingv *gv) gv->data_conn_uc = NULL; gv->disc_conn_mc = NULL; gv->data_conn_mc = NULL; - gv->tev_conn = NULL; + gv->xmit_conn = NULL; gv->listener = NULL; gv->thread_pool = NULL; gv->debmon = NULL; @@ -1280,9 +1278,6 @@ int rtps_init (struct ddsi_domaingv *gv) } else { - /* Must have a data_conn_uc/tev_conn/transmit_conn */ - gv->data_conn_uc = ddsi_factory_create_conn (gv->m_factory, 0, NULL); - if (gv->config.tcp_port == -1) ; /* nop */ else if (!ddsi_is_valid_port (gv->m_factory, (uint32_t) gv->config.tcp_port)) @@ -1311,9 +1306,10 @@ int rtps_init (struct ddsi_domaingv *gv) } /* Create shared transmit connection */ - - gv->tev_conn = gv->data_conn_uc; - GVLOG (DDS_LC_CONFIG, "Timed event transmit port: %d\n", (int) ddsi_conn_port (gv->tev_conn)); + { + const ddsi_tran_qos_t qos = { .m_purpose = DDSI_TRAN_QOS_XMIT, .m_diffserv = 0 }; + gv->xmit_conn = ddsi_factory_create_conn (gv->m_factory, 0, &qos); + } #ifdef DDSI_INCLUDE_NETWORK_CHANNELS { @@ -1376,7 +1372,7 @@ int rtps_init (struct ddsi_domaingv *gv) gv->xevents = xeventq_new ( - gv->tev_conn, + gv->xmit_conn, gv->config.max_queued_rexmit_bytes, gv->config.max_queued_rexmit_msgs, #ifdef DDSI_INCLUDE_BANDWIDTH_LIMITING @@ -1438,6 +1434,8 @@ int rtps_init (struct ddsi_domaingv *gv) return 0; err_mc_conn: + if (gv->xmit_conn) + ddsi_conn_free (gv->xmit_conn); if (gv->disc_conn_mc) ddsi_conn_free (gv->disc_conn_mc); if (gv->data_conn_mc && gv->data_conn_mc != gv->disc_conn_mc) @@ -1762,6 +1760,7 @@ void rtps_fini (struct ddsi_domaingv *gv) (void) joinleave_spdp_defmcip (gv, 0); + ddsi_conn_free (gv->xmit_conn); ddsi_conn_free (gv->disc_conn_mc); if (gv->data_conn_mc != gv->disc_conn_mc) ddsi_conn_free (gv->data_conn_mc); @@ -1770,8 +1769,6 @@ void rtps_fini (struct ddsi_domaingv *gv) if (gv->data_conn_uc != gv->disc_conn_uc) ddsi_conn_free (gv->data_conn_uc); - /* Not freeing gv->tev_conn: it aliases data_conn_uc */ - free_group_membership(gv->mship); ddsi_tran_factories_fini (gv); diff --git a/src/core/ddsi/src/q_nwif.c b/src/core/ddsi/src/q_nwif.c index 5789983..9bbbb5c 100644 --- a/src/core/ddsi/src/q_nwif.c +++ b/src/core/ddsi/src/q_nwif.c @@ -214,7 +214,7 @@ static int set_reuse_options (const struct ddsrt_log_cfg *logcfg, ddsrt_socket_t return 0; } -static int bind_socket (ddsrt_socket_t socket, unsigned short port, bool multicast, const struct ddsi_domaingv *gv) +static int bind_socket (ddsrt_socket_t socket, unsigned short port, bool bind_to_any, const struct ddsi_domaingv *gv) { dds_return_t rc = DDS_RETCODE_ERROR; @@ -226,7 +226,7 @@ static int bind_socket (ddsrt_socket_t socket, unsigned short port, bool multica struct sockaddr_in6 a; } socketname; ddsi_ipaddr_from_loc (&socketname.x, &gv->ownloc); - if (multicast || !gv->config.bind_unicast_to_interface_addr) + if (bind_to_any) socketname.a.sin6_addr = ddsrt_in6addr_any; socketname.a.sin6_port = htons (port); if (IN6_IS_ADDR_LINKLOCAL (&socketname.a.sin6_addr)) { @@ -243,7 +243,7 @@ static int bind_socket (ddsrt_socket_t socket, unsigned short port, bool multica struct sockaddr_in a; } socketname; ddsi_ipaddr_from_loc (&socketname.x, &gv->ownloc); - if (multicast || !gv->config.bind_unicast_to_interface_addr) + if (bind_to_any) socketname.a.sin_addr.s_addr = htonl (INADDR_ANY); socketname.a.sin_port = htons (port); rc = ddsrt_bind (socket, (struct sockaddr *) &socketname.a, sizeof (socketname.a)); @@ -345,7 +345,7 @@ static int set_mc_options_transmit (ddsrt_socket_t socket, const struct ddsi_dom } } -int make_socket (ddsrt_socket_t *sock, uint16_t port, bool stream, bool multicast, const struct ddsi_domaingv *gv) +int make_socket (ddsrt_socket_t *sock, uint16_t port, bool stream, bool reuse_addr, bool bind_to_any, const struct ddsi_domaingv *gv) { /* FIXME: this stuff has to move to the transports */ int rc = -2; @@ -373,18 +373,15 @@ int make_socket (ddsrt_socket_t *sock, uint16_t port, bool stream, bool multicas return rc; } - if (port && multicast && ((rc = set_reuse_options (&gv->logconfig, *sock)) < 0)) + if (port && reuse_addr && ((rc = set_reuse_options (&gv->logconfig, *sock)) < 0)) { goto fail; } - if - ( - (rc = set_rcvbuf (&gv->logconfig, *sock, &gv->config.socket_min_rcvbuf_size) < 0) || - (rc = set_sndbuf (&gv->logconfig, *sock, gv->config.socket_min_sndbuf_size) < 0) || - ((rc = maybe_set_dont_route (&gv->logconfig, *sock, &gv->config)) < 0) || - ((rc = bind_socket (*sock, port, multicast, gv)) < 0) - ) + if ((rc = set_rcvbuf (&gv->logconfig, *sock, &gv->config.socket_min_rcvbuf_size) < 0) || + (rc = set_sndbuf (&gv->logconfig, *sock, gv->config.socket_min_sndbuf_size) < 0) || + ((rc = maybe_set_dont_route (&gv->logconfig, *sock, &gv->config)) < 0) || + ((rc = bind_socket (*sock, port, bind_to_any, gv)) < 0)) { goto fail; } diff --git a/src/core/ddsi/src/q_receive.c b/src/core/ddsi/src/q_receive.c index 6ae7d41..7b138a8 100644 --- a/src/core/ddsi/src/q_receive.c +++ b/src/core/ddsi/src/q_receive.c @@ -3156,7 +3156,7 @@ void trigger_recv_threads (const struct ddsi_domaingv *gv) iov.iov_base = &dummy; iov.iov_len = 1; GVTRACE ("trigger_recv_threads: %d single %s\n", i, ddsi_locator_to_string (buf, sizeof (buf), dst)); - ddsi_conn_write (gv->data_conn_uc, dst, 1, &iov, 0); + ddsi_conn_write (gv->xmit_conn, dst, 1, &iov, 0); break; } case RTM_MANY: {