Changeset 2234 for pjproject/trunk/pjnath/src/pjnath/turn_session.c
- Timestamp:
- Aug 22, 2008 5:46:33 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjnath/src/pjnath/turn_session.c
r2090 r2234 915 915 PJ_DEF(pj_status_t) pj_turn_session_on_rx_pkt(pj_turn_session *sess, 916 916 void *pkt, 917 unsigned pkt_len) 917 unsigned pkt_len, 918 unsigned *parsed_len) 918 919 { 919 920 pj_bool_t is_stun; … … 941 942 options |= PJ_STUN_IS_DATAGRAM; 942 943 status=pj_stun_session_on_rx_pkt(sess->stun, pkt, pkt_len, 943 options, NULL, NULL,944 options, NULL, parsed_len, 944 945 sess->srv_addr, 945 946 pj_sockaddr_get_len(sess->srv_addr)); 946 947 947 } else if (sess->cb.on_rx_data) { 948 949 /* This must be ChannelData. Only makes sense when on_rx_data() is 950 * implemented by application. 951 */ 948 } else { 949 /* This must be ChannelData. */ 952 950 pj_turn_channel_data cd; 953 951 struct peer *peer; 954 952 955 PJ_ASSERT_RETURN(pkt_len >= 4, PJ_ETOOSMALL); 956 957 /* Lookup peer */ 953 if (pkt_len < 4) { 954 if (parsed_len) *parsed_len = 0; 955 return PJ_ETOOSMALL; 956 } 957 958 /* Decode ChannelData packet */ 958 959 pj_memcpy(&cd, pkt, sizeof(pj_turn_channel_data)); 959 960 cd.ch_number = pj_ntohs(cd.ch_number); 960 961 cd.length = pj_ntohs(cd.length); 962 963 /* Check that size is sane */ 964 if (pkt_len < cd.length+sizeof(cd)) { 965 if (parsed_len) { 966 if (is_datagram) { 967 /* Discard the datagram */ 968 *parsed_len = pkt_len; 969 } else { 970 /* Insufficient fragment */ 971 *parsed_len = 0; 972 } 973 } 974 status = PJ_ETOOSMALL; 975 goto on_return; 976 } else { 977 if (parsed_len) { 978 *parsed_len = cd.length + sizeof(cd); 979 } 980 } 981 982 /* Lookup peer */ 961 983 peer = lookup_peer_by_chnum(sess, cd.ch_number); 962 984 if (!peer || !peer->bound) { … … 965 987 } 966 988 967 /* Check that size is correct, for UDP */968 if (pkt_len < cd.length+sizeof(cd)) {969 status = PJ_ETOOSMALL;970 goto on_return;971 }972 973 989 /* Notify application */ 974 (*sess->cb.on_rx_data)(sess, ((pj_uint8_t*)pkt)+sizeof(cd), 975 cd.length, &peer->addr, 976 pj_sockaddr_get_len(&peer->addr)); 977 978 status = PJ_SUCCESS; 979 980 } else { 981 /* This is ChannelData and application doesn't implement 982 * on_rx_data() callback. Just ignore the packet. 983 */ 990 if (sess->cb.on_rx_data) { 991 (*sess->cb.on_rx_data)(sess, ((pj_uint8_t*)pkt)+sizeof(cd), 992 cd.length, &peer->addr, 993 pj_sockaddr_get_len(&peer->addr)); 994 } 995 984 996 status = PJ_SUCCESS; 985 997 } … … 1078 1090 { 1079 1091 const pj_stun_lifetime_attr *lf_attr; 1080 const pj_stun_relay _addr_attr *raddr_attr;1092 const pj_stun_relayed_addr_attr *raddr_attr; 1081 1093 const pj_stun_sockaddr_attr *mapped_attr; 1082 1094 pj_str_t s; … … 1126 1138 * address family. 1127 1139 */ 1128 raddr_attr = (const pj_stun_relay _addr_attr*)1129 pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_RELAY _ADDR, 0);1140 raddr_attr = (const pj_stun_relayed_addr_attr*) 1141 pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_RELAYED_ADDR, 0); 1130 1142 if (raddr_attr == NULL && method==PJ_STUN_ALLOCATE_METHOD) { 1131 1143 on_session_fail(sess, method, PJNATH_EINSTUNMSG, … … 1342 1354 pj_turn_session *sess; 1343 1355 pj_stun_peer_addr_attr *peer_attr; 1356 pj_stun_icmp_attr *icmp; 1344 1357 pj_stun_data_attr *data_attr; 1345 1358 … … 1357 1370 pj_stun_get_method_name(msg->hdr.type))); 1358 1371 return PJ_EINVALIDOP; 1372 } 1373 1374 /* Check if there is ICMP attribute in the message */ 1375 icmp = (pj_stun_icmp_attr*) 1376 pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_ICMP, 0); 1377 if (icmp != NULL) { 1378 /* This is a forwarded ICMP packet. Ignore it for now */ 1379 return PJ_SUCCESS; 1359 1380 } 1360 1381
Note: See TracChangeset
for help on using the changeset viewer.