1 /*
2 * Copyright (C) 2006 Raul Tremsal
3 * File : smpp34_dumpPdu.c
4 * Author: Raul Tremsal <ultraismo@yahoo.com>
5 *
6 * This file is part of libsmpp34 (c-open-smpp3.4 library).
7 *
8 * The libsmpp34 library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License as
10 * published by the Free Software Foundation; either version 2.1 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 * License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this library; if not, write to the Free Software Foundation,
20 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <sys/types.h>
27 #include <netinet/in.h>
28
29 #ifdef __linux__
30 #include <stdint.h>
31 #endif
32
33 #include "smpp34.h"
34 #include "smpp34_structs.h"
35 #include "smpp34_params.h"
36
37 /* GLOBALS ********************************************************************/
38 /* EXTERN *********************************************************************/
39 extern int smpp34_errno;
40 extern char smpp34_strerror[2048];
41 extern char *ptrerror;
42
43 /* FUNCTIONS ******************************************************************/
44 int
smpp34_dumpPdu(uint32_t type,uint8_t * dest,int size_dest,void * tt)45 smpp34_dumpPdu(uint32_t type, uint8_t *dest, int size_dest, void* tt)
46 {
47
48 char dummy_b[SMALL_BUFF];
49 int left = size_dest;
50 int lenval = 0;
51 uint8_t l_dest[512];
52 int lefterror = 0;
53
54 memset(smpp34_strerror, 0, sizeof(smpp34_strerror));
55 ptrerror = smpp34_strerror;
56 lefterror = sizeof(smpp34_strerror);
57 memset(l_dest, 0, sizeof(l_dest));
58
59
60 #define instancia t1->
61
62 #define U32( inst, par, _str ){\
63 _str(inst par, dummy_b);\
64 if( strcmp( dummy_b, "" ) == 0 ){\
65 PUTLOG("[%s:%08X(%s)]", par, inst par, "Value is invalid");\
66 } else {\
67 PUTLOG("[%s:%08X(%s)]", par, inst par, "OK");\
68 };\
69 lenval = snprintf((char*)l_dest, sizeof(l_dest), "%-30s[%08X] - [%s]\n",\
70 #par,inst par,dummy_b);\
71 if( lenval >= left ){\
72 PUTLOG("[%s:%08X(%s)]", par, inst par,\
73 "Value lenght exceed buffer lenght");\
74 return( -1 );\
75 };\
76 snprintf((char*)dest, left, "%s", l_dest);\
77 left -= lenval; dest += lenval;\
78 }
79
80 #define U16( inst, par, _str ){\
81 _str(inst par, dummy_b);\
82 if( strcmp( dummy_b, "" ) == 0 ){\
83 PUTLOG("[%s:%04X(%s)]", par, inst par, "Value is invalid");\
84 } else {\
85 PUTLOG("[%s:%04X(%s)]", par, inst par, "OK");\
86 };\
87 lenval = snprintf((char*)l_dest, sizeof(l_dest),\
88 "%-30s[%04X] [%s]\n",#par,inst par,dummy_b);\
89 if( lenval >= left ){\
90 PUTLOG("[%s:%04X(%s)]", par, inst par,\
91 "Value lenght exceed buffer lenght");\
92 return( -1 );\
93 };\
94 snprintf((char*)dest, left, "%s", l_dest);\
95 left -= (uint8_t)lenval; dest += (uint8_t) lenval;\
96 }
97
98 #define U08( inst, par, _str ){\
99 _str(inst par, dummy_b);\
100 if( strcmp( dummy_b, "" ) == 0 ){\
101 PUTLOG("[%s:%02X(%s)]", par, inst par, "Value is invalid");\
102 } else {\
103 PUTLOG("[%s:%02X(%s)]", par, inst par, "OK");\
104 };\
105 lenval = snprintf((char*)l_dest, sizeof(l_dest), "%-30s[%02X] - [%s]\n",\
106 #par,inst par, dummy_b);\
107 if( lenval >= left ){\
108 PUTLOG("[%s:%02X(%s)]", par, inst par,\
109 "Value lenght exceed buffer lenght");\
110 return( -1 );\
111 };\
112 snprintf((char*)dest, left, "%s", l_dest);\
113 left -= lenval; dest += lenval;\
114 }
115
116 #define _op(inst, par, size ){\
117 lenval = snprintf((char*)l_dest, sizeof(l_dest), "%-30s[%."#size"s]\n",\
118 #par, inst par);\
119 if( lenval >= left ){\
120 PUTLOG("[%s:%s(%s)]", par, inst par, \
121 "Value lenght exceed buffer lenght");\
122 return( -1 );\
123 };\
124 PUTLOG("[%s:%s(%s)]", par, inst par, "OK");\
125 snprintf((char*)dest, left, "%s", l_dest);\
126 left -= lenval; dest += lenval;\
127 }
128
129 #define O_C_OCTET( inst, par, sizeval ){\
130 if( !(inst command_status) ){\
131 C_OCTET( inst, par, sizeval );\
132 } else {\
133 PUTLOG("[%s:%s(%s)]", par, inst par, "OK");\
134 };\
135 }
136
137 #define C_OCTET( inst, par, size ) {\
138 _op(inst, par, size )\
139 }
140
141 #define OCTET8( inst, par, size ){\
142 int i = 0;\
143 uint8_t *p = l_dest;\
144 int dummy = 0;\
145 lenval = *((inst par) - 1);\
146 if( (lenval + 33) >= left ){\
147 PUTLOG("[%s:%s(%s)]", par, inst par, \
148 "Value lenght exceed buffer lenght");\
149 return( -1 );\
150 };\
151 PUTLOG("[%s:%s(%s)]", par, "<bin>", "OK");\
152 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), "%-30s[", #par);\
153 for(i = 0 ; i < lenval; i++){\
154 if( *((inst par)+i) < ' ' || *((inst par)+i) > '~' ){\
155 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), ".");\
156 } else {\
157 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), "%c",\
158 *((inst par)+i));\
159 };\
160 };\
161 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), "]\n");\
162 dummy = snprintf((char*)dest, left, "%s", l_dest);\
163 left -= dummy; dest += dummy;\
164 };
165
166
167 #define OCTET16( inst, par, size ){\
168 int i = 0;\
169 uint8_t *p = l_dest;\
170 int dummy = 0;\
171 uint16_t l_lenval = 0;\
172 memcpy(&l_lenval, ((inst par) - sizeof(uint16_t)), sizeof(uint16_t));\
173 if( (l_lenval + 33) >= left ){\
174 PUTLOG("[%s:%s(%s)]", par, inst par, \
175 "Value lenght exceed buffer lenght");\
176 return( -1 );\
177 };\
178 PUTLOG("[%s:%s(%s)]", par, "<bin>", "OK");\
179 p += snprintf((char*)p, (sizeof(l_dest) - (p - l_dest)), "%-30s[", #par);\
180 for( i = 0; i < l_lenval; i++){\
181 if( *((inst par)+i) < ' ' || *((inst par)+i) > '~' ){\
182 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), ".");\
183 } else {\
184 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), "%c",\
185 *((inst par)+i));\
186 };\
187 };\
188 p += snprintf((char*)p, (sizeof(l_dest)-(p-l_dest)), "]\n");\
189 dummy = snprintf((char*)dest, left, "%s", l_dest);\
190 left -= dummy; dest += dummy;\
191 };
192
193
194 #define TLV( inst, tlv1, do_tlv ){\
195 tlv_t *aux_tlv = inst tlv1;\
196 while( aux_tlv != NULL ){\
197 do_tlv( aux_tlv );\
198 aux_tlv = aux_tlv->next;\
199 };\
200 };
201
202 #define DAD( inst, dad1, do_dad ){\
203 dad_t *aux_dad = inst dad1;\
204 while( aux_dad != NULL ){\
205 do_dad( aux_dad );\
206 aux_dad = aux_dad->next;\
207 };\
208 };
209
210 #define UDAD( inst, udad1, do_udad ){\
211 udad_t *aux_udad = inst udad1;\
212 while( aux_udad != NULL ){\
213 do_udad( aux_udad );\
214 aux_udad = aux_udad->next;\
215 };\
216 };
217
218 #include "def_frame/alert_notification.tlv"
219 #include "def_frame/bind_receiver_resp.tlv"
220 #include "def_frame/bind_transceiver_resp.tlv"
221 #include "def_frame/bind_transmitter_resp.tlv"
222 #include "def_frame/data_sm.tlv"
223 #include "def_frame/data_sm_resp.tlv"
224 #include "def_frame/deliver_sm.tlv"
225 #include "def_frame/submit_multi_resp.udad"
226 #include "def_frame/submit_multi.dad"
227 #include "def_frame/submit_multi.tlv"
228 #include "def_frame/submit_sm.tlv"
229 #include "def_list/smpp34_protocol.def"
230
231 #include "def_frame/clean.frame"
232
233 return( 0 );
234 };
235
236
237
238 int
smpp34_dumpPdu2(uint8_t * dest,int size_dest,void * tt)239 smpp34_dumpPdu2(uint8_t *dest, int size_dest, void* tt)
240 {
241 uint32_t cmdid;
242 memcpy(&cmdid, tt+4, sizeof(uint32_t));
243 return( smpp34_dumpPdu(cmdid, dest, size_dest, tt) );
244 };
245
246