comparison 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
comparison
equal deleted inserted replaced
221:e1d7db9d734c 222:9d6e8d99d2b1
1 /*
2 * This module implements all functions related to sending outgoing PDUs
3 * to the SMPP server.
4 */
5
6 #include <sys/types.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <string.h>
10 #include <strings.h>
11 #include <unistd.h>
12
13 extern int tcpsock;
14
15 static unsigned req_out_seq = 1;
16
17 static void
18 pdu_to_tcp(pdu, pdulen)
19 u_char *pdu;
20 unsigned pdulen;
21 {
22 int cc;
23
24 cc = write(tcpsock, pdu, pdulen);
25 if (cc != pdulen) {
26 perror("write to TCP socket");
27 log_fatal_error("error writing to TCP socket");
28 exit(1);
29 }
30 }
31
32 void
33 send_bind_req(system_id, password)
34 char *system_id, *password;
35 {
36 u_char bind_req[64], *dp;
37 unsigned bind_req_len, slen;
38
39 dp = bind_req + 4; /* length will be filled last */
40 /* command_id */
41 *dp++ = 0;
42 *dp++ = 0;
43 *dp++ = 0;
44 *dp++ = 0x09; /* bind_transceiver */
45 /* empty command_status */
46 *dp++ = 0;
47 *dp++ = 0;
48 *dp++ = 0;
49 *dp++ = 0;
50 /* sequence_number */
51 *dp++ = 0;
52 *dp++ = 0;
53 *dp++ = 0;
54 *dp++ = 1;
55 /* system_id */
56 slen = strlen(system_id) + 1;
57 bcopy(system_id, dp, slen);
58 dp += slen;
59 /* password */
60 slen = strlen(password) + 1;
61 bcopy(password, dp, slen);
62 dp += slen;
63 /* system_type */
64 strcpy(dp, "SMPP");
65 dp += 5;
66 /* interface_version */
67 *dp++ = 0x34;
68 /* addr_ton */
69 *dp++ = 0;
70 /* addr_npi */
71 *dp++ = 0;
72 /* address_range */
73 *dp++ = 0;
74 bind_req_len = dp - bind_req;
75 bind_req[0] = bind_req_len >> 24;
76 bind_req[1] = bind_req_len >> 16;
77 bind_req[2] = bind_req_len >> 8;
78 bind_req[3] = bind_req_len;
79 pdu_to_tcp(bind_req, bind_req_len);
80 log_sent_pdu(bind_req, bind_req_len);
81 }
82
83 void
84 send_enq_link_resp(rx_hdr)
85 u_char *rx_hdr;
86 {
87 u_char resp[16];
88
89 /* command_length */
90 resp[0] = 0;
91 resp[1] = 0;
92 resp[2] = 0;
93 resp[3] = 16;
94 /* command_id */
95 resp[4] = rx_hdr[4] | 0x80;
96 resp[5] = rx_hdr[5];
97 resp[6] = rx_hdr[6];
98 resp[7] = rx_hdr[7];
99 /* command_status */
100 resp[8] = 0;
101 resp[9] = 0;
102 resp[10] = 0;
103 resp[11] = 0;
104 /* sequence_number */
105 resp[12] = rx_hdr[12];
106 resp[13] = rx_hdr[13];
107 resp[14] = rx_hdr[14];
108 resp[15] = rx_hdr[15];
109 /* good to go */
110 pdu_to_tcp(resp, 16);
111 }
112
113 void
114 send_message_resp(rx_hdr)
115 u_char *rx_hdr;
116 {
117 u_char resp[17];
118
119 /* command_length */
120 resp[0] = 0;
121 resp[1] = 0;
122 resp[2] = 0;
123 resp[3] = 17;
124 /* command_id */
125 resp[4] = rx_hdr[4] | 0x80;
126 resp[5] = rx_hdr[5];
127 resp[6] = rx_hdr[6];
128 resp[7] = rx_hdr[7];
129 /* command_status */
130 resp[8] = 0;
131 resp[9] = 0;
132 resp[10] = 0;
133 resp[11] = 0;
134 /* sequence_number */
135 resp[12] = rx_hdr[12];
136 resp[13] = rx_hdr[13];
137 resp[14] = rx_hdr[14];
138 resp[15] = rx_hdr[15];
139 /* empty message_id */
140 resp[16] = 0;
141 /* good to go */
142 pdu_to_tcp(resp, 17);
143 log_sent_pdu(resp, 17);
144 }
145
146 void
147 send_pdu_from_localsock(pdu, pdulen)
148 u_char *pdu;
149 unsigned pdulen;
150 {
151 /* assign incrementing sequence number */
152 req_out_seq++;
153 if (req_out_seq > 0x7FFFFFFF)
154 req_out_seq = 1;
155 pdu[12] = req_out_seq >> 24;
156 pdu[13] = req_out_seq >> 16;
157 pdu[14] = req_out_seq >> 8;
158 pdu[15] = req_out_seq;
159 /* good to go */
160 pdu_to_tcp(pdu, pdulen);
161 log_sent_pdu(pdu, pdulen);
162 }