Changeset 1602 for pjproject/trunk/pjsip/src/pjsip/sip_transport.c
- Timestamp:
- Dec 1, 2007 8:59:25 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjsip/src/pjsip/sip_transport.c
r1536 r1602 94 94 struct transport_names_t 95 95 { 96 pjsip_transport_type_e type; 97 pj_uint16_t port; 98 pj_str_t name; 99 unsigned flag; 100 char name_buf[16]; 96 pjsip_transport_type_e type; /* Transport type */ 97 pj_uint16_t port; /* Default port number */ 98 pj_str_t name; /* Id tag */ 99 const char *description; /* Longer description */ 100 unsigned flag; /* Flags */ 101 char name_buf[16]; /* For user's transport */ 101 102 } transport_names[16] = 102 103 { 103 { PJSIP_TRANSPORT_UNSPECIFIED, 0, {"Unspecified", 11}, 0}, 104 { PJSIP_TRANSPORT_UDP, 5060, {"UDP", 3}, PJSIP_TRANSPORT_DATAGRAM}, 105 { PJSIP_TRANSPORT_TCP, 5060, {"TCP", 3}, PJSIP_TRANSPORT_RELIABLE}, 106 { PJSIP_TRANSPORT_TLS, 5061, {"TLS", 3}, PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE}, 107 { PJSIP_TRANSPORT_SCTP, 5060, {"SCTP", 4}, PJSIP_TRANSPORT_RELIABLE}, 108 { PJSIP_TRANSPORT_LOOP, 15060, {"LOOP", 4}, PJSIP_TRANSPORT_RELIABLE}, 109 { PJSIP_TRANSPORT_LOOP_DGRAM, 15060, {"LOOP-DGRAM", 10}, PJSIP_TRANSPORT_DATAGRAM}, 104 { 105 PJSIP_TRANSPORT_UNSPECIFIED, 106 0, 107 {"Unspecified", 11}, 108 "Unspecified", 109 0 110 }, 111 { 112 PJSIP_TRANSPORT_UDP, 113 5060, 114 {"UDP", 3}, 115 "UDP transport", 116 PJSIP_TRANSPORT_DATAGRAM 117 }, 118 { 119 PJSIP_TRANSPORT_TCP, 120 5060, 121 {"TCP", 3}, 122 "TCP transport", 123 PJSIP_TRANSPORT_RELIABLE 124 }, 125 { 126 PJSIP_TRANSPORT_TLS, 127 5061, 128 {"TLS", 3}, 129 "TLS transport", 130 PJSIP_TRANSPORT_RELIABLE | PJSIP_TRANSPORT_SECURE 131 }, 132 { 133 PJSIP_TRANSPORT_SCTP, 134 5060, 135 {"SCTP", 4}, 136 "SCTP transport", 137 PJSIP_TRANSPORT_RELIABLE 138 }, 139 { 140 PJSIP_TRANSPORT_LOOP, 141 15060, 142 {"LOOP", 4}, 143 "Loopback transport", 144 PJSIP_TRANSPORT_RELIABLE 145 }, 146 { 147 PJSIP_TRANSPORT_LOOP_DGRAM, 148 15060, 149 {"LOOP-DGRAM", 10}, 150 "Loopback datagram transport", 151 PJSIP_TRANSPORT_DATAGRAM 152 }, 153 { 154 PJSIP_TRANSPORT_UDP6, 155 5060, 156 {"UDP", 3}, 157 "UDP IPv6 transport", 158 PJSIP_TRANSPORT_DATAGRAM 159 }, 160 { 161 PJSIP_TRANSPORT_TCP6, 162 5060, 163 {"TCP", 3}, 164 "TCP IPv6 transport", 165 PJSIP_TRANSPORT_RELIABLE 166 }, 110 167 }; 168 169 struct transport_names_t *get_tpname(pjsip_transport_type_e type) 170 { 171 unsigned i; 172 for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { 173 if (transport_names[i].type == type) 174 return &transport_names[i]; 175 } 176 pj_assert(!"Invalid transport type!"); 177 return NULL; 178 } 179 180 181 /* 182 * Tools to get address string. 183 */ 184 static const char *addr_string(const pj_sockaddr_t *addr) 185 { 186 static char str[PJ_INET6_ADDRSTRLEN]; 187 pj_inet_ntop(((const pj_sockaddr*)addr)->addr.sa_family, 188 pj_sockaddr_get_addr(addr), 189 str, sizeof(str)); 190 return str; 191 } 111 192 112 193 … … 154 235 unsigned i; 155 236 156 /* Sanity check.157 * Check that transport_names[] are indexed on transport type.158 */159 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type ==160 PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED);161 162 237 if (name->slen == 0) 163 238 return PJSIP_TRANSPORT_UNSPECIFIED; … … 182 257 unsigned i; 183 258 184 /* Sanity check.185 * Check that transport_names[] are indexed on transport type.186 */187 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type ==188 PJSIP_TRANSPORT_UDP, PJSIP_TRANSPORT_UNSPECIFIED);189 190 259 /* Get the transport type for the specified flags. */ 191 260 for (i=0; i<PJ_ARRAY_SIZE(transport_names); ++i) { … … 199 268 } 200 269 270 /* 271 * Get the socket address family of a given transport type. 272 */ 273 PJ_DEF(int) pjsip_transport_type_get_af(pjsip_transport_type_e type) 274 { 275 if (type | PJSIP_TRANSPORT_IPV6) 276 return pj_AF_INET6(); 277 else 278 return pj_AF_INET(); 279 } 280 201 281 PJ_DEF(unsigned) pjsip_transport_get_flag_from_type(pjsip_transport_type_e type) 202 282 { 203 /* Sanity check.204 * Check that transport_names[] are indexed on transport type.205 */206 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type ==207 PJSIP_TRANSPORT_UDP, 0);208 209 /* Check that argument is valid. */210 PJ_ASSERT_RETURN((unsigned)type < PJ_ARRAY_SIZE(transport_names), 0);211 212 283 /* Return transport flag. */ 213 return transport_names[type].flag;284 return get_tpname(type)->flag; 214 285 } 215 286 … … 219 290 PJ_DEF(int) pjsip_transport_get_default_port_for_type(pjsip_transport_type_e type) 220 291 { 221 /* Sanity check.222 * Check that transport_names[] are indexed on transport type.223 */224 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type ==225 PJSIP_TRANSPORT_UDP, 0);226 227 /* Check that argument is valid. */228 PJ_ASSERT_RETURN((unsigned)type < PJ_ARRAY_SIZE(transport_names), 5060);229 230 292 /* Return the port. */ 231 return transport_names[type].port;293 return get_tpname(type)->port; 232 294 } 233 295 … … 237 299 PJ_DEF(const char*) pjsip_transport_get_type_name(pjsip_transport_type_e type) 238 300 { 239 /* Sanity check.240 * Check that transport_names[] are indexed on transport type.241 */ 242 PJ_ASSERT_RETURN(transport_names[PJSIP_TRANSPORT_UDP].type == 243 PJSIP_TRANSPORT_UDP, "Unknown"); 244 245 /* Check that argument is valid.*/246 PJ_ASSERT_RETURN((unsigned)type<PJ_ARRAY_SIZE(transport_names), "Unknown"); 247 248 /* Return the port. */249 return transport_names[type].name.ptr;301 /* Return the name. */ 302 return get_tpname(type)->name.ptr; 303 } 304 305 /* 306 * Get transport description. 307 */ 308 PJ_DEF(const char*) pjsip_transport_get_type_desc(pjsip_transport_type_e type) 309 { 310 /* Return the description. */ 311 return get_tpname(type)->description; 250 312 } 251 313 … … 557 619 pj_memcpy(&tdata->tp_info.dst_addr, addr, addr_len); 558 620 tdata->tp_info.dst_addr_len = addr_len; 559 if (((pj_sockaddr*)addr)->addr.sa_family == pj_AF_INET()) { 560 const char *str_addr; 561 str_addr = pj_inet_ntoa(((pj_sockaddr_in*)addr)->sin_addr); 562 pj_ansi_strcpy(tdata->tp_info.dst_name, str_addr); 563 tdata->tp_info.dst_port = pj_ntohs(((pj_sockaddr_in*)addr)->sin_port); 564 } else { 565 pj_ansi_strcpy(tdata->tp_info.dst_name, "<unknown>"); 566 tdata->tp_info.dst_port = 0; 567 } 621 622 pj_inet_ntop(((pj_sockaddr*)addr)->addr.sa_family, 623 pj_sockaddr_get_addr(addr), 624 tdata->tp_info.dst_name, 625 sizeof(tdata->tp_info.dst_name)); 626 tdata->tp_info.dst_port = pj_sockaddr_get_port(addr); 568 627 569 628 /* Distribute to modules. … … 804 863 tp->obj_name, 805 864 pjsip_transport_get_type_name(tp->key.type), 806 pj_inet_ntoa(((pj_sockaddr_in*)&tp->key.rem_addr)->sin_addr),807 pj_ ntohs(((pj_sockaddr_in*)&tp->key.rem_addr)->sin_port)));865 addr_string(&tp->key.rem_addr), 866 pj_sockaddr_get_port(&tp->key.rem_addr))); 808 867 809 868 return PJ_SUCCESS; … … 1055 1114 } else if ((flag & PJSIP_TRANSPORT_DATAGRAM) != 0) { 1056 1115 1057 pj_sockaddr_in remote; 1116 pj_sockaddr remote; 1117 int addr_len; 1058 1118 pjsip_transport *tp; 1059 1119 1060 pj_sockaddr_in_init(&remote, NULL, 0); 1120 pj_bzero(&remote, sizeof(remote)); 1121 if (type & PJSIP_TRANSPORT_IPV6) { 1122 addr_len = sizeof(pj_sockaddr_in6); 1123 remote.addr.sa_family = pj_AF_INET6(); 1124 } else { 1125 addr_len = sizeof(pj_sockaddr_in); 1126 remote.addr.sa_family = pj_AF_INET(); 1127 } 1128 1061 1129 status = pjsip_tpmgr_acquire_transport(tpmgr, type, &remote, 1062 sizeof(remote), NULL, &tp);1130 addr_len, NULL, &tp); 1063 1131 1064 1132 if (status == PJ_SUCCESS) { … … 1382 1450 TRACE_((THIS_FILE,"Acquiring transport type=%s, remote=%s:%d", 1383 1451 pjsip_transport_get_type_name(type), 1384 pj_inet_ntoa(((pj_sockaddr_in*)remote)->sin_addr),1385 pj_ ntohs(((pj_sockaddr_in*)remote)->sin_port)));1452 addr_string(remote), 1453 pj_sockaddr_get_port(remote))); 1386 1454 1387 1455 pj_lock_acquire(mgr->lock); … … 1463 1531 type == PJSIP_TRANSPORT_LOOP_DGRAM) 1464 1532 { 1465 pj_sockaddr _in *addr = (pj_sockaddr_in*)&key.rem_addr;1466 1467 pj_bzero(addr, sizeof(pj_sockaddr_in));1468 key_len = sizeof(key.type) + sizeof(pj_sockaddr_in);1533 pj_sockaddr *addr = &key.rem_addr; 1534 1535 pj_bzero(addr, addr_len); 1536 key_len = sizeof(key.type) + addr_len; 1469 1537 transport = (pjsip_transport*) 1470 1538 pj_hash_get(mgr->table, &key, key_len, NULL); 1471 1539 } 1472 /* For datagram INETtransports, try lookup with zero address.1540 /* For datagram transports, try lookup with zero address. 1473 1541 */ 1474 else if ((flag & PJSIP_TRANSPORT_DATAGRAM) && 1475 (remote_addr->addr.sa_family == pj_AF_INET())) 1542 else if (flag & PJSIP_TRANSPORT_DATAGRAM) 1476 1543 { 1477 pj_sockaddr _in *addr = (pj_sockaddr_in*)&key.rem_addr;1478 1479 pj_bzero(addr, sizeof(pj_sockaddr_in));1480 addr-> sin_family = pj_AF_INET();1481 1482 key_len = sizeof(key.type) + sizeof(pj_sockaddr_in);1544 pj_sockaddr *addr = &key.rem_addr; 1545 1546 pj_bzero(addr, addr_len); 1547 addr->addr.sa_family = remote_addr->addr.sa_family; 1548 1549 key_len = sizeof(key.type) + addr_len; 1483 1550 transport = (pjsip_transport*) 1484 1551 pj_hash_get(mgr->table, &key, key_len, NULL);
Note: See TracChangeset
for help on using the changeset viewer.