71 pdu = gw_malloc(
sizeof(*pdu));
75 #define PDU(name, docstring, fields, is_valid) \ 77 struct name *p; p = &pdu->u.name; \ 80 #define UINT(field, docstring, bits) p->field = 0; 81 #define UINTVAR(field, docstring) p->field = 0; 82 #define OCTSTR(field, docstring, lengthfield) p->field = NULL; 83 #define REST(field, docstring) p->field = NULL; 84 #define TYPE(bits, value) 85 #define RESERVED(bits) 95 panic(0,
"Internal error: Unknown PDU type %d", pdu->
type);
107 #define PDU(name, docstring, fields, is_valid) \ 109 struct name *p; p = &pdu->u.name; \ 112 #define UINT(field, docstring, bits) 113 #define UINTVAR(field, docstring) 114 #define OCTSTR(field, docstring, lengthfield) octstr_destroy(p->field); 115 #define REST(field, docstring) octstr_destroy(p->field); 116 #define TYPE(bits, value) 117 #define RESERVED(bits) 127 panic(0,
"Cannot destroy unknown WSP PDU type %d", pdu->
type);
139 long lastnumbits = -1;
149 #define PDU(name, docstring, fields, is_valid) \ 153 #define UINT(field, docstring, bits) bitpos += (bits); 154 #define UINTVAR(field, docstring) 155 #define OCTSTR(field, docstring, lengthfield) 156 #define REST(field, docstring) 157 #define TYPE(bits, value) \ 158 if ((bits) != lastnumbits || bitpos != lastpos) { \ 159 lastval = octstr_get_bits(data, bitpos, (bits)); \ 161 if (lastval == (value)) \ 163 lastnumbits = (bits); \ 165 #define RESERVED(bits) bitpos += (bits); 184 pdu = gw_malloc(
sizeof(*pdu));
189 #define PDU(name, docstring, fields, is_valid) \ 191 struct name *p = &pdu->u.name; \ 193 gw_assert(bitpos % 8 == 0); \ 194 if (bitpos / 8 != octstr_len(data)) { \ 195 warning(0, "Bad length for " #name " PDU, " \ 196 "expected %ld", bitpos / 8); \ 199 warning(0, #name " PDU failed %s", #is_valid); \ 202 #define UINT(field, docstring, bits) \ 203 p->field = octstr_get_bits(data, bitpos, (bits)); \ 205 #define UINTVAR(field, docstring) \ 206 gw_assert(bitpos % 8 == 0); \ 207 p->field = octstr_get_bits(data, bitpos + 1, 7); \ 208 while (octstr_get_bits(data, bitpos, 1)) { \ 211 p->field |= octstr_get_bits(data, bitpos + 1, 7); \ 214 #define OCTSTR(field, docstring, lengthfield) \ 215 gw_assert(bitpos % 8 == 0); \ 216 p->field = octstr_copy(data, bitpos / 8, p->lengthfield); \ 217 bitpos += 8 * p->lengthfield; 218 #define REST(field, docstring) \ 219 gw_assert(bitpos % 8 == 0); \ 220 if (bitpos / 8 <= octstr_len(data)) { \ 221 p->field = octstr_copy(data, bitpos / 8, \ 222 octstr_len(data) - bitpos / 8); \ 223 bitpos = octstr_len(data) * 8; \ 225 p->field = octstr_create(""); \ 227 #define TYPE(bits, value) bitpos += (bits); 228 #define RESERVED(bits) bitpos += (bits); 238 warning(0,
"WSP PDU with unknown type %d", pdu->
type);
248 #define PDU(name, docstring, fields, is_valid) \ 250 struct name *p; p = &pdu->u.name; \ 253 #define UINT(field, docstring, bits) 254 #define UINTVAR(field, docstring) 255 #define OCTSTR(field, docstring, lengthfield) \ 256 p->lengthfield = octstr_len(p->field); 257 #define REST(field, docstring) 258 #define TYPE(bits, value) 259 #define RESERVED(bits) 282 #define PDU(name, docstring, fields, is_valid) \ 284 struct name *p = &pdu->u.name; \ 286 gw_assert(bitpos % 8 == 0); \ 288 #define UINT(field, docstring, bits) \ 289 octstr_set_bits(data, bitpos, (bits), p->field); \ 291 #define UINTVAR(field, docstring) \ 292 gw_assert(bitpos % 8 == 0); \ 293 octstr_append_uintvar(data, p->field); \ 294 bitpos = 8 * octstr_len(data); 295 #define OCTSTR(field, docstring, lengthfield) \ 296 gw_assert(bitpos % 8 == 0); \ 297 if (p->field != NULL) \ 298 octstr_append(data, p->field); \ 299 bitpos += 8 * octstr_len(p->field); 300 #define REST(field, docstring) \ 301 gw_assert(bitpos % 8 == 0); \ 302 if (p->field != NULL) \ 303 octstr_append(data, p->field); \ 304 bitpos += 8 * octstr_len(p->field); 305 #define TYPE(bits, value) \ 306 octstr_set_bits(data, bitpos, (bits), (value)); \ 308 #define RESERVED(bits) bitpos += (bits); 318 panic(0,
"Packing unknown WSP PDU type %ld", (
long) pdu->
type);
325 char *dbg =
"wap.wsp";
328 #define PDU(name, docstring, fields, is_valid) \ 330 struct name *p = &pdu->u.name; \ 331 debug(dbg, 0, "%*sWSP %s PDU at %p:", \ 332 level, "", #name, (void *)pdu); \ 335 #define UINT(field, docstring, bits) \ 336 debug(dbg, 0, "%*s %s: %lu", level, "", docstring, p->field); 337 #define UINTVAR(field, docstring) \ 338 debug(dbg, 0, "%*s %s: %lu", level, "", docstring, p->field); 339 #define OCTSTR(field, docstring, lengthfield) \ 340 debug(dbg, 0, "%*s %s:", level, "", docstring); \ 341 octstr_dump(p->field, level + 1); 342 #define REST(field, docstring) \ 343 debug(dbg, 0, "%*s %s:", level, "", docstring); \ 344 octstr_dump(p->field, level + 1); 345 #define TYPE(bits, value) 346 #define RESERVED(bits) 356 debug(dbg, 0,
"%*sWSP PDU at %p:", level,
"", (
void *)pdu);
357 debug(dbg, 0,
"%*s unknown type %u", level,
"", pdu->type);
360 debug(
"wap.wsp", 0,
"%*sWSP PDU dump ends.", level,
"");
gw_assert(wtls_machine->packet_to_send !=NULL)
Octstr * wsp_pdu_pack(WSP_PDU *pdu)
static void fixup_length_fields(WSP_PDU *pdu)
WSP_PDU * wsp_pdu_create(int type)
void warning(int err, const char *fmt,...)
static int wsp_pdu_type(Octstr *data)
#define octstr_create(cstr)
void wsp_pdu_destroy(WSP_PDU *pdu)
void debug(const char *place, int err, const char *fmt,...)
void wsp_pdu_dump(WSP_PDU *pdu, int level)
WSP_PDU * wsp_pdu_unpack(Octstr *data)