FreeCalypso > hg > themwi-system-sw
diff smpp-trx-sa/pdu_out.c @ 222:9d6e8d99d2b1
smpp-trx-sa: new program
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 03 Aug 2023 21:13:41 -0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/smpp-trx-sa/pdu_out.c Thu Aug 03 21:13:41 2023 -0800 @@ -0,0 +1,162 @@ +/* + * This module implements all functions related to sending outgoing PDUs + * to the SMPP server. + */ + +#include <sys/types.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> +#include <unistd.h> + +extern int tcpsock; + +static unsigned req_out_seq = 1; + +static void +pdu_to_tcp(pdu, pdulen) + u_char *pdu; + unsigned pdulen; +{ + int cc; + + cc = write(tcpsock, pdu, pdulen); + if (cc != pdulen) { + perror("write to TCP socket"); + log_fatal_error("error writing to TCP socket"); + exit(1); + } +} + +void +send_bind_req(system_id, password) + char *system_id, *password; +{ + u_char bind_req[64], *dp; + unsigned bind_req_len, slen; + + dp = bind_req + 4; /* length will be filled last */ + /* command_id */ + *dp++ = 0; + *dp++ = 0; + *dp++ = 0; + *dp++ = 0x09; /* bind_transceiver */ + /* empty command_status */ + *dp++ = 0; + *dp++ = 0; + *dp++ = 0; + *dp++ = 0; + /* sequence_number */ + *dp++ = 0; + *dp++ = 0; + *dp++ = 0; + *dp++ = 1; + /* system_id */ + slen = strlen(system_id) + 1; + bcopy(system_id, dp, slen); + dp += slen; + /* password */ + slen = strlen(password) + 1; + bcopy(password, dp, slen); + dp += slen; + /* system_type */ + strcpy(dp, "SMPP"); + dp += 5; + /* interface_version */ + *dp++ = 0x34; + /* addr_ton */ + *dp++ = 0; + /* addr_npi */ + *dp++ = 0; + /* address_range */ + *dp++ = 0; + bind_req_len = dp - bind_req; + bind_req[0] = bind_req_len >> 24; + bind_req[1] = bind_req_len >> 16; + bind_req[2] = bind_req_len >> 8; + bind_req[3] = bind_req_len; + pdu_to_tcp(bind_req, bind_req_len); + log_sent_pdu(bind_req, bind_req_len); +} + +void +send_enq_link_resp(rx_hdr) + u_char *rx_hdr; +{ + u_char resp[16]; + + /* command_length */ + resp[0] = 0; + resp[1] = 0; + resp[2] = 0; + resp[3] = 16; + /* command_id */ + resp[4] = rx_hdr[4] | 0x80; + resp[5] = rx_hdr[5]; + resp[6] = rx_hdr[6]; + resp[7] = rx_hdr[7]; + /* command_status */ + resp[8] = 0; + resp[9] = 0; + resp[10] = 0; + resp[11] = 0; + /* sequence_number */ + resp[12] = rx_hdr[12]; + resp[13] = rx_hdr[13]; + resp[14] = rx_hdr[14]; + resp[15] = rx_hdr[15]; + /* good to go */ + pdu_to_tcp(resp, 16); +} + +void +send_message_resp(rx_hdr) + u_char *rx_hdr; +{ + u_char resp[17]; + + /* command_length */ + resp[0] = 0; + resp[1] = 0; + resp[2] = 0; + resp[3] = 17; + /* command_id */ + resp[4] = rx_hdr[4] | 0x80; + resp[5] = rx_hdr[5]; + resp[6] = rx_hdr[6]; + resp[7] = rx_hdr[7]; + /* command_status */ + resp[8] = 0; + resp[9] = 0; + resp[10] = 0; + resp[11] = 0; + /* sequence_number */ + resp[12] = rx_hdr[12]; + resp[13] = rx_hdr[13]; + resp[14] = rx_hdr[14]; + resp[15] = rx_hdr[15]; + /* empty message_id */ + resp[16] = 0; + /* good to go */ + pdu_to_tcp(resp, 17); + log_sent_pdu(resp, 17); +} + +void +send_pdu_from_localsock(pdu, pdulen) + u_char *pdu; + unsigned pdulen; +{ + /* assign incrementing sequence number */ + req_out_seq++; + if (req_out_seq > 0x7FFFFFFF) + req_out_seq = 1; + pdu[12] = req_out_seq >> 24; + pdu[13] = req_out_seq >> 16; + pdu[14] = req_out_seq >> 8; + pdu[15] = req_out_seq; + /* good to go */ + pdu_to_tcp(pdu, pdulen); + log_sent_pdu(pdu, pdulen); +}