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);
+}