osaf/libs/core/mds/include/mds_dt_tcp_disc.h | 1 - osaf/libs/core/mds/mds_dt_tcp.c | 20 +++++- osaf/services/infrastructure/dtms/config/dtmd.conf | 23 +++++++ osaf/services/infrastructure/dtms/dtm/dtm_intra.c | 13 +-- osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c | 44 ++++++------- osaf/services/infrastructure/dtms/dtm/dtm_read_config.c | 30 +++++++++ osaf/services/infrastructure/dtms/include/dtm.h | 2 + osaf/services/infrastructure/dtms/include/dtm_cb.h | 3 + osaf/services/infrastructure/dtms/include/dtm_intra_disc.h | 2 - osaf/services/infrastructure/nid/scripts/opensafd.in | 1 + 10 files changed, 104 insertions(+), 35 deletions(-)
1) Their is NO issue with MDS TCP in-service Upgrade ,The value of SO_RCVBUF & SO_SNDBUF of TCP sockets was set to 64000 (MDS_SND_RCV_SIZE) using setsockopt() ,the kernel doubles this value ,and this doubled value is returned by getsockopt(). So MDTM_NORMAL_MSG_FRAG_SIZE_MAX size is used to send for for both previous & current versions of Opensaf nodes which are using MDS TCP as transport 2) Made DTM-TCP inter-node & intra-node socket SO_SNDBUF and SO_RCVBUF buffer in bytes configurable . The kernel doubles this value (to allow space for bookkeeping over-head) when it is set using setsockopt(),and this doubled value is returned by getsockopt(). The default value is set to DTM_SOCK_SND_RCV_BUF_SIZE=126976 3) Made TCP_NODELAY configurable to specifi whether MDS TCP transport should follow the Nagle algorithm for deciding when to send data.By default, TCP will follow the Nagle algorithm is disable this behavior , can be configured to TRUE(1) or FALSE(0) diff --git a/osaf/libs/core/mds/include/mds_dt_tcp_disc.h b/osaf/libs/core/mds/include/mds_dt_tcp_disc.h --- a/osaf/libs/core/mds/include/mds_dt_tcp_disc.h +++ b/osaf/libs/core/mds/include/mds_dt_tcp_disc.h @@ -70,7 +70,6 @@ server_instance_upper + sub_ref_val + su #define MDS_SND_VERSION 1 #define MDS_RCV_IDENTIFIRE 0x56123456 #define MDS_RCV_VERSION 1 -#define DTM_INTRANODE_MSG_SIZE 1500 #define DTM_INTRANODE_UNSENT_MSG 200 #define MDS_MDTM_LOWER_INSTANCE 0x00000000 diff --git a/osaf/libs/core/mds/mds_dt_tcp.c b/osaf/libs/core/mds/mds_dt_tcp.c --- a/osaf/libs/core/mds/mds_dt_tcp.c +++ b/osaf/libs/core/mds/mds_dt_tcp.c @@ -38,7 +38,6 @@ #include <configmake.h> #define MDS_MDTM_SUN_PATH 255 -#define MDS_SND_RCV_SIZE 64000 #define MDS_MDTM_CONNECT_PATH PKGLOCALSTATEDIR "/osaf_dtm_intra_server" #ifndef MDS_PORT_NUMBER @@ -53,6 +52,9 @@ /* Send_buffer_size + MDS_MDTM_DTM_PID_BUFFER_SIZE */ #define MDS_MDTM_DTM_PID_BUFFER_SIZE (2 + MDS_MDTM_DTM_PID_SIZE) +/* The default value is set by the rmem_default/wmem_default */ +#define MDS_SOCK_SND_RCV_BUF_SIZE 126976 + extern uint32_t mdtm_num_subscriptions; extern MDS_SUBTN_REF_VAL mdtm_handle; extern uint32_t mdtm_global_frag_num_tcp; @@ -79,11 +81,12 @@ uint32_t mdtm_process_recv_events_tcp(vo uint32_t mds_mdtm_init_tcp(NODE_ID nodeid, uint32_t *mds_tcp_ref) { uint32_t flags; - uint32_t size = MDS_SND_RCV_SIZE; + uint32_t size = MDS_SOCK_SND_RCV_BUF_SIZE; struct sockaddr_un server_addr_un, dhserver_addr_un; struct sockaddr_in server_addr_in; struct sockaddr_in6 server_addr_in6; uint8_t buffer[MDS_MDTM_DTM_PID_BUFFER_SIZE]; + char *ptr; mdtm_pid = getpid(); @@ -116,6 +119,19 @@ uint32_t mds_mdtm_init_tcp(NODE_ID nodei syslog(LOG_ERR, "MDS:MDTM:TCP ncs_patricia_tree_init failed MDTM_INIT\n"); return NCSCC_RC_FAILURE; } + + /* setting MDS_SOCK_SND_RCV_BUF_SIZE from environment variable if given. + The default value is set to MDS_SOCK_SND_RCV_BUF_SIZE (126976). + based on application requirements user need to export MDS_SOCK_SND_RCV_BUF_SIZE + varible. + + If MDS_SOCK_SND_RCV_BUF_SIZE exported to new value + it is also mandatory to change `DTM_SOCK_SND_RCV_BUF_SIZE=` with the same value of + for example if we export MDS_SOCK_SND_RCV_BUF_SIZE=16777216 + DTM_SOCK_SND_RCV_BUF_SIZE=16777216 also need to be changed in /etc/opensaf/dtm.conf */ + if ((ptr = getenv("MDS_SOCK_SND_RCV_BUF_SIZE")) != NULL) { + size = atoi(ptr); + } /* Create the sockets required for Binding, Send, receive and Discovery */ diff --git a/osaf/services/infrastructure/dtms/config/dtmd.conf b/osaf/services/infrastructure/dtms/config/dtmd.conf --- a/osaf/services/infrastructure/dtms/config/dtmd.conf +++ b/osaf/services/infrastructure/dtms/config/dtmd.conf @@ -72,4 +72,27 @@ DTM_TCP_KEEPALIVE_INTVL=1 # Optional DTM_TCP_KEEPALIVE_PROBES=2 +# +#Used to Set the dtm internode & intranode socket SO_SNDBUF/SO_RCVBUF buffer in bytes. +#The kernel doubles this value (to allow space for bookkeeping over-head) +#when it is set using setsockopt(),and this doubled value is returned by +#getsockopt(). The default value is set by the rmem_default/wmem_default +#sysctl and the maximum allowed value is set by the rmem_max/wmem_max sysctl. +# +# IMP NOTE : If DTM_SOCK_SND_RCV_BUF_SIZE is configured according to application requirements , +#it is also mandatory to export `MDS_SOCK_SND_RCV_BUF_SIZE=` with the same value of +#for example if set as DTM_SOCK_SND_RCV_BUF_SIZE=16777216 need to do : +#export MDS_SOCK_SND_RCV_BUF_SIZE=16777216 +DTM_SOCK_SND_RCV_BUF_SIZE=126976 +# +#Specifies whether MDS TCP transport should follow the Nagle algorithm for +#deciding when to send data.By default, TCP will follow the Nagle algorithm is disable +#this behavior,MDS TCP transport can enable TCP_NODELAY to force +#TCP to always send data immediately.For example,TCP_NODELAY should be used +#when there is an application using TCP for a request/response. +#This option is only supported for sockets with an address family +#of AF_INET or AF_INET6 (internode )and type of SOCK_STREAM +# TRUE(1) or FALSE(0) +DTM_TCP_NODELAY_FLAG=1 + diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_intra.c b/osaf/services/infrastructure/dtms/dtm/dtm_intra.c --- a/osaf/services/infrastructure/dtms/dtm/dtm_intra.c +++ b/osaf/services/infrastructure/dtms/dtm/dtm_intra.c @@ -42,7 +42,6 @@ DTM_INTRANODE_CB *dtm_intranode_cb = NUL #define DTM_INTRANODE_MAX_PROCESSES 100 #define DTM_INTRANODE_POLL_TIMEOUT 20000 -#define DTM_RECV_BUFFER_SIZE 1500 #define DTM_INTRANODE_TASKNAME "DTM_INTRANODE" #define DTM_INTRANODE_STACKSIZE NCS_STACKSIZE_HUGE @@ -58,7 +57,7 @@ static struct pollfd pfd_list[DTM_INTRAN static int dtm_intranode_max_fd; -static uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE i_addr_family); +static uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE i_addr_family, int32_t sock_snd_rcv_buf_size); static void dtm_intranode_processing(void); static uint32_t dtm_intranode_add_poll_fdlist(int fd, uint16_t event); static uint32_t dtm_intranode_create_rcv_task(int task_hdl); @@ -79,10 +78,9 @@ uint32_t dtm_socket_domain = AF_UNIX; */ uint32_t dtm_service_discovery_init(DTM_INTERNODE_CB *dtms_cb) { - return dtm_intra_processing_init(dtms_cb->ip_addr, dtms_cb->i_addr_family); + return dtm_intra_processing_init(dtms_cb->ip_addr, dtms_cb->i_addr_family, dtms_cb->sock_snd_rcv_buf_size); } -#define DTM_INTRANODE_SOCK_SIZE 64000 /** * Function to init the intranode processing @@ -92,10 +90,10 @@ uint32_t dtm_service_discovery_init(DTM_ * @return NCSCC_RC_FAILURE * */ -uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE i_addr_family) +uint32_t dtm_intra_processing_init(char *node_ip, DTM_IP_ADDR_TYPE i_addr_family, int32_t sock_snd_rcv_buf_size) { - int servlen, size = DTM_INTRANODE_SOCK_SIZE; /* For socket fd and server len */ + int servlen, size = sock_snd_rcv_buf_size; /* For socket fd and server len */ struct sockaddr_un serv_addr; /* For Unix Sock address */ char server_ux_name[255]; NCS_PATRICIA_PARAMS pat_tree_params; @@ -112,6 +110,7 @@ uint32_t dtm_intra_processing_init(char return NCSCC_RC_FAILURE; } dtm_intranode_cb->sock_domain = dtm_socket_domain; + dtm_intranode_cb->sock_snd_rcv_buf_size = sock_snd_rcv_buf_size; /* Open a socket, If socket opens to fail return Error */ dtm_intranode_cb->server_sockfd = socket(dtm_socket_domain, SOCK_STREAM, 0); @@ -894,7 +893,7 @@ static uint32_t dtm_intranode_process_in { int flags; /* Accept processing */ - int accept_fd = 0, retry_count = 0, size = DTM_INTRANODE_SOCK_SIZE; + int accept_fd = 0, retry_count = 0, size = dtm_intranode_cb->sock_snd_rcv_buf_size; socklen_t len = sizeof(struct sockaddr_un); struct sockaddr_un cli_addr; /* Accept should be non_block */ diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c b/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c --- a/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c +++ b/osaf/services/infrastructure/dtms/dtm/dtm_node_sockets.c @@ -26,7 +26,6 @@ #define MYPORT "6900" #define MAXBUFLEN 100 -#define DTM_INTERNODE_SOCK_SIZE 64000 struct addrinfo *mcast_sender_addr; /* Holder for mcast_sender_addr address */ @@ -431,7 +430,7 @@ uint32_t dtm_comm_socket_send(int sock_d int rtn = 0; int err = 0; int rc = NCSCC_RC_SUCCESS; - rtn = send(sock_desc, (raw_type *) buffer, buffer_len, 0); + rtn = send(sock_desc, (raw_type *) buffer, buffer_len, MSG_NOSIGNAL); err = errno; if (rtn < 0) { if (!IS_BLOCKIN_ERROR(err)) { @@ -508,7 +507,7 @@ static char *comm_get_foreign_address(in int comm_socket_setup_new(DTM_INTERNODE_CB * dtms_cb, const char *foreign_address, in_port_t foreign_port, DTM_IP_ADDR_TYPE ip_addr_type) { - int sock_desc = -1, size = DTM_INTERNODE_SOCK_SIZE; + int sock_desc = -1, size = dtms_cb->sock_snd_rcv_buf_size; int err = 0, rv; char local_port_str[INET6_ADDRSTRLEN]; struct addrinfo *addr_list; @@ -578,12 +577,12 @@ int comm_socket_setup_new(DTM_INTERNODE_ goto done; } - int flag = 1; - if (setsockopt(sock_desc, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { - LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); - dtm_comm_socket_close(&sock_desc); - goto done; - } + int flag = dtms_cb->tcp_nodelay_flag; + if (setsockopt(sock_desc, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { + LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); + dtm_comm_socket_close(&sock_desc); + goto done; + } if (NCSCC_RC_SUCCESS != set_keepalive(dtms_cb, sock_desc)) { LOG_ER("DTM :set_keepalive failed "); @@ -660,7 +659,7 @@ uint32_t dtm_stream_nonblocking_listener struct addrinfo addr_criteria; /* Criteria for address match */ char local_port_str[6]; struct addrinfo *addr_list = NULL, *p;; /* List of serv addresses */ - int size = DTM_INTERNODE_SOCK_SIZE; + int size = dtms_cb->sock_snd_rcv_buf_size; int rv; char ip_addr_eth[INET6_ADDRSTRLEN + IFNAMSIZ]; dtms_cb->stream_sock = -1; @@ -728,11 +727,11 @@ uint32_t dtm_stream_nonblocking_listener LOG_ER("DTM:Socket snd buf size set failed err :%s", strerror(errno)); } - int flag = 1; - if (setsockopt(dtms_cb->stream_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { - LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); - dtm_sockdesc_close(dtms_cb->stream_sock); - return NCSCC_RC_FAILURE; + int flag = dtms_cb->tcp_nodelay_flag; + if (setsockopt(dtms_cb->stream_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { + LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); + dtm_sockdesc_close(dtms_cb->stream_sock); + return NCSCC_RC_FAILURE; } if (set_keepalive(dtms_cb, dtms_cb->stream_sock) != NCSCC_RC_SUCCESS) { @@ -1249,7 +1248,6 @@ int dtm_process_connect(DTM_INTERNODE_CB } -#define DTM_INTERNODE_SOCK_SIZE 64000 /** * Function for dtm accept the connection @@ -1270,7 +1268,7 @@ int dtm_process_accept(DTM_INTERNODE_CB int err = 0; DTM_NODE_DB node; DTM_NODE_DB *new_node; - int new_conn_sd, size = DTM_INTERNODE_SOCK_SIZE; + int new_conn_sd, size = dtms_cb->sock_snd_rcv_buf_size; const struct sockaddr *clnt_addr1 = (struct sockaddr *)&clnt_addr; TRACE_ENTER(); @@ -1298,12 +1296,12 @@ int dtm_process_accept(DTM_INTERNODE_CB goto done; } - int flag = 1; - if (setsockopt(new_conn_sd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { - LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); - dtm_comm_socket_close(&new_conn_sd); - goto done; - } + int flag = dtms_cb->tcp_nodelay_flag; + if (setsockopt(new_conn_sd, IPPROTO_TCP, TCP_NODELAY, (void *)&flag, sizeof(flag)) != 0) { + LOG_ER("DTM:Socket TCP_NODELAY set failed err :%s", strerror(errno)); + dtm_comm_socket_close(&new_conn_sd); + goto done; + } if (NCSCC_RC_SUCCESS != set_keepalive(dtms_cb, new_conn_sd)) { LOG_ER("DTM:set_keepalive failed "); diff --git a/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c b/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c --- a/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c +++ b/osaf/services/infrastructure/dtms/dtm/dtm_read_config.c @@ -94,6 +94,10 @@ void dtm_print_config(DTM_INTERNODE_CB * TRACE(" %d", config->initial_dis_timeout); TRACE(" DTM_BCAST_FRE_MSECS: "); TRACE(" %d", config->bcast_msg_freq); + TRACE(" DTM_SOCK_SND_RCV_BUF_SIZE: "); + TRACE(" %d", config->sock_snd_rcv_buf_size); + TRACE(" DTM_TCP_NODELAY_FLAG: "); + TRACE(" %d", config->tcp_nodelay_flag); TRACE("DTM : "); } @@ -220,6 +224,8 @@ int dtm_read_config(DTM_INTERNODE_CB * c config->i_addr_family = DTM_IP_ADDR_TYPE_IPV4; config->bcast_msg_freq = BCAST_FRE; config->initial_dis_timeout = DIS_TIME_OUT; + config->sock_snd_rcv_buf_size = DTM_SOCK_SND_RCV_BUF_SIZE; + config->tcp_nodelay_flag = true; config->mcast_flag = false; config->scope_link = false; config->node_id = m_NCS_GET_NODE_ID; @@ -424,6 +430,30 @@ int dtm_read_config(DTM_INTERNODE_CB * c tag_len = 0; } + if (strncmp(line, "DTM_SOCK_SND_RCV_BUF_SIZE=", strlen("DTM_SOCK_SND_RCV_BUF_SIZE=")) == 0) { + tag_len = strlen("DTM_SOCK_SND_RCV_BUF_SIZE="); + config->sock_snd_rcv_buf_size = atoi(&line[tag_len]); + if (config->sock_snd_rcv_buf_size < 126976) { + LOG_ER("DTM: DTM_SOCK_SND_RCV_BUF_SIZE must be greater than rmem_default/wmem_default sysctl of dtmd.conf"); + return -1; + } + + tag = 0; + tag_len = 0; + + } + + if (strncmp(line, "DTM_TCP_NODELAY_FLAG=", strlen("DTM_TCP_NODELAY_FLAG=")) == 0) { + tag_len = strlen("DTM_TCP_NODELAY_FLAG="); + config->tcp_nodelay_flag = atoi(&line[tag_len]); + if (config->tcp_nodelay_flag < 0 || config->tcp_nodelay_flag > 1) { + LOG_ER("DTM: DTM_TCP_NODELAY_FLAG needs to be 0 or 1 of dtmd.conf "); + return -1; + } + tag = 0; + tag_len = 0; + + } } memset(line, 0, DTM_MAX_TAG_LEN); diff --git a/osaf/services/infrastructure/dtms/include/dtm.h b/osaf/services/infrastructure/dtms/include/dtm.h --- a/osaf/services/infrastructure/dtms/include/dtm.h +++ b/osaf/services/infrastructure/dtms/include/dtm.h @@ -37,6 +37,8 @@ extern uint8_t initial_discovery_phase; #define m_NODE_DISCOVERY_TASKNAME "NODE_DISCOVERY" #define m_NODE_DISCOVERY_STACKSIZE NCS_STACKSIZE_HUGE +/* The default value of SO_RCVBUF & SO_SNDBUF , it is set by the rmem_default/wmem_default */ +#define DTM_SOCK_SND_RCV_BUF_SIZE 126976 #define DTM_MAX_TAG_LEN 256 typedef enum { diff --git a/osaf/services/infrastructure/dtms/include/dtm_cb.h b/osaf/services/infrastructure/dtms/include/dtm_cb.h --- a/osaf/services/infrastructure/dtms/include/dtm_cb.h +++ b/osaf/services/infrastructure/dtms/include/dtm_cb.h @@ -90,6 +90,8 @@ typedef struct dtm_internode_cb { int comm_keepidle_time; int comm_keepalive_intvl; int comm_keepalive_probes; + int32_t sock_snd_rcv_buf_size; /* The value of SO_RCVBUF & SO_SNDBUF */ + uint8_t tcp_nodelay_flag; /* The value of TCP_NODELAY Flag */ SYSF_MBX mbx; int mbx_fd; } DTM_INTERNODE_CB; @@ -116,6 +118,7 @@ typedef struct dtm_intranode_cb { SYSF_MBX mbx; int mbx_fd; int sock_domain; + int32_t sock_snd_rcv_buf_size; /* The value of SO_RCVBUF & SO_SNDBUF */ } DTM_INTRANODE_CB; extern DTM_INTRANODE_CB *dtm_intranode_cb; diff --git a/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h b/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h --- a/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h +++ b/osaf/services/infrastructure/dtms/include/dtm_intra_disc.h @@ -17,8 +17,6 @@ #ifndef DTM_INTRA_DISC_H #define DTM_INTRA_DISC_H -#define DTM_INTRANODE_MSG_SIZE 1400 -#define DTM_INTERNODE_MSG_SIZE DTM_INTRANODE_MSG_SIZE /* 2 -len(0), 4 - iden(2), 1- ver(6), 1-msg type(7), 4- server_type (8), 4 -server lower(12), 4 -server lower(16), 8 -ref(20), 4 - nodeid(28), diff --git a/osaf/services/infrastructure/nid/scripts/opensafd.in b/osaf/services/infrastructure/nid/scripts/opensafd.in --- a/osaf/services/infrastructure/nid/scripts/opensafd.in +++ b/osaf/services/infrastructure/nid/scripts/opensafd.in @@ -184,6 +184,7 @@ generate_nodeid() { } check_transport() { + rm -f $pkglocalstatedir/osaf_dtm_intra_server if [ "$MDS_TRANSPORT" = "TIPC" ]; then # Transport TIPC check_tipc ------------------------------------------------------------------------------ WatchGuard Dimension instantly turns raw network data into actionable security intelligence. It gives you real-time visual feedback on key security issues and trends. Skip the complicated setup - simply import a virtual appliance and go from zero to informed in seconds. http://pubads.g.doubleclick.net/gampad/clk?id=123612991&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel