summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-05-28 12:58:57 +0000
committerBenny Prijono <bennylp@teluu.com>2007-05-28 12:58:57 +0000
commit6a45ddbfa87978d32e35656f947e6ef8da9f1faf (patch)
tree9c75638a58fc7178d24aacc01fb1cc88ae5c5c36
parent0b62c939eabed42c3abb87f5ed35dadfed47fc35 (diff)
Fixed ticket #306: Error in SIP transport lookup because of memory alignment problem (thanks Samuel Vinson)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1310 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjsip/include/pjsip/sip_transport.h26
-rw-r--r--pjsip/src/pjsip/sip_transport.c15
2 files changed, 27 insertions, 14 deletions
diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h
index aadd51ea..a86a0319 100644
--- a/pjsip/include/pjsip/sip_transport.h
+++ b/pjsip/include/pjsip/sip_transport.h
@@ -605,8 +605,29 @@ PJ_DECL(pj_status_t) pjsip_tx_data_set_transport(pjsip_tx_data *tdata,
* TRANSPORT
*
*****************************************************************************/
+/**
+ * Type of callback to receive transport operation status.
+ */
typedef void (*pjsip_transport_callback)(pjsip_transport *tp, void *token,
pj_ssize_t sent_bytes);
+
+/**
+ * This structure describes transport key to be registered to hash table.
+ */
+typedef struct pjsip_transport_key
+{
+ /**
+ * Transport type.
+ */
+ long type;
+
+ /**
+ * Destination address.
+ */
+ pj_sockaddr rem_addr;
+
+} pjsip_transport_key;
+
/**
* This structure represent the "public" interface of a SIP transport.
* Applications normally extend this structure to include transport
@@ -623,10 +644,7 @@ struct pjsip_transport
pj_bool_t is_shutdown; /**< Being shutdown? */
/** Key for indexing this transport in hash table. */
- struct {
- pjsip_transport_type_e type; /**< Transport type. */
- pj_sockaddr rem_addr; /**< Remote addr (zero for UDP) */
- } key;
+ pjsip_transport_key key;
char *type_name; /**< Type name. */
unsigned flag; /**< #pjsip_transport_flags_e */
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
index 49afe464..7dcfb711 100644
--- a/pjsip/src/pjsip/sip_transport.c
+++ b/pjsip/src/pjsip/sip_transport.c
@@ -81,12 +81,6 @@ struct pjsip_tpmgr
pj_status_t (*on_tx_msg)(pjsip_endpoint*, pjsip_tx_data*);
};
-/* Key for looking up hash table */
-struct transport_key
-{
- pjsip_transport_type_e type;
- pj_sockaddr addr;
-};
/*****************************************************************************
*
@@ -1351,15 +1345,16 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr,
* specific transport/listener to be used to send message to.
* In this case, lookup the transport from the hash table.
*/
- struct transport_key key;
+ pjsip_transport_key key;
int key_len;
pjsip_transport *transport;
+ pj_bzero(&key, sizeof(key));
key_len = sizeof(key.type) + addr_len;
/* First try to get exact destination. */
key.type = type;
- pj_memcpy(&key.addr, remote, addr_len);
+ pj_memcpy(&key.rem_addr, remote, addr_len);
transport = (pjsip_transport*)
pj_hash_get(mgr->table, &key, key_len, NULL);
@@ -1371,7 +1366,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr,
if (type == PJSIP_TRANSPORT_LOOP ||
type == PJSIP_TRANSPORT_LOOP_DGRAM)
{
- pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr;
+ pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr;
pj_bzero(addr, sizeof(pj_sockaddr_in));
key_len = sizeof(key.type) + sizeof(pj_sockaddr_in);
@@ -1383,7 +1378,7 @@ PJ_DEF(pj_status_t) pjsip_tpmgr_acquire_transport(pjsip_tpmgr *mgr,
else if ((flag & PJSIP_TRANSPORT_DATAGRAM) &&
(remote_addr->addr.sa_family == PJ_AF_INET))
{
- pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.addr;
+ pj_sockaddr_in *addr = (pj_sockaddr_in*)&key.rem_addr;
pj_bzero(addr, sizeof(pj_sockaddr_in));
addr->sin_family = PJ_AF_INET;