[WIP] Migrate to MNCCv8

This commit is contained in:
Vadim Yanitskiy 2022-11-25 02:43:59 +07:00
parent dfafc1873d
commit bd166ea92d
2 changed files with 42 additions and 12 deletions

39
gsm.cpp
View File

@ -138,10 +138,17 @@ int send_and_free_mncc(struct lcr_gsm *lcr_gsm, unsigned int msg_type, void *dat
void Pgsm::send_mncc_rtp_connect(void)
{
struct gsm_mncc_rtp *nrtp;
struct sockaddr_in *addr;
nrtp = (struct gsm_mncc_rtp *) create_mncc(MNCC_RTP_CONNECT, p_g_callref);
nrtp->ip = p_g_rtp_ip_remote;
nrtp->port = p_g_rtp_port_remote;
addr = reinterpret_cast<struct sockaddr_in *>(&nrtp->addr);
*addr = (struct sockaddr_in) {
.sin_family = AF_INET,
.sin_port = htons(p_g_rtp_port_remote),
.sin_addr = { .s_addr = htonl(p_g_rtp_ip_remote) },
};
switch (p_g_media_type) {
case MEDIA_TYPE_GSM:
nrtp->payload_msg_type = GSM_TCHF_FRAME;
@ -888,17 +895,24 @@ void Pgsm::rtp_create_ind(unsigned int msg_type, unsigned int callref, struct gs
/* send queued setup, as we received remote RTP info */
if (p_g_setup_pending) {
const struct sockaddr_in *addr;
struct lcr_msg *message;
addr = reinterpret_cast<const struct sockaddr_in *>(&rtp->addr);
assert(addr->sin_family == AF_INET); // XXX
message = p_g_setup_pending;
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) forwarding setup\n", rtp->ip, rtp->port);
message->param.setup.rtpinfo.ip = rtp->ip;
message->param.setup.rtpinfo.port = rtp->port;
message->param.setup.rtpinfo.ip = ntohl(addr->sin_addr.s_addr);
message->param.setup.rtpinfo.port = ntohs(addr->sin_port);
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) forwarding setup\n",
message->param.setup.rtpinfo.ip,
message->param.setup.rtpinfo.port);
message_put(message);
p_g_setup_pending = NULL;
}
if (p_g_connect_pending) {
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) connecting RTP... \n", rtp->ip, rtp->port);
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) connecting RTP... \n",
p_g_rtp_ip_remote, p_g_rtp_port_remote);
send_mncc_rtp_connect();
}
}
@ -910,10 +924,17 @@ void Pgsm::rtp_connect_ind(unsigned int msg_type, unsigned int callref, struct g
struct gsm_mncc_rtp *rtp = (struct gsm_mncc_rtp *) mncc;
if (p_g_connect_pending) {
const struct sockaddr_in *addr;
addr = reinterpret_cast<const struct sockaddr_in *>(&rtp->addr);
assert(addr->sin_family == AF_INET); // XXX
message = p_g_connect_pending;
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) forwarding connect\n", rtp->ip, rtp->port);
message->param.connectinfo.rtpinfo.ip = rtp->ip;
message->param.connectinfo.rtpinfo.port = rtp->port;
message->param.connectinfo.rtpinfo.ip = ntohl(addr->sin_addr.s_addr);
message->param.connectinfo.rtpinfo.port = ntohs(addr->sin_port);
PDEBUG(DEBUG_GSM, "Got RTP peer info (%08x,%d) forwarding connect\n",
message->param.connectinfo.rtpinfo.ip,
message->param.connectinfo.rtpinfo.port);
message_put(message);
p_g_connect_pending = NULL;
}

15
mncc.h
View File

@ -1,6 +1,8 @@
#include <stdint.h>
#include <sys/socket.h>
#define MNCC_SETUP_REQ 0x0101
#define MNCC_SETUP_IND 0x0102
#define MNCC_SETUP_RSP 0x0103
@ -85,6 +87,7 @@
#define MNCC_F_CCCAP 0x0800
#define MNCC_F_KEYPAD 0x1000
#define MNCC_F_SIGNAL 0x2000
#define MNCC_F_GCR 0x4000
/* GSM 04.08 Bearer Capability: Information Transfer Capability */
enum gsm48_bcap_itcap {
@ -310,6 +313,12 @@ struct gsm_mncc {
unsigned char lchan_type;
unsigned char lchan_mode;
/* Global Call Reference (encoded as per 3GPP TS 29.205) */
uint8_t gcr[16];
/* A buffer to contain SDP ('\0' terminated) */
char sdp[1024];
};
struct gsm_data_frame {
@ -321,14 +330,14 @@ struct gsm_data_frame {
struct gsm_mncc_rtp {
u_int32_t msg_type;
u_int32_t callref;
u_int32_t ip;
u_int16_t port;
struct sockaddr_storage addr;
u_int32_t payload_type;
u_int32_t payload_msg_type;
char sdp[1024];
};
#define MNCC_SOCK_VERSION 5
#define MNCC_SOCK_VERSION 8
struct gsm_mncc_hello {
uint32_t msg_type;
uint32_t version;