FreeCalypso > hg > themwi-system-sw
annotate sip-in/sip_udp.c @ 169:648a64b2e16b
mgw: accept Themyscira-extension RTP BFI packets
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sat, 19 Nov 2022 23:08:49 -0800 | 
| parents | ff4b76a107a1 | 
| children | 
| rev | line source | 
|---|---|
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * In this module we implement our UDP socket for SIP, | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * and the associated lowest-level protocol handling. | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 */ | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 #include <sys/types.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <sys/socket.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include <netinet/in.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include <stdio.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 #include <stdlib.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 #include <string.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 #include <strings.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 #include <syslog.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 #include <unistd.h> | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 #include "../libsip/parse.h" | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 #include "../libsip/out_msg.h" | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 extern struct in_addr sip_bind_ip; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 extern unsigned sip_bind_port; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 int sip_socket; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 open_sip_udp_socket() | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 struct sockaddr_in sin; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 int rc; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 sip_socket = socket(AF_INET, SOCK_DGRAM, 0); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 if (sip_socket < 0) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 syslog(LOG_CRIT, "socket(AF_INET, SOCK_DGRAM, 0): %m"); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 return(-1); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 sin.sin_family = AF_INET; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 sin.sin_addr = sip_bind_ip; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 sin.sin_port = htons(sip_bind_port); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 rc = bind(sip_socket, (struct sockaddr *) &sin, sizeof sin); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 if (rc < 0) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 syslog(LOG_CRIT, "bind of SIP UDP socket: %m"); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 return(-1); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 update_max_fd(sip_socket); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 return(0); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 void | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 sip_socket_select() | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 struct sip_pkt_rx pkt; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 struct sockaddr_in sin; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 socklen_t addrlen; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 int rc; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 addrlen = sizeof sin; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 rc = recvfrom(sip_socket, pkt.pkt_buffer, MAX_SIP_RX_PACKET, 0, | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 (struct sockaddr *) &sin, &addrlen); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 if (rc <= 0) | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 return; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 pkt.pkt_length = rc; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 log_sip_msg_rx(pkt.pkt_buffer, pkt.pkt_length, &sin); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 rc = parse_incoming_sip_msg(&pkt); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 if (rc < 0) { | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 /* parse errors */ | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 if (rc == -2 && pkt.parse_msgtype == SIP_MSG_TYPE_REQ) | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 syslog(LOG_ERR, | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 "SIP %.16s msg exceeds MAX_HEADER_FIELDS", | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 pkt.req_method); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 else if (rc == -2 && pkt.parse_msgtype == SIP_MSG_TYPE_RESP) | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 syslog(LOG_ERR, | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 "SIP response msg exceeds MAX_HEADER_FIELDS"); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 /* in any case, silently discard */ | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 return; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 /* dispatch good-so-far SIP message */ | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 if (pkt.parse_msgtype == SIP_MSG_TYPE_REQ) | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 process_sip_request(&pkt, &sin); | 
| 82 
ff4b76a107a1
sip-in: process responses as UAC for BYE
 Mychaela Falconia <falcon@freecalypso.org> parents: 
67diff
changeset | 76 else if (pkt.parse_msgtype == SIP_MSG_TYPE_RESP) | 
| 
ff4b76a107a1
sip-in: process responses as UAC for BYE
 Mychaela Falconia <falcon@freecalypso.org> parents: 
67diff
changeset | 77 process_sip_response(&pkt, &sin); | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 } | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 void | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 sip_tx_packet(msg, sin) | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 struct sip_msg_out *msg; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 struct sockaddr_in *sin; | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 { | 
| 67 
15c9e1f8f756
sip-in: enable SIP UDP output
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 85 socklen_t addrlen; | 
| 
15c9e1f8f756
sip-in: enable SIP UDP output
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 86 | 
| 
15c9e1f8f756
sip-in: enable SIP UDP output
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 87 addrlen = sizeof(struct sockaddr_in); | 
| 
15c9e1f8f756
sip-in: enable SIP UDP output
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 88 sendto(sip_socket, msg->buf, msg->msg_len, 0, (struct sockaddr *) sin, | 
| 
15c9e1f8f756
sip-in: enable SIP UDP output
 Mychaela Falconia <falcon@freecalypso.org> parents: 
47diff
changeset | 89 addrlen); | 
| 47 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 log_sip_msg_tx(msg->buf, msg->msg_len, sin); | 
| 
62f39c7cee15
themwi-sip-in skeleton started
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 } | 
