# HG changeset patch # User Mychaela Falconia # Date 1679075662 28800 # Node ID 1266e024de6c24a6103748777752d26aa57eb723 # Parent 6aecee01cf0afdeef0eff296aa39f5ff2cc64d57 sip-manual-out: implement hunt for IS_Header in Rx RTP diff -r 6aecee01cf0a -r 1266e024de6c sip-manual-out/rtp.c --- a/sip-manual-out/rtp.c Fri Mar 17 01:14:57 2023 -0800 +++ b/sip-manual-out/rtp.c Fri Mar 17 09:54:22 2023 -0800 @@ -27,6 +27,38 @@ static uint16_t rtp_last_seq; static int got_some_rtcp; +static const uint8_t hdr_pattern[20] = {0, 1, 0, 1, 0, 1, 1, 0, 1, 0, + 0, 1, 1, 0, 1, 0, 1, 0, 0, 1}; + +static uint8_t is_hunt_buf[320]; + +static void +reset_is_hunt() +{ + memset(is_hunt_buf, 0xFF, 320); +} + +static void +is_hunt_proc(input, input_pos) + uint8_t *input; + unsigned input_pos; +{ + unsigned offset, n; + + memmove(is_hunt_buf, is_hunt_buf + 16, 304); + memcpy(is_hunt_buf + 304, input, 16); + for (offset = 0; offset < 16; offset++) { + for (n = 0; n < 20; n++) + if ((is_hunt_buf[offset + n*16] & 1) != hdr_pattern[n]) + break; + if (n == 20) + break; + } + if (n == 20) + printf("Found IS_Header, last bit offset %u\n", + input_pos * 16 + offset); +} + void obtain_rtp_endp() { @@ -39,6 +71,7 @@ bcopy(&res.pstn_addr, &rtp_local_addr, sizeof(struct sockaddr_in)); rtp_udp_fd = res.pstn_rtp_fd; rtcp_udp_fd = res.pstn_rtcp_fd; + reset_is_hunt(); } void @@ -50,6 +83,7 @@ int16_t seq_delta; int32_t ts_delta; int rc; + unsigned is_chunk; addrlen = sizeof(struct sockaddr_in); rc = recvfrom(rtp_udp_fd, &pkt, sizeof pkt, 0, @@ -77,6 +111,7 @@ printf("Rx RTP stream changed SSRC\n"); rtp_ssrc_chg_flag = 1; } + reset_is_hunt(); } else if (rtp_start_flag) { seq_delta = ntohs(pkt.seq) - rtp_last_seq; ts_delta = ntohl(pkt.tstamp) - rtp_last_ts; @@ -99,11 +134,13 @@ printf("Rx RTP stream seq break\n"); rtp_seq_brk_flag = 1; } + reset_is_hunt(); } else if (ts_delta != 160) { if (!rtp_ts_brk_flag) { printf("Rx RTP stream tstamp break\n"); rtp_ts_brk_flag = 1; } + reset_is_hunt(); } } rtp_ssrc = pkt.ssrc; @@ -114,6 +151,8 @@ rtp_last_seq, rtp_last_ts); rtp_start_flag = 1; } + for (is_chunk = 0; is_chunk < 10; is_chunk++) + is_hunt_proc(pkt.payload + is_chunk * 16, is_chunk); } void