FreeCalypso > hg > themwi-system-sw
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 } |