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