diff options
Diffstat (limited to 'pjnath/src/pjturn-srv')
-rw-r--r-- | pjnath/src/pjturn-srv/allocation.c | 163 | ||||
-rw-r--r-- | pjnath/src/pjturn-srv/server.c | 74 |
2 files changed, 119 insertions, 118 deletions
diff --git a/pjnath/src/pjturn-srv/allocation.c b/pjnath/src/pjturn-srv/allocation.c index b13f02f1..5310ea5f 100644 --- a/pjnath/src/pjturn-srv/allocation.c +++ b/pjnath/src/pjturn-srv/allocation.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* +/* * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com) * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org> * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "turn.h" #include "auth.h" @@ -62,8 +62,8 @@ static pj_status_t create_relay(pj_turn_srv *srv, const alloc_request *req, pj_turn_relay_res *relay); static void destroy_relay(pj_turn_relay_res *relay); -static void on_rx_from_peer(pj_ioqueue_key_t *key, - pj_ioqueue_op_key_t *op_key, +static void on_rx_from_peer(pj_ioqueue_key_t *key, + pj_ioqueue_op_key_t *op_key, pj_ssize_t bytes_read); static pj_status_t stun_on_send_msg(pj_stun_session *sess, void *token, @@ -124,7 +124,7 @@ static pj_status_t parse_allocate_req(alloc_request *cfg, /* Check if we can satisfy the bandwidth */ if (cfg->bandwidth > MAX_CLIENT_BANDWIDTH) { - pj_stun_session_respond(sess, rdata, + pj_stun_session_respond(sess, rdata, PJ_STUN_SC_ALLOCATION_QUOTA_REACHED, "Invalid bandwidth", NULL, PJ_TRUE, src_addr, src_addr_len); @@ -136,7 +136,7 @@ static pj_status_t parse_allocate_req(alloc_request *cfg, pj_stun_msg_find_attr(req, PJ_STUN_ATTR_REQ_TRANSPORT, 0); if (attr_req_tp == NULL) { pj_stun_session_respond(sess, rdata, PJ_STUN_SC_BAD_REQUEST, - "Missing REQUESTED-TRANSPORT attribute", + "Missing REQUESTED-TRANSPORT attribute", NULL, PJ_TRUE, src_addr, src_addr_len); return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_BAD_REQUEST); } @@ -156,9 +156,9 @@ static pj_status_t parse_allocate_req(alloc_request *cfg, 0); if (attr_res_token) { /* We don't support RESERVATION-TOKEN for now */ - pj_stun_session_respond(sess, rdata, + pj_stun_session_respond(sess, rdata, PJ_STUN_SC_BAD_REQUEST, - "RESERVATION-TOKEN is not supported", NULL, + "RESERVATION-TOKEN is not supported", NULL, PJ_TRUE, src_addr, src_addr_len); return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_BAD_REQUEST); } @@ -170,7 +170,7 @@ static pj_status_t parse_allocate_req(alloc_request *cfg, cfg->lifetime = attr_lifetime->value; if (cfg->lifetime < MIN_LIFETIME) { pj_stun_session_respond(sess, rdata, PJ_STUN_SC_BAD_REQUEST, - "LIFETIME too short", NULL, + "LIFETIME too short", NULL, PJ_TRUE, src_addr, src_addr_len); return PJ_STATUS_FROM_STUN_CODE(PJ_STUN_SC_BAD_REQUEST); } @@ -206,7 +206,7 @@ static pj_status_t send_allocate_response(pj_turn_allocation *alloc, /* Add LIFETIME. */ pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_LIFETIME, + PJ_STUN_ATTR_LIFETIME, (unsigned)alloc->relay.lifetime); /* Add BANDWIDTH */ @@ -222,10 +222,10 @@ static pj_status_t send_allocate_response(pj_turn_allocation *alloc, PJ_STUN_ATTR_XOR_MAPPED_ADDR, PJ_TRUE, &alloc->hkey.clt_addr, pj_sockaddr_get_len(&alloc->hkey.clt_addr)); - + /* Send the response */ return pj_stun_session_send_msg(srv_sess, transport, PJ_TRUE, - PJ_FALSE, &alloc->hkey.clt_addr, + PJ_FALSE, &alloc->hkey.clt_addr, pj_sockaddr_get_len(&alloc->hkey.clt_addr), tdata); } @@ -255,9 +255,9 @@ static pj_status_t init_cred(pj_turn_allocation *alloc, const pj_stun_msg *req) PJ_ASSERT_RETURN(nonce != NULL, PJ_EBUG); /* Lookup the password */ - status = pj_turn_get_password(NULL, NULL, &realm->value, - &user->value, alloc->pool, - &alloc->cred.data.static_cred.data_type, + status = pj_turn_get_password(NULL, NULL, &realm->value, + &user->value, alloc->pool, + &alloc->cred.data.static_cred.data_type, &alloc->cred.data.static_cred.data); if (status != PJ_SUCCESS) return status; @@ -314,7 +314,7 @@ PJ_DEF(pj_status_t) pj_turn_allocation_create(pj_turn_transport *transport, alloc->hkey.tp_type = transport->listener->tp_type; pj_memcpy(&alloc->hkey.clt_addr, src_addr, src_addr_len); - status = pj_lock_create_recursive_mutex(pool, alloc->obj_name, + status = pj_lock_create_recursive_mutex(pool, alloc->obj_name, &alloc->lock); if (status != PJ_SUCCESS) { goto on_error; @@ -327,7 +327,7 @@ PJ_DEF(pj_status_t) pj_turn_allocation_create(pj_turn_transport *transport, alloc->ch_table = pj_hash_create(pool, PEER_TABLE_SIZE); /* Print info */ - pj_ansi_strcpy(alloc->info, + pj_ansi_strcpy(alloc->info, pj_turn_tp_type_name(transport->listener->tp_type)); alloc->info[3] = ':'; pj_sockaddr_print(src_addr, alloc->info+4, sizeof(alloc->info)-4, 3); @@ -371,9 +371,9 @@ PJ_DEF(pj_status_t) pj_turn_allocation_create(pj_turn_transport *transport, goto on_error; /* Done */ - pj_sockaddr_print(&alloc->relay.hkey.addr, str_tmp, + pj_sockaddr_print(&alloc->relay.hkey.addr, str_tmp, sizeof(str_tmp), 3); - PJ_LOG(4,(alloc->obj_name, "Client %s created, relay addr=%s:%s", + PJ_LOG(4,(alloc->obj_name, "Client %s created, relay addr=%s:%s", alloc->info, pj_turn_tp_type_name(req.tp_type), str_tmp)); /* Success */ @@ -383,7 +383,7 @@ PJ_DEF(pj_status_t) pj_turn_allocation_create(pj_turn_transport *transport, on_error: /* Send reply to the ALLOCATE request */ pj_strerror(status, str_tmp, sizeof(str_tmp)); - pj_stun_session_respond(srv_sess, rdata, PJ_STUN_SC_BAD_REQUEST, str_tmp, + pj_stun_session_respond(srv_sess, rdata, PJ_STUN_SC_BAD_REQUEST, str_tmp, transport, PJ_TRUE, src_addr, src_addr_len); /* Cleanup */ @@ -396,7 +396,7 @@ on_error: static void destroy_relay(pj_turn_relay_res *relay) { if (relay->timer.id) { - pj_timer_heap_cancel(relay->allocation->server->core.timer_heap, + pj_timer_heap_cancel(relay->allocation->server->core.timer_heap, &relay->timer); relay->timer.id = PJ_FALSE; } @@ -482,8 +482,8 @@ PJ_DEF(void) pj_turn_allocation_on_transport_closed( pj_turn_allocation *alloc, /* Initiate shutdown sequence for this allocation and start destroy timer. - * Once allocation is marked as shutting down, any packets will be - * rejected/discarded + * Once allocation is marked as shutting down, any packets will be + * rejected/discarded */ static void alloc_shutdown(pj_turn_allocation *alloc) { @@ -501,7 +501,7 @@ static void alloc_shutdown(pj_turn_allocation *alloc) * shutdown request. */ return; - } + } pj_assert(alloc->relay.timer.id == TIMER_ID_NONE); @@ -530,7 +530,7 @@ static pj_status_t resched_timeout(pj_turn_allocation *alloc) pj_assert(alloc->relay.timer.id != TIMER_ID_DESTROY); if (alloc->relay.timer.id != 0) { - pj_timer_heap_cancel(alloc->server->core.timer_heap, + pj_timer_heap_cancel(alloc->server->core.timer_heap, &alloc->relay.timer); alloc->relay.timer.id = TIMER_ID_NONE; } @@ -539,7 +539,7 @@ static pj_status_t resched_timeout(pj_turn_allocation *alloc) delay.msec = 0; alloc->relay.timer.id = TIMER_ID_TIMEOUT; - status = pj_timer_heap_schedule(alloc->server->core.timer_heap, + status = pj_timer_heap_schedule(alloc->server->core.timer_heap, &alloc->relay.timer, &delay); if (status != PJ_SUCCESS) { alloc->relay.timer.id = TIMER_ID_NONE; @@ -565,8 +565,8 @@ static void relay_timeout_cb(pj_timer_heap_t *heap, pj_timer_entry *e) e->id = TIMER_ID_NONE; - PJ_LOG(4,(alloc->obj_name, - "Client %s refresh timed-out, shutting down..", + PJ_LOG(4,(alloc->obj_name, + "Client %s refresh timed-out, shutting down..", alloc->info)); alloc_shutdown(alloc); @@ -574,7 +574,7 @@ static void relay_timeout_cb(pj_timer_heap_t *heap, pj_timer_entry *e) } else if (e->id == TIMER_ID_DESTROY) { e->id = TIMER_ID_NONE; - PJ_LOG(4,(alloc->obj_name, "Client %s destroying..", + PJ_LOG(4,(alloc->obj_name, "Client %s destroying..", alloc->info)); destroy_allocation(alloc); @@ -600,10 +600,10 @@ static pj_status_t create_relay(pj_turn_srv *srv, pj_status_t status; pj_bzero(relay, sizeof(*relay)); - + relay->allocation = alloc; relay->tp.sock = PJ_INVALID_SOCKET; - + /* TODO: get the requested address family from somewhere */ af = alloc->transport->listener->addr.addr.sa_family; @@ -621,10 +621,10 @@ static pj_status_t create_relay(pj_turn_srv *srv, /* Lifetime and timeout */ relay->lifetime = req->lifetime; - pj_timer_entry_init(&relay->timer, TIMER_ID_NONE, relay, + pj_timer_entry_init(&relay->timer, TIMER_ID_NONE, relay, &relay_timeout_cb); resched_timeout(alloc); - + /* Transport type */ relay->hkey.tp_type = req->tp_type; @@ -676,7 +676,7 @@ static pj_status_t create_relay(pj_turn_srv *srv, pj_sockaddr_init(af, &bound_addr, NULL, port); - status = pj_sock_bind(relay->tp.sock, &bound_addr, + status = pj_sock_bind(relay->tp.sock, &bound_addr, pj_sockaddr_get_len(&bound_addr)); if (status == PJ_SUCCESS) break; @@ -684,7 +684,7 @@ static pj_status_t create_relay(pj_turn_srv *srv, if (status != PJ_SUCCESS) { /* Unable to allocate port */ - PJ_LOG(4,(THIS_FILE, "Unable to allocate relay, giving up: err %d", + PJ_LOG(4,(THIS_FILE, "Unable to allocate relay, giving up: err %d", status)); pj_sock_close(relay->tp.sock); relay->tp.sock = PJ_INVALID_SOCKET; @@ -695,14 +695,14 @@ static pj_status_t create_relay(pj_turn_srv *srv, namelen = sizeof(relay->hkey.addr); status = pj_sock_getsockname(relay->tp.sock, &relay->hkey.addr, &namelen); if (status != PJ_SUCCESS) { - PJ_LOG(4,(THIS_FILE, "pj_sock_getsockname() failed: err %d", + PJ_LOG(4,(THIS_FILE, "pj_sock_getsockname() failed: err %d", status)); pj_sock_close(relay->tp.sock); relay->tp.sock = PJ_INVALID_SOCKET; return status; } if (!pj_sockaddr_has_addr(&relay->hkey.addr)) { - pj_sockaddr_copy_addr(&relay->hkey.addr, + pj_sockaddr_copy_addr(&relay->hkey.addr, &alloc->transport->listener->addr); } if (!pj_sockaddr_has_addr(&relay->hkey.addr)) { @@ -718,7 +718,7 @@ static pj_status_t create_relay(pj_turn_srv *srv, status = pj_ioqueue_register_sock(pool, srv->core.ioqueue, relay->tp.sock, relay, &icb, &relay->tp.key); if (status != PJ_SUCCESS) { - PJ_LOG(4,(THIS_FILE, "pj_ioqueue_register_sock() failed: err %d", + PJ_LOG(4,(THIS_FILE, "pj_ioqueue_register_sock() failed: err %d", status)); pj_sock_close(relay->tp.sock); relay->tp.sock = PJ_INVALID_SOCKET; @@ -736,12 +736,12 @@ static pj_status_t create_relay(pj_turn_srv *srv, /* Create and send error response */ static void send_reply_err(pj_turn_allocation *alloc, const pj_stun_rx_data *rdata, - pj_bool_t cache, + pj_bool_t cache, int code, const char *errmsg) { pj_status_t status; - status = pj_stun_session_respond(alloc->sess, rdata, code, errmsg, NULL, + status = pj_stun_session_respond(alloc->sess, rdata, code, errmsg, NULL, cache, &alloc->hkey.clt_addr, pj_sockaddr_get_len(&alloc->hkey.clt_addr.addr)); if (status != PJ_SUCCESS) { @@ -786,9 +786,9 @@ static void send_reply_ok(pj_turn_allocation *alloc, } } - status = pj_stun_session_send_msg(alloc->sess, NULL, PJ_TRUE, - PJ_FALSE, &alloc->hkey.clt_addr, - pj_sockaddr_get_len(&alloc->hkey.clt_addr), + status = pj_stun_session_send_msg(alloc->sess, NULL, PJ_TRUE, + PJ_FALSE, &alloc->hkey.clt_addr, + pj_sockaddr_get_len(&alloc->hkey.clt_addr), tdata); if (status != PJ_SUCCESS) { alloc_err(alloc, "Error sending STUN success response", status); @@ -806,7 +806,7 @@ static pj_turn_permission *create_permission(pj_turn_allocation *alloc, perm = PJ_POOL_ZALLOC_T(alloc->pool, pj_turn_permission); pj_memcpy(&perm->hkey.peer_addr, peer_addr, addr_len); - + perm->allocation = alloc; perm->channel = PJ_TURN_INVALID_CHANNEL; @@ -814,8 +814,8 @@ static pj_turn_permission *create_permission(pj_turn_allocation *alloc, perm->expiry.sec += PJ_TURN_PERM_TIMEOUT; /* Register to hash table (only the address part!) */ - pj_hash_set(alloc->pool, alloc->peer_table, - pj_sockaddr_get_addr(&perm->hkey.peer_addr), + pj_hash_set(alloc->pool, alloc->peer_table, + pj_sockaddr_get_addr(&perm->hkey.peer_addr), pj_sockaddr_get_addr_len(&perm->hkey.peer_addr), 0, perm); return perm; @@ -834,13 +834,13 @@ static pj_turn_permission *check_permission_expiry(pj_turn_permission *perm) } /* Remove from permission hash table */ - pj_hash_set(NULL, alloc->peer_table, - pj_sockaddr_get_addr(&perm->hkey.peer_addr), + pj_hash_set(NULL, alloc->peer_table, + pj_sockaddr_get_addr(&perm->hkey.peer_addr), pj_sockaddr_get_addr_len(&perm->hkey.peer_addr), 0, NULL); /* Remove from channel hash table, if assigned a channel number */ if (perm->channel != PJ_TURN_INVALID_CHANNEL) { - pj_hash_set(NULL, alloc->ch_table, &perm->channel, + pj_hash_set(NULL, alloc->ch_table, &perm->channel, sizeof(perm->channel), 0, NULL); } @@ -858,10 +858,10 @@ lookup_permission_by_addr(pj_turn_allocation *alloc, PJ_UNUSED_ARG(addr_len); /* Lookup in peer hash table */ - perm = (pj_turn_permission*) - pj_hash_get(alloc->peer_table, + perm = (pj_turn_permission*) + pj_hash_get(alloc->peer_table, pj_sockaddr_get_addr(peer_addr), - pj_sockaddr_get_addr_len(peer_addr), + pj_sockaddr_get_addr_len(peer_addr), NULL); return perm ? check_permission_expiry(perm) : NULL; } @@ -880,7 +880,7 @@ lookup_permission_by_chnum(pj_turn_allocation *alloc, return perm ? check_permission_expiry(perm) : NULL; } -/* Update permission because of data from client to peer. +/* Update permission because of data from client to peer. * Return PJ_TRUE is permission is found. */ static pj_bool_t refresh_permission(pj_turn_permission *perm) @@ -916,7 +916,7 @@ PJ_DEF(void) pj_turn_allocation_on_rx_client_pkt(pj_turn_allocation *alloc, * our stun_on_rx_request() or stun_on_rx_indication() * callbacks. * - * Note: currently it is necessary to specify the + * Note: currently it is necessary to specify the * PJ_STUN_NO_FINGERPRINT_CHECK otherwise the FINGERPRINT * attribute inside STUN Send Indication message will mess up * with fingerprint checking. @@ -929,7 +929,7 @@ PJ_DEF(void) pj_turn_allocation_on_rx_client_pkt(pj_turn_allocation *alloc, status = pj_stun_session_on_rx_pkt(alloc->sess, pkt->pkt, pkt->len, options, NULL, &parsed_len, - &pkt->src.clt_addr, + &pkt->src.clt_addr, pkt->src_addr_len); if (pkt->transport->listener->tp_type == PJ_TURN_TP_UDP) { @@ -962,7 +962,7 @@ PJ_DEF(void) pj_turn_allocation_on_rx_client_pkt(pj_turn_allocation *alloc, /* For UDP check the packet length */ if (alloc->transport->listener->tp_type == PJ_TURN_TP_UDP) { if (pkt->len < pj_ntohs(cd->length)+sizeof(*cd)) { - PJ_LOG(4,(alloc->obj_name, + PJ_LOG(4,(alloc->obj_name, "ChannelData from %s discarded: UDP size error", alloc->info)); goto on_return; @@ -975,7 +975,7 @@ PJ_DEF(void) pj_turn_allocation_on_rx_client_pkt(pj_turn_allocation *alloc, perm = lookup_permission_by_chnum(alloc, pj_ntohs(cd->ch_number)); if (!perm) { /* Discard */ - PJ_LOG(4,(alloc->obj_name, + PJ_LOG(4,(alloc->obj_name, "ChannelData from %s discarded: ch#0x%x not found", alloc->info, pj_ntohs(cd->ch_number))); goto on_return; @@ -998,7 +998,7 @@ on_return: /* - * Handle incoming packet from peer. This function is called by + * Handle incoming packet from peer. This function is called by * on_rx_from_peer(). */ static void handle_peer_pkt(pj_turn_allocation *alloc, @@ -1009,7 +1009,7 @@ static void handle_peer_pkt(pj_turn_allocation *alloc, pj_turn_permission *perm; /* Lookup permission */ - perm = lookup_permission_by_addr(alloc, src_addr, + perm = lookup_permission_by_addr(alloc, src_addr, pj_sockaddr_get_len(src_addr)); if (perm == NULL) { /* No permission, discard data */ @@ -1049,23 +1049,23 @@ static void handle_peer_pkt(pj_turn_allocation *alloc, pj_stun_tx_data *tdata; pj_status_t status; - status = pj_stun_session_create_ind(alloc->sess, + status = pj_stun_session_create_ind(alloc->sess, PJ_STUN_DATA_INDICATION, &tdata); if (status != PJ_SUCCESS) { alloc_err(alloc, "Error creating Data indication", status); return; } - pj_stun_msg_add_sockaddr_attr(tdata->pool, tdata->msg, + pj_stun_msg_add_sockaddr_attr(tdata->pool, tdata->msg, PJ_STUN_ATTR_XOR_PEER_ADDR, PJ_TRUE, src_addr, pj_sockaddr_get_len(src_addr)); pj_stun_msg_add_binary_attr(tdata->pool, tdata->msg, - PJ_STUN_ATTR_DATA, + PJ_STUN_ATTR_DATA, (const pj_uint8_t*)pkt, len); - pj_stun_session_send_msg(alloc->sess, NULL, PJ_FALSE, - PJ_FALSE, &alloc->hkey.clt_addr, - pj_sockaddr_get_len(&alloc->hkey.clt_addr), + pj_stun_session_send_msg(alloc->sess, NULL, PJ_FALSE, + PJ_FALSE, &alloc->hkey.clt_addr, + pj_sockaddr_get_len(&alloc->hkey.clt_addr), tdata); } } @@ -1073,8 +1073,8 @@ static void handle_peer_pkt(pj_turn_allocation *alloc, /* * ioqueue notification on RX packets from the relay socket. */ -static void on_rx_from_peer(pj_ioqueue_key_t *key, - pj_ioqueue_op_key_t *op_key, +static void on_rx_from_peer(pj_ioqueue_key_t *key, + pj_ioqueue_op_key_t *op_key, pj_ssize_t bytes_read) { pj_turn_relay_res *rel; @@ -1096,7 +1096,7 @@ static void on_rx_from_peer(pj_ioqueue_key_t *key, rel->tp.src_addr_len = sizeof(rel->tp.src_addr); status = pj_ioqueue_recvfrom(key, op_key, rel->tp.rx_pkt, &bytes_read, 0, - &rel->tp.src_addr, + &rel->tp.src_addr, &rel->tp.src_addr_len); if (status != PJ_EPENDING && status != PJ_SUCCESS) @@ -1156,14 +1156,14 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, /* Refuse to serve any request if we've been shutdown */ if (alloc->relay.lifetime == 0) { /* Reject with 437 if we're shutting down */ - send_reply_err(alloc, rdata, PJ_TRUE, + send_reply_err(alloc, rdata, PJ_TRUE, PJ_STUN_SC_ALLOCATION_MISMATCH, NULL); return PJ_SUCCESS; } if (msg->hdr.type == PJ_STUN_REFRESH_REQUEST) { - /* - * Handle REFRESH request + /* + * Handle REFRESH request */ pj_stun_lifetime_attr *lifetime; pj_stun_bandwidth_attr *bandwidth; @@ -1176,6 +1176,9 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, bandwidth = (pj_stun_bandwidth_attr*) pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_BANDWIDTH, 0); + /* TODO: process bandwidth */ + PJ_UNUSED_ARG(bandwidth); + if (lifetime && lifetime->value==0) { /* * This is deallocation request. @@ -1186,7 +1189,7 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, send_reply_ok(alloc, rdata); /* Shutdown allocation */ - PJ_LOG(4,(alloc->obj_name, + PJ_LOG(4,(alloc->obj_name, "Client %s request to dealloc, shutting down", alloc->info)); @@ -1196,7 +1199,7 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, /* * This is a refresh request. */ - + /* Update lifetime */ if (lifetime) { alloc->relay.lifetime = lifetime->value; @@ -1226,7 +1229,7 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_XOR_PEER_ADDR, 0); if (!ch_attr || !peer_attr) { - send_reply_err(alloc, rdata, PJ_TRUE, + send_reply_err(alloc, rdata, PJ_TRUE, PJ_STUN_SC_BAD_REQUEST, NULL); return PJ_SUCCESS; } @@ -1234,14 +1237,14 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, /* Find permission with the channel number */ p1 = lookup_permission_by_chnum(alloc, PJ_STUN_GET_CH_NB(ch_attr->value)); - /* If permission is found, this is supposed to be a channel bind + /* If permission is found, this is supposed to be a channel bind * refresh. Make sure it's for the same peer. */ if (p1) { if (pj_sockaddr_cmp(&p1->hkey.peer_addr, &peer_attr->sockaddr)) { /* Address mismatch. Send 400 */ - send_reply_err(alloc, rdata, PJ_TRUE, - PJ_STUN_SC_BAD_REQUEST, + send_reply_err(alloc, rdata, PJ_TRUE, + PJ_STUN_SC_BAD_REQUEST, "Peer address mismatch"); return PJ_SUCCESS; } @@ -1262,7 +1265,7 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, p2 = lookup_permission_by_addr(alloc, &peer_attr->sockaddr, pj_sockaddr_get_len(&peer_attr->sockaddr)); if (p2 && p2->channel != PJ_TURN_INVALID_CHANNEL) { - send_reply_err(alloc, rdata, PJ_TRUE, PJ_STUN_SC_BAD_REQUEST, + send_reply_err(alloc, rdata, PJ_TRUE, PJ_STUN_SC_BAD_REQUEST, "Peer address already assigned a channel number"); return PJ_SUCCESS; } @@ -1280,7 +1283,7 @@ static pj_status_t stun_on_rx_request(pj_stun_session *sess, /* Register to hash table */ pj_assert(sizeof(p2->channel==2)); - pj_hash_set(alloc->pool, alloc->ch_table, &p2->channel, + pj_hash_set(alloc->pool, alloc->ch_table, &p2->channel, sizeof(p2->channel), 0, p2); /* Update */ @@ -1367,7 +1370,7 @@ static pj_status_t stun_on_rx_indication(pj_stun_session *sess, /* Relay the data to peer */ len = data_attr->length; - pj_sock_sendto(alloc->relay.tp.sock, data_attr->data, + pj_sock_sendto(alloc->relay.tp.sock, data_attr->data, &len, 0, &peer_attr->sockaddr, pj_sockaddr_get_len(&peer_attr->sockaddr)); diff --git a/pjnath/src/pjturn-srv/server.c b/pjnath/src/pjturn-srv/server.c index f53243d5..94dda29a 100644 --- a/pjnath/src/pjturn-srv/server.c +++ b/pjnath/src/pjturn-srv/server.c @@ -1,5 +1,5 @@ /* $Id$ */ -/* +/* * Copyright (C) 2008-2011 Teluu Inc. (http://www.teluu.com) * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org> * @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include "turn.h" #include "auth.h" @@ -76,7 +76,7 @@ PJ_DEF(const char*) pj_turn_tp_type_name(int tp_type) /* * Create server. */ -PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, +PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, pj_turn_srv **p_srv) { pj_pool_t *pool; @@ -94,14 +94,14 @@ PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, srv->core.pf = pf; srv->core.pool = pool; srv->core.tls_key = srv->core.tls_data = -1; - + /* Create ioqueue */ status = pj_ioqueue_create(pool, MAX_HANDLES, &srv->core.ioqueue); if (status != PJ_SUCCESS) goto on_error; /* Server mutex */ - status = pj_lock_create_recursive_mutex(pool, srv->obj_name, + status = pj_lock_create_recursive_mutex(pool, srv->obj_name, &srv->core.lock); if (status != PJ_SUCCESS) goto on_error; @@ -114,7 +114,7 @@ PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, status = pj_thread_local_alloc(&srv->core.tls_data); if (status != PJ_SUCCESS) goto on_error; - + /* Create timer heap */ status = pj_timer_heap_create(pool, MAX_TIMER, &srv->core.timer_heap); if (status != PJ_SUCCESS) @@ -125,7 +125,7 @@ PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, /* Array of listeners */ srv->core.listener = (pj_turn_listener**) - pj_pool_calloc(pool, MAX_LISTENERS, + pj_pool_calloc(pool, MAX_LISTENERS, sizeof(srv->core.listener[0])); /* Create hash tables */ @@ -169,19 +169,19 @@ PJ_DEF(pj_status_t) pj_turn_srv_create(pj_pool_factory *pf, /* Array of worker threads */ srv->core.thread_cnt = MAX_THREADS; srv->core.thread = (pj_thread_t**) - pj_pool_calloc(pool, srv->core.thread_cnt, + pj_pool_calloc(pool, srv->core.thread_cnt, sizeof(pj_thread_t*)); /* Start the worker threads */ for (i=0; i<srv->core.thread_cnt; ++i) { - status = pj_thread_create(pool, srv->obj_name, &server_thread_proc, + status = pj_thread_create(pool, srv->obj_name, &server_thread_proc, srv, 0, 0, &srv->core.thread[i]); if (status != PJ_SUCCESS) goto on_error; } /* We're done. Application should add listeners now */ - PJ_LOG(4,(srv->obj_name, "TURN server v%s is running", + PJ_LOG(4,(srv->obj_name, "TURN server v%s is running", pj_get_version())); *p_srv = srv; @@ -193,8 +193,8 @@ on_error: } -/* - * Handle timer and network events +/* + * Handle timer and network events */ static void srv_handle_events(pj_turn_srv *srv, const pj_time_val *max_timeout) { @@ -203,8 +203,8 @@ static void srv_handle_events(pj_turn_srv *srv, const pj_time_val *max_timeout) unsigned net_event_count = 0; int c; - /* Poll the timer. The timer heap has its own mutex for better - * granularity, so we don't need to lock the server. + /* Poll the timer. The timer heap has its own mutex for better + * granularity, so we don't need to lock the server. */ timeout.sec = timeout.msec = 0; c = pj_timer_heap_poll( srv->core.timer_heap, &timeout ); @@ -222,7 +222,7 @@ static void srv_handle_events(pj_turn_srv *srv, const pj_time_val *max_timeout) timeout = *max_timeout; } - /* Poll ioqueue. + /* Poll ioqueue. * Repeat polling the ioqueue while we have immediate events, because * timer heap may process more than one events, so if we only process * one network events at a time (such as when IOCP backend is used), @@ -292,7 +292,7 @@ PJ_DEF(pj_status_t) pj_turn_srv_destroy(pj_turn_srv *srv) it = next; } } - + /* Destroy all listeners. */ for (i=0; i<srv->core.lis_cnt; ++i) { if (srv->core.listener[i]) { @@ -312,7 +312,7 @@ PJ_DEF(pj_status_t) pj_turn_srv_destroy(pj_turn_srv *srv) srv->tables.alloc = NULL; srv->tables.res = NULL; } - + /* Destroy timer heap */ if (srv->core.timer_heap) { pj_timer_heap_destroy(srv->core.timer_heap); @@ -460,7 +460,7 @@ PJ_DEF(pj_status_t) pj_turn_srv_unregister_allocation(pj_turn_srv *srv, } -/* Callback from our own STUN session whenever it needs to send +/* Callback from our own STUN session whenever it needs to send * outgoing STUN packet. */ static pj_status_t on_tx_stun_msg( pj_stun_session *sess, @@ -471,24 +471,24 @@ static pj_status_t on_tx_stun_msg( pj_stun_session *sess, unsigned addr_len) { pj_turn_transport *transport = (pj_turn_transport*) token; - + PJ_ASSERT_RETURN(transport!=NULL, PJ_EINVALIDOP); PJ_UNUSED_ARG(sess); - return transport->sendto(transport, pdu, pdu_size, 0, + return transport->sendto(transport, pdu, pdu_size, 0, dst_addr, addr_len); } /* Respond to STUN request */ -static pj_status_t stun_respond(pj_stun_session *sess, +static pj_status_t stun_respond(pj_stun_session *sess, pj_turn_transport *transport, const pj_stun_rx_data *rdata, - unsigned code, + unsigned code, const char *errmsg, - pj_bool_t cache, - const pj_sockaddr_t *dst_addr, + pj_bool_t cache, + const pj_sockaddr_t *dst_addr, unsigned addr_len) { pj_status_t status; @@ -496,14 +496,14 @@ static pj_status_t stun_respond(pj_stun_session *sess, pj_stun_tx_data *tdata; /* Create response */ - status = pj_stun_session_create_res(sess, rdata, code, + status = pj_stun_session_create_res(sess, rdata, code, (errmsg?pj_cstr(&reason,errmsg):NULL), &tdata); if (status != PJ_SUCCESS) return status; /* Send the response */ - return pj_stun_session_send_msg(sess, transport, cache, PJ_FALSE, + return pj_stun_session_send_msg(sess, transport, cache, PJ_FALSE, dst_addr, addr_len, tdata); } @@ -522,7 +522,6 @@ static pj_status_t on_rx_stun_request(pj_stun_session *sess, { pj_turn_transport *transport; const pj_stun_msg *msg = rdata->msg; - pj_turn_srv *srv; pj_turn_allocation *alloc; pj_status_t status; @@ -530,7 +529,6 @@ static pj_status_t on_rx_stun_request(pj_stun_session *sess, PJ_UNUSED_ARG(pdu_len); transport = (pj_turn_transport*) token; - srv = transport->listener->server; /* Respond any requests other than ALLOCATE with 437 response */ if (msg->hdr.type != PJ_STUN_ALLOCATE_REQUEST) { @@ -569,13 +567,13 @@ static void handle_binding_request(pj_turn_pkt *pkt, return; /* Create response */ - status = pj_stun_msg_create_response(pkt->pool, request, 0, NULL, + status = pj_stun_msg_create_response(pkt->pool, request, 0, NULL, &response); if (status != PJ_SUCCESS) return; /* Add XOR-MAPPED-ADDRESS */ - pj_stun_msg_add_sockaddr_attr(pkt->pool, response, + pj_stun_msg_add_sockaddr_attr(pkt->pool, response, PJ_STUN_ATTR_XOR_MAPPED_ADDR, PJ_TRUE, &pkt->src.clt_addr, @@ -587,7 +585,7 @@ static void handle_binding_request(pj_turn_pkt *pkt, return; /* Send response */ - pkt->transport->sendto(pkt->transport, pdu, len, 0, + pkt->transport->sendto(pkt->transport, pdu, len, 0, &pkt->src.clt_addr, pkt->src_addr_len); } @@ -598,7 +596,7 @@ static void handle_binding_request(pj_turn_pkt *pkt, * is found for the client address, or handed over to owned STUN session * if an allocation is not found. */ -PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, +PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, pj_turn_pkt *pkt) { pj_turn_allocation *alloc; @@ -638,7 +636,7 @@ PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, */ if ((*pkt->pkt != 0x00 && *pkt->pkt != 0x01) || pkt->len > 1600 || - (options & PJ_STUN_IS_DATAGRAM)) + (options & PJ_STUN_IS_DATAGRAM)) { char errmsg[PJ_ERR_MSG_SIZE]; char ip[PJ_INET6_ADDRSTRLEN+10]; @@ -646,7 +644,7 @@ PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, pkt->len = 0; pj_strerror(status, errmsg, sizeof(errmsg)); - PJ_LOG(5,(srv->obj_name, + PJ_LOG(5,(srv->obj_name, "Non-STUN packet from %s is dropped: %s", pj_sockaddr_print(&pkt->src.clt_addr, ip, sizeof(ip), 3), errmsg)); @@ -654,7 +652,7 @@ PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, return; } - /* Special handling for Binding Request. We won't give it to the + /* Special handling for Binding Request. We won't give it to the * STUN session since this request is not authenticated. */ if (pkt->pkt[1] == 1) { @@ -668,16 +666,16 @@ PJ_DEF(void) pj_turn_srv_on_rx_pkt(pj_turn_srv *srv, */ options &= ~PJ_STUN_CHECK_PACKET; parsed_len = 0; - status = pj_stun_session_on_rx_pkt(srv->core.stun_sess, pkt->pkt, + status = pj_stun_session_on_rx_pkt(srv->core.stun_sess, pkt->pkt, pkt->len, options, pkt->transport, - &parsed_len, &pkt->src.clt_addr, + &parsed_len, &pkt->src.clt_addr, pkt->src_addr_len); if (status != PJ_SUCCESS) { char errmsg[PJ_ERR_MSG_SIZE]; char ip[PJ_INET6_ADDRSTRLEN+10]; pj_strerror(status, errmsg, sizeof(errmsg)); - PJ_LOG(5,(srv->obj_name, + PJ_LOG(5,(srv->obj_name, "Error processing STUN packet from %s: %s", pj_sockaddr_print(&pkt->src.clt_addr, ip, sizeof(ip), 3), errmsg)); |