Changeset 2966 for pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c
- Timestamp:
- Oct 25, 2009 9:02:07 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_transport_tcp.c
r2781 r2966 58 58 pjsip_tpmgr *tpmgr; 59 59 pj_activesock_t *asock; 60 pj_qos_type qos_type; 61 pj_qos_params qos_params; 60 62 }; 61 63 … … 165 167 } 166 168 169 /* 170 * Initialize pjsip_tcp_transport_cfg structure with default values. 171 */ 172 PJ_DEF(void) pjsip_tcp_transport_cfg_default(pjsip_tcp_transport_cfg *cfg, 173 int af) 174 { 175 pj_bzero(cfg, sizeof(*cfg)); 176 cfg->af = af; 177 pj_sockaddr_init(cfg->af, &cfg->bind_addr, NULL, 0); 178 cfg->async_cnt = 1; 179 } 167 180 168 181 … … 175 188 * TCP listener. 176 189 */ 177 PJ_DEF(pj_status_t) pjsip_tcp_transport_start 2(pjsip_endpoint *endpt,178 const pj_sockaddr_in *local,179 const pjsip_host_port *a_name,180 unsigned async_cnt,181 pjsip_tpfactory **p_factory)190 PJ_DEF(pj_status_t) pjsip_tcp_transport_start3( 191 pjsip_endpoint *endpt, 192 const pjsip_tcp_transport_cfg *cfg, 193 pjsip_tpfactory **p_factory 194 ) 182 195 { 183 196 pj_pool_t *pool; … … 186 199 pj_activesock_cfg asock_cfg; 187 200 pj_activesock_cb listener_cb; 188 pj_sockaddr _in*listener_addr;201 pj_sockaddr *listener_addr; 189 202 int addr_len; 190 203 pj_status_t status; 191 204 192 205 /* Sanity check */ 193 PJ_ASSERT_RETURN(endpt && async_cnt, PJ_EINVAL);206 PJ_ASSERT_RETURN(endpt && cfg->async_cnt, PJ_EINVAL); 194 207 195 208 /* Verify that address given in a_name (if any) is valid */ 196 if (a_name && a_name->host.slen) { 197 pj_sockaddr_in tmp; 198 199 status = pj_sockaddr_in_init(&tmp, &a_name->host, 200 (pj_uint16_t)a_name->port); 201 if (status != PJ_SUCCESS || tmp.sin_addr.s_addr == PJ_INADDR_ANY || 202 tmp.sin_addr.s_addr == PJ_INADDR_NONE) 209 if (cfg->addr_name.host.slen) { 210 pj_sockaddr tmp; 211 212 status = pj_sockaddr_init(cfg->af, &tmp, &cfg->addr_name.host, 213 (pj_uint16_t)cfg->addr_name.port); 214 if (status != PJ_SUCCESS || !pj_sockaddr_has_addr(&tmp) || 215 (cfg->af==pj_AF_INET() && 216 tmp.ipv4.sin_addr.s_addr==PJ_INADDR_NONE)) 203 217 { 204 218 /* Invalid address */ … … 218 232 listener->factory.flag = 219 233 pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_TCP); 234 listener->qos_type = cfg->qos_type; 235 pj_memcpy(&listener->qos_params, &cfg->qos_params, 236 sizeof(cfg->qos_params)); 220 237 221 238 pj_ansi_strcpy(listener->factory.obj_name, "tcplis"); … … 227 244 228 245 229 /* Create and bindsocket */230 status = pj_sock_socket( pj_AF_INET(), pj_SOCK_STREAM(), 0, &sock);246 /* Create socket */ 247 status = pj_sock_socket(cfg->af, pj_SOCK_STREAM(), 0, &sock); 231 248 if (status != PJ_SUCCESS) 232 249 goto on_error; 233 250 234 listener_addr = (pj_sockaddr_in*)&listener->factory.local_addr; 235 if (local) { 236 pj_memcpy(listener_addr, local, sizeof(pj_sockaddr_in)); 237 } else { 238 pj_sockaddr_in_init(listener_addr, NULL, 0); 239 } 240 241 status = pj_sock_bind(sock, listener_addr, sizeof(pj_sockaddr_in)); 251 /* Apply QoS, if specified */ 252 status = pj_sock_apply_qos2(sock, cfg->qos_type, &cfg->qos_params, 253 2, listener->factory.obj_name, 254 "SIP TCP listener socket"); 255 256 /* Bind socket */ 257 listener_addr = &listener->factory.local_addr; 258 pj_sockaddr_cp(listener_addr, &cfg->bind_addr); 259 260 status = pj_sock_bind(sock, listener_addr, 261 pj_sockaddr_get_len(listener_addr)); 242 262 if (status != PJ_SUCCESS) 243 263 goto on_error; 244 264 245 265 /* Retrieve the bound address */ 246 addr_len = sizeof(pj_sockaddr_in);266 addr_len = pj_sockaddr_get_len(listener_addr); 247 267 status = pj_sock_getsockname(sock, listener_addr, &addr_len); 248 268 if (status != PJ_SUCCESS) … … 252 272 * listener advertised address. 253 273 */ 254 if ( a_name && a_name->host.slen) {274 if (cfg->addr_name.host.slen) { 255 275 /* Copy the address */ 256 listener->factory.addr_name = *a_name;276 listener->factory.addr_name = cfg->addr_name; 257 277 pj_strdup(listener->factory.pool, &listener->factory.addr_name.host, 258 & a_name->host);259 listener->factory.addr_name.port = a_name->port;278 &cfg->addr_name.host); 279 listener->factory.addr_name.port = cfg->addr_name.port; 260 280 261 281 } else { … … 265 285 * interface address as the transport's address. 266 286 */ 267 if ( listener_addr->sin_addr.s_addr == 0) {287 if (!pj_sockaddr_has_addr(listener_addr)) { 268 288 pj_sockaddr hostip; 269 289 … … 272 292 goto on_error; 273 293 274 listener_addr->sin_addr.s_addr = hostip.ipv4.sin_addr.s_addr; 294 pj_memcpy(pj_sockaddr_get_addr(listener_addr), 295 pj_sockaddr_get_addr(&hostip), 296 pj_sockaddr_get_addr_len(&hostip)); 275 297 } 276 298 277 299 /* Save the address name */ 278 300 sockaddr_to_host_port(listener->factory.pool, 279 &listener->factory.addr_name, listener_addr); 301 &listener->factory.addr_name, 302 (pj_sockaddr_in*)listener_addr); 280 303 } 281 304 282 305 /* If port is zero, get the bound port */ 283 306 if (listener->factory.addr_name.port == 0) { 284 listener->factory.addr_name.port = pj_ ntohs(listener_addr->sin_port);307 listener->factory.addr_name.port = pj_sockaddr_get_port(listener_addr); 285 308 } 286 309 … … 297 320 298 321 /* Create active socket */ 299 if (async_cnt > MAX_ASYNC_CNT) async_cnt = MAX_ASYNC_CNT;300 322 pj_activesock_cfg_default(&asock_cfg); 301 asock_cfg.async_cnt = async_cnt; 323 if (cfg->async_cnt > MAX_ASYNC_CNT) 324 asock_cfg.async_cnt = MAX_ASYNC_CNT; 325 else 326 asock_cfg.async_cnt = cfg->async_cnt; 302 327 303 328 pj_bzero(&listener_cb, sizeof(listener_cb)); … … 349 374 * TCP listener. 350 375 */ 376 PJ_DEF(pj_status_t) pjsip_tcp_transport_start2(pjsip_endpoint *endpt, 377 const pj_sockaddr_in *local, 378 const pjsip_host_port *a_name, 379 unsigned async_cnt, 380 pjsip_tpfactory **p_factory) 381 { 382 pjsip_tcp_transport_cfg cfg; 383 384 pjsip_tcp_transport_cfg_default(&cfg, pj_AF_INET()); 385 386 if (local) 387 pj_sockaddr_cp(&cfg.bind_addr, local); 388 else 389 pj_sockaddr_init(cfg.af, &cfg.bind_addr, NULL, 0); 390 391 if (a_name) 392 pj_memcpy(&cfg.addr_name, a_name, sizeof(*a_name)); 393 394 if (async_cnt) 395 cfg.async_cnt = async_cnt; 396 397 return pjsip_tcp_transport_start3(endpt, &cfg, p_factory); 398 } 399 400 401 /* 402 * This is the public API to create, initialize, register, and start the 403 * TCP listener. 404 */ 351 405 PJ_DEF(pj_status_t) pjsip_tcp_transport_start( pjsip_endpoint *endpt, 352 406 const pj_sockaddr_in *local, … … 774 828 if (status != PJ_SUCCESS) 775 829 return status; 830 831 /* Apply QoS, if specified */ 832 status = pj_sock_apply_qos2(sock, listener->qos_type, 833 &listener->qos_params, 834 2, listener->factory.obj_name, 835 "outgoing SIP TCP socket"); 776 836 777 837 /* Bind to any port */ … … 878 938 pj_sockaddr_print(src_addr, addr, sizeof(addr), 3), 879 939 sock)); 940 941 /* Apply QoS, if specified */ 942 status = pj_sock_apply_qos2(sock, listener->qos_type, 943 &listener->qos_params, 944 2, listener->factory.obj_name, 945 "incoming SIP TCP socket"); 880 946 881 947 /*
Note: See TracChangeset
for help on using the changeset viewer.