libosmogsm  1.4.0.171-b3b83
Osmocom GSM library
tlv.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdint.h>
4 #include <string.h>
5 
6 #include <osmocom/core/msgb.h>
9 
14 /* Terminology / wording
15  tag length value (in bits)
16 
17  V - - 8
18  LV - 8 N * 8
19  TLV 8 8 N * 8
20  TL16V 8 16 N * 8
21  TLV16 8 8 N * 16
22  TvLV 8 8/16 N * 8
23  vTvLV 8/16 8/16 N * 8
24  T16LV 16 8 N * 8
25 */
26 
28 #define LV_GROSS_LEN(x) (x+1)
29 
30 #define TLV_GROSS_LEN(x) (x+2)
31 
32 #define TLV16_GROSS_LEN(x) ((2*x)+2)
33 
34 #define TL16V_GROSS_LEN(x) (x+3)
35 
36 #define L16TV_GROSS_LEN(x) (x+3)
37 
38 #define T16LV_GROSS_LEN(x) (x+3)
39 
41 #define TVLV_MAX_ONEBYTE 0x7f
42 
44 static inline uint16_t TVLV_GROSS_LEN(uint16_t len)
45 {
46  if (len <= TVLV_MAX_ONEBYTE)
47  return TLV_GROSS_LEN(len);
48  else
49  return TL16V_GROSS_LEN(len);
50 }
51 
53 static inline uint16_t VTVL_GAN_GROSS_LEN(uint16_t tag, uint16_t len)
54 {
55  uint16_t ret = 2;
56 
57  if (tag > TVLV_MAX_ONEBYTE)
58  ret++;
59 
60  if (len > TVLV_MAX_ONEBYTE)
61  ret++;
62 
63  return ret;
64 }
65 
67 static inline uint16_t VTVLV_GAN_GROSS_LEN(uint16_t tag, uint16_t len)
68 {
69  uint16_t ret;
70 
71  if (len <= TVLV_MAX_ONEBYTE)
72  ret = TLV_GROSS_LEN(len);
73  else
74  ret = TL16V_GROSS_LEN(len);
75 
76  if (tag > TVLV_MAX_ONEBYTE)
77  ret += 1;
78 
79  return ret;
80 }
81 
82 /* TLV generation */
83 
85 static inline uint8_t *lv_put(uint8_t *buf, uint8_t len,
86  const uint8_t *val)
87 {
88  *buf++ = len;
89  memcpy(buf, val, len);
90  return buf + len;
91 }
92 
100 static inline uint8_t *tlv_put(uint8_t *buf, uint8_t tag, uint8_t len,
101  const uint8_t *val)
102 {
103  *buf++ = tag;
104  *buf++ = len;
105  if (len) {
106  if (val)
107  memcpy(buf, val, len);
108  else
109  memset(buf, 0, len);
110  }
111  return buf + len;
112 }
113 
115 static inline uint8_t *tl_put(uint8_t *buf, uint8_t tag, uint8_t len)
116 {
117  *buf++ = tag;
118  *buf++ = len;
119  return buf;
120 }
121 
123 static inline uint8_t *tlv16_put(uint8_t *buf, uint8_t tag, uint8_t len,
124  const uint16_t *val)
125 {
126  *buf++ = tag;
127  *buf++ = len;
128  memcpy(buf, val, len*2);
129  return buf + len*2;
130 }
131 
133 static inline uint8_t *tl16v_put(uint8_t *buf, uint8_t tag, uint16_t len,
134  const uint8_t *val)
135 {
136  *buf++ = tag;
137  *buf++ = len >> 8;
138  *buf++ = len & 0xff;
139  memcpy(buf, val, len);
140  return buf + len*2;
141 }
142 
144 static inline uint8_t *tl16_put(uint8_t *buf, uint8_t tag, uint16_t len)
145 {
146  *buf++ = tag;
147  *buf++ = len >> 8;
148  *buf++ = len & 0xff;
149  return buf;
150 }
151 
153 static inline uint8_t *t16lv_put(uint8_t *buf, uint16_t tag, uint8_t len,
154  const uint8_t *val)
155 {
156  *buf++ = tag >> 8;
157  *buf++ = tag & 0xff;
158  *buf++ = len;
159  memcpy(buf, val, len);
160  return buf + len + 2;
161 }
162 
164 static inline uint8_t *tvlv_put(uint8_t *buf, uint8_t tag, uint16_t len,
165  const uint8_t *val)
166 {
167  uint8_t *ret;
168 
169  if (len <= TVLV_MAX_ONEBYTE) {
170  ret = tlv_put(buf, tag, len, val);
171  buf[1] |= 0x80;
172  } else
173  ret = tl16v_put(buf, tag, len, val);
174 
175  return ret;
176 }
177 
182 static inline uint8_t *tvl_put(uint8_t *buf, uint8_t tag, uint16_t len)
183 {
184  uint8_t *ret;
185 
186  if (len <= TVLV_MAX_ONEBYTE) {
187  ret = tl_put(buf, tag, len);
188  buf[1] |= 0x80;
189  } else
190  ret = tl16_put(buf, tag, len);
191 
192  return ret;
193 }
194 
196 static inline uint8_t *vt_gan_put(uint8_t *buf, uint16_t tag)
197 {
198  if (tag > TVLV_MAX_ONEBYTE) {
199  /* two-byte TAG */
200  *buf++ = 0x80 | (tag >> 8);
201  *buf++ = (tag & 0xff);
202  } else
203  *buf++ = tag;
204 
205  return buf;
206 }
207 
208 /* put (append) vTvL (GAN) field (tag + length)*/
209 static inline uint8_t *vtvl_gan_put(uint8_t *buf, uint16_t tag, uint16_t len)
210 {
211  uint8_t *ret;
212 
213  ret = vt_gan_put(buf, tag);
214  return vt_gan_put(ret, len);
215 }
216 
217 /* put (append) vTvLV (GAN) field (tag + length + val) */
218 static inline uint8_t *vtvlv_gan_put(uint8_t *buf, uint16_t tag, uint16_t len,
219  const uint8_t *val)
220 {
221  uint8_t *ret;
222 
223  ret = vtvl_gan_put(buf, tag, len );
224 
225  memcpy(ret, val, len);
226  ret = buf + len;
227 
228  return ret;
229 }
230 
232 static inline uint8_t *msgb_tlv16_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint16_t *val)
233 {
234  uint8_t *buf = msgb_put(msg, TLV16_GROSS_LEN(len));
235  return tlv16_put(buf, tag, len, val);
236 }
237 
239 static inline uint8_t *msgb_tl16v_put(struct msgb *msg, uint8_t tag, uint16_t len,
240  const uint8_t *val)
241 {
242  uint8_t *buf = msgb_put(msg, TL16V_GROSS_LEN(len));
243  return tl16v_put(buf, tag, len, val);
244 }
245 
246 static inline uint8_t *msgb_t16lv_put(struct msgb *msg, uint16_t tag, uint8_t len, const uint8_t *val)
247 {
248  uint8_t *buf = msgb_put(msg, T16LV_GROSS_LEN(len));
249  return t16lv_put(buf, tag, len, val);
250 }
251 
257 static inline uint8_t *msgb_tvl_put(struct msgb *msg, uint8_t tag, uint16_t len)
258 {
259  uint8_t *buf = msgb_put(msg, TVLV_GROSS_LEN(len));
260  return tvl_put(buf, tag, len);
261 }
262 
264 static inline uint8_t *msgb_tvlv_put(struct msgb *msg, uint8_t tag, uint16_t len,
265  const uint8_t *val)
266 {
267  uint8_t *buf = msgb_put(msg, TVLV_GROSS_LEN(len));
268  return tvlv_put(buf, tag, len, val);
269 }
270 
272 static inline uint8_t *msgb_vtvlv_gan_put(struct msgb *msg, uint16_t tag,
273  uint16_t len, const uint8_t *val)
274 {
275  uint8_t *buf = msgb_put(msg, VTVLV_GAN_GROSS_LEN(tag, len));
276  return vtvlv_gan_put(buf, tag, len, val);
277 }
278 
280 static inline uint8_t *msgb_l16tv_put(struct msgb *msg, uint16_t len, uint8_t tag,
281  const uint8_t *val)
282 {
283  uint8_t *buf = msgb_put(msg, L16TV_GROSS_LEN(len));
284 
285  *buf++ = len >> 8;
286  *buf++ = len & 0xff;
287  *buf++ = tag;
288  memcpy(buf, val, len);
289  return buf + len;
290 }
291 
293 static inline uint8_t *v_put(uint8_t *buf, uint8_t val)
294 {
295  *buf++ = val;
296  return buf;
297 }
298 
300 static inline uint8_t *tv_put(uint8_t *buf, uint8_t tag,
301  uint8_t val)
302 {
303  *buf++ = tag;
304  *buf++ = val;
305  return buf;
306 }
307 
309 static inline uint8_t *tv_fixed_put(uint8_t *buf, uint8_t tag,
310  unsigned int len, const uint8_t *val)
311 {
312  *buf++ = tag;
313  memcpy(buf, val, len);
314  return buf + len;
315 }
316 
322 static inline uint8_t *tv16_put(uint8_t *buf, uint8_t tag,
323  uint16_t val)
324 {
325  *buf++ = tag;
326  *buf++ = val >> 8;
327  *buf++ = val & 0xff;
328  return buf;
329 }
330 
333 static inline uint8_t *msgb_lv_put(struct msgb *msg, uint8_t len, const uint8_t *val)
334 {
335  uint8_t *buf = msgb_put(msg, LV_GROSS_LEN(len));
336  return lv_put(buf, len, val);
337 }
338 
341 static inline uint8_t *msgb_tlv_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val)
342 {
343  uint8_t *buf = msgb_put(msg, TLV_GROSS_LEN(len));
344  return tlv_put(buf, tag, len, val);
345 }
346 
349 static inline uint8_t *msgb_tv_put(struct msgb *msg, uint8_t tag, uint8_t val)
350 {
351  uint8_t *buf = msgb_put(msg, 2);
352  return tv_put(buf, tag, val);
353 }
354 
357 static inline uint8_t *msgb_tv_fixed_put(struct msgb *msg, uint8_t tag,
358  unsigned int len, const uint8_t *val)
359 {
360  uint8_t *buf = msgb_put(msg, 1+len);
361  return tv_fixed_put(buf, tag, len, val);
362 }
363 
366 static inline uint8_t *msgb_v_put(struct msgb *msg, uint8_t val)
367 {
368  uint8_t *buf = msgb_put(msg, 1);
369  return v_put(buf, val);
370 }
371 
374 static inline uint8_t *msgb_tl_put(struct msgb *msg, uint8_t tag)
375 {
376  uint8_t *len = msgb_v_put(msg, tag);
377 
378  /* reserve space for length, len points to this reserved space already */
379  msgb_v_put(msg, 0);
380 
381  return len;
382 }
383 
386 static inline uint8_t *msgb_tv16_put(struct msgb *msg, uint8_t tag, uint16_t val)
387 {
388  uint8_t *buf = msgb_put(msg, 3);
389  return tv16_put(buf, tag, val);
390 }
391 
394 static inline uint8_t *msgb_tlv_push(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val)
395 {
396  uint8_t *buf = msgb_push(msg, TLV_GROSS_LEN(len));
397  tlv_put(buf, tag, len, val);
398  return buf;
399 }
400 
402 static inline uint8_t *msgb_tlv1_push(struct msgb *msg, uint8_t tag, uint8_t val)
403 {
404  return msgb_tlv_push(msg, tag, 1, &val);
405 }
406 
409 static inline uint8_t *msgb_tv_push(struct msgb *msg, uint8_t tag, uint8_t val)
410 {
411  uint8_t *buf = msgb_push(msg, 2);
412  tv_put(buf, tag, val);
413  return buf;
414 }
415 
418 static inline uint8_t *msgb_tv16_push(struct msgb *msg, uint8_t tag, uint16_t val)
419 {
420  uint8_t *buf = msgb_push(msg, 3);
421  tv16_put(buf, tag, val);
422  return buf;
423 }
424 
427 static inline uint8_t *msgb_tvlv_push(struct msgb *msg, uint8_t tag, uint16_t len,
428  const uint8_t *val)
429 {
430  uint8_t *buf = msgb_push(msg, TVLV_GROSS_LEN(len));
431  tvlv_put(buf, tag, len, val);
432  return buf;
433 }
434 
435 /* push (prepend) a vTvL header to a \ref msgb
436  */
437 static inline uint8_t *msgb_vtvl_gan_push(struct msgb *msg, uint16_t tag,
438  uint16_t len)
439 {
440  uint8_t *buf = msgb_push(msg, VTVL_GAN_GROSS_LEN(tag, len));
441  vtvl_gan_put(buf, tag, len);
442  return buf;
443 }
444 
445 
446 static inline uint8_t *msgb_vtvlv_gan_push(struct msgb *msg, uint16_t tag,
447  uint16_t len, const uint8_t *val)
448 {
449  uint8_t *buf = msgb_push(msg, VTVLV_GAN_GROSS_LEN(tag, len));
450  vtvlv_gan_put(buf, tag, len, val);
451  return buf;
452 }
453 
454 /* TLV parsing */
455 
457 struct tlv_p_entry {
458  uint16_t len;
459  const uint8_t *val;
460 };
461 
463 enum tlv_type {
473 };
474 
476 struct tlv_def {
477  enum tlv_type type;
478  uint8_t fixed_len;
479 };
480 
483  struct tlv_def def[256];
484 };
485 
487 struct tlv_parsed {
488  struct tlv_p_entry lv[256];
489 };
490 
491 extern struct tlv_definition tvlv_att_def;
492 extern struct tlv_definition vtvlv_gan_att_def;
493 
494 int tlv_parse_one(uint8_t *o_tag, uint16_t *o_len, const uint8_t **o_val,
495  const struct tlv_definition *def,
496  const uint8_t *buf, int buf_len);
497 int tlv_parse(struct tlv_parsed *dec, const struct tlv_definition *def,
498  const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2);
499 int tlv_parse2(struct tlv_parsed *dec, int dec_multiples,
500  const struct tlv_definition *def, const uint8_t *buf, int buf_len,
501  uint8_t lv_tag, uint8_t lv_tag2);
502 /* take a master (src) tlv def and fill up all empty slots in 'dst' */
503 void tlv_def_patch(struct tlv_definition *dst, const struct tlv_definition *src);
504 
505 int tlv_encode_one(struct msgb *msg, enum tlv_type type, uint8_t tag,
506  unsigned int len, const uint8_t *val);
507 int tlv_encode(struct msgb *msg, const struct tlv_definition *def, const struct tlv_parsed *tp);
508 int tlv_encode_ordered(struct msgb *msg, const struct tlv_definition *def, const struct tlv_parsed *tp,
509  const uint8_t *tag_order, unsigned int tag_order_len);
510 
511 #define TLVP_PRESENT(x, y) ((x)->lv[y].val)
512 #define TLVP_LEN(x, y) (x)->lv[y].len
513 #define TLVP_VAL(x, y) (x)->lv[y].val
514 
515 #define TLVP_PRES_LEN(tp, tag, min_len) \
516  (TLVP_PRESENT(tp, tag) && TLVP_LEN(tp, tag) >= min_len)
517 
528 #define TLVP_GET(_tp, tag) (TLVP_PRESENT(_tp, tag)? &(_tp)->lv[tag] : NULL)
529 
536 #define TLVP_GET_MINLEN(_tp, tag, min_len) \
537  (TLVP_PRES_LEN(_tp, tag, min_len)? &(_tp)->lv[tag] : NULL)
538 
545 #define TLVP_VAL_MINLEN(_tp, tag, min_len) \
546  (TLVP_PRES_LEN(_tp, tag, min_len)? (_tp)->lv[tag].val : NULL)
547 
548 
555 static inline uint8_t tlvp_val8(const struct tlv_parsed *tp, uint8_t tag, uint8_t default_val)
556 {
557  const uint8_t *res = TLVP_VAL_MINLEN(tp, tag, 1);
558 
559  if (res)
560  return res[0];
561 
562  return default_val;
563 }
564 
570 static inline uint16_t tlvp_val16_unal(const struct tlv_parsed *tp, int pos)
571 {
572  uint16_t res;
573  memcpy(&res, TLVP_VAL(tp, pos), sizeof(res));
574  return res;
575 }
576 
582 static inline uint32_t tlvp_val32_unal(const struct tlv_parsed *tp, int pos)
583 {
584  uint32_t res;
585  memcpy(&res, TLVP_VAL(tp, pos), sizeof(res));
586  return res;
587 }
588 
594 static inline uint16_t tlvp_val16be(const struct tlv_parsed *tp, int pos)
595 {
596  return osmo_load16be(TLVP_VAL(tp, pos));
597 }
598 
604 static inline uint32_t tlvp_val32be(const struct tlv_parsed *tp, int pos)
605 {
606  return osmo_load32be(TLVP_VAL(tp, pos));
607 }
608 
609 
610 struct tlv_parsed *osmo_tlvp_copy(const struct tlv_parsed *tp_orig, void *ctx);
611 int osmo_tlvp_merge(struct tlv_parsed *dst, const struct tlv_parsed *src);
612 int osmo_shift_v_fixed(uint8_t **data, size_t *data_len,
613  size_t len, uint8_t **value);
614 int osmo_match_shift_tv_fixed(uint8_t **data, size_t *data_len,
615  uint8_t tag, size_t len, uint8_t **value);
616 int osmo_shift_tlv(uint8_t **data, size_t *data_len,
617  uint8_t *tag, uint8_t **value, size_t *value_len);
618 int osmo_match_shift_tlv(uint8_t **data, size_t *data_len,
619  uint8_t tag, uint8_t **value, size_t *value_len);
620 int osmo_shift_lv(uint8_t **data, size_t *data_len,
621  uint8_t **value, size_t *value_len);
622 
static uint8_t * msgb_tv_push(struct msgb *msg, uint8_t tag, uint8_t val)
push (prepend) a TV field to a Message buffers
Definition: tlv.h:409
static unsigned char * msgb_put(struct msgb *msgb, unsigned int len)
static uint16_t VTVLV_GAN_GROSS_LEN(uint16_t tag, uint16_t len)
gross length of vTvLV (tag+len+val)
Definition: tlv.h:67
static uint16_t tlvp_val16be(const struct tlv_parsed *tp, int pos)
Retrieve (possibly unaligned) TLV element and convert to host byte order.
Definition: tlv.h:594
static uint8_t * msgb_tv16_push(struct msgb *msg, uint8_t tag, uint16_t val)
push (prepend) a TV16 field to a Message buffers
Definition: tlv.h:418
uint8_t type
Definition: gsm_08_08.h:469
static uint8_t * tv_put(uint8_t *buf, uint8_t tag, uint8_t val)
put (append) a TV field
Definition: tlv.h:300
static uint8_t * msgb_l16tv_put(struct msgb *msg, uint16_t len, uint8_t tag, const uint8_t *val)
put (append) a L16TV field to Message buffers
Definition: tlv.h:280
static uint8_t * tvl_put(uint8_t *buf, uint8_t tag, uint16_t len)
put (append) a TvL field (a TvLV with variable-size length, where the value part&#39;s length is already ...
Definition: tlv.h:182
static uint8_t * msgb_tvl_put(struct msgb *msg, uint8_t tag, uint16_t len)
put (append) a TvL field to Message buffers, i.e.
Definition: tlv.h:257
uint16_t len
length
Definition: tlv.h:458
int osmo_shift_v_fixed(uint8_t **data, size_t *data_len, size_t len, uint8_t **value)
Advance the data pointer, subtract length and assign value pointer.
Definition: tlv_parser.c:466
static uint8_t tlvp_val8(const struct tlv_parsed *tp, uint8_t tag, uint8_t default_val)
Obtain 1-byte TLV element.
Definition: tlv.h:555
static uint8_t * msgb_tlv16_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint16_t *val)
put (append) a TLV16 field to Message buffers
Definition: tlv.h:232
static uint8_t * msgb_tv_put(struct msgb *msg, uint8_t tag, uint8_t val)
put (append) a TV field to a Message buffers
Definition: tlv.h:349
static uint8_t * tl16_put(uint8_t *buf, uint8_t tag, uint16_t len)
put (append) a TL16 field.
Definition: tlv.h:144
static uint8_t * msgb_tlv1_push(struct msgb *msg, uint8_t tag, uint8_t val)
push 1-byte tagged value
Definition: tlv.h:402
int tlv_parse_one(uint8_t *o_tag, uint16_t *o_len, const uint8_t **o_val, const struct tlv_definition *def, const uint8_t *buf, int buf_len)
Parse a single TLV encoded IE.
Definition: tlv_parser.c:229
struct tlv_definition tvlv_att_def
Definition: tlv_parser.c:48
static uint8_t * msgb_tvlv_push(struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val)
push (prepend) a TvLV field to a Message buffers
Definition: tlv.h:427
static uint32_t tlvp_val32be(const struct tlv_parsed *tp, int pos)
Retrieve (possibly unaligned) TLV element and convert to host byte order.
Definition: tlv.h:604
int osmo_match_shift_tv_fixed(uint8_t **data, size_t *data_len, uint8_t tag, size_t len, uint8_t **value)
Match tag, check length and assign value pointer.
Definition: tlv_parser.c:494
static uint16_t TVLV_GROSS_LEN(uint16_t len)
gross length of a TVLV type field
Definition: tlv.h:44
static uint8_t * vt_gan_put(uint8_t *buf, uint16_t tag)
put (append) a variable-length tag or variable-length length *
Definition: tlv.h:196
static uint8_t * tvlv_put(uint8_t *buf, uint8_t tag, uint16_t len, const uint8_t *val)
put (append) a TvLV field
Definition: tlv.h:164
static uint8_t * lv_put(uint8_t *buf, uint8_t len, const uint8_t *val)
put (append) a LV field
Definition: tlv.h:85
static uint8_t * msgb_vtvl_gan_push(struct msgb *msg, uint16_t tag, uint16_t len)
Definition: tlv.h:437
int osmo_shift_tlv(uint8_t **data, size_t *data_len, uint8_t *tag, uint8_t **value, size_t *value_len)
Extract TLV and advance data pointer + subtract length.
Definition: tlv_parser.c:560
Entry in a TLV parser array.
Definition: tlv.h:457
#define TLV_GROSS_LEN(x)
gross length of a TLV type field
Definition: tlv.h:30
tag-value (8bit)
Definition: tlv.h:467
static uint8_t * tv_fixed_put(uint8_t *buf, uint8_t tag, unsigned int len, const uint8_t *val)
put (append) a TVfixed field
Definition: tlv.h:309
#define TL16V_GROSS_LEN(x)
gross length of a TL16V type field
Definition: tlv.h:34
int tlv_parse2(struct tlv_parsed *dec, int dec_multiples, const struct tlv_definition *def, const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2)
Like tlv_parse(), but capable of decoding multiple occurences of the same IE.
Definition: tlv_parser.c:357
no type
Definition: tlv.h:464
#define TVLV_MAX_ONEBYTE
maximum length of TLV of one byte length
Definition: tlv.h:41
static uint8_t * msgb_vtvlv_gan_put(struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *val)
put (append) a vTvLV field to Message buffers
Definition: tlv.h:272
static uint16_t VTVL_GAN_GROSS_LEN(uint16_t tag, uint16_t len)
gross length of vTvL header (tag+len)
Definition: tlv.h:53
static uint8_t * msgb_tv16_put(struct msgb *msg, uint8_t tag, uint16_t val)
put (append) a TV16 field to a Message buffers
Definition: tlv.h:386
#define TLV16_GROSS_LEN(x)
gross length of a TLV16 type field
Definition: tlv.h:32
int tlv_encode_ordered(struct msgb *msg, const struct tlv_definition *def, const struct tlv_parsed *tp, const uint8_t *tag_order, unsigned int tag_order_len)
Encode a set of decoded TLVs according to a given definition and IE order into a message buffer...
Definition: tlv_parser.c:198
Definition of a single IE (Information Element)
Definition: tlv.h:476
uint8_t data[0]
#define L16TV_GROSS_LEN(x)
gross length of a L16TV type field
Definition: tlv.h:36
static uint8_t * tl16v_put(uint8_t *buf, uint8_t tag, uint16_t len, const uint8_t *val)
put (append) a TL16V field
Definition: tlv.h:133
static unsigned char * msgb_push(struct msgb *msgb, unsigned int len)
static uint8_t * msgb_tlv_put(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val)
put (append) a TLV field to a Message buffers
Definition: tlv.h:341
static uint8_t * tv16_put(uint8_t *buf, uint8_t tag, uint16_t val)
put (append) a TV16 field
Definition: tlv.h:322
static uint16_t tlvp_val16_unal(const struct tlv_parsed *tp, int pos)
Align given TLV element with 16 bit value to an even address.
Definition: tlv.h:570
static uint8_t * tlv16_put(uint8_t *buf, uint8_t tag, uint8_t len, const uint16_t *val)
put (append) a TLV16 field
Definition: tlv.h:123
uint8_t res
int osmo_shift_lv(uint8_t **data, size_t *data_len, uint8_t **value, size_t *value_len)
Extract LV and advance data pointer + subtract length.
Definition: tlv_parser.c:600
tag-length-value
Definition: tlv.h:468
static uint8_t * tl_put(uint8_t *buf, uint8_t tag, uint8_t len)
put (append) a TL field (a TLV field but omitting the value part).
Definition: tlv.h:115
static uint8_t * msgb_tv_fixed_put(struct msgb *msg, uint8_t tag, unsigned int len, const uint8_t *val)
put (append) a TVfixed field to a Message buffers
Definition: tlv.h:357
int osmo_match_shift_tlv(uint8_t **data, size_t *data_len, uint8_t tag, uint8_t **value, size_t *value_len)
Verify TLV header and advance data / subtract length.
Definition: tlv_parser.c:532
static uint8_t * vtvl_gan_put(uint8_t *buf, uint16_t tag, uint16_t len)
Definition: tlv.h:209
uint8_t len
Definition: gsm_04_11.h:465
tlv_type
TLV type.
Definition: tlv.h:463
static uint8_t * v_put(uint8_t *buf, uint8_t val)
put (append) a V field
Definition: tlv.h:293
static uint8_t * msgb_tl16v_put(struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val)
put (append) a TL16V field to Message buffers
Definition: tlv.h:239
int tlv_encode(struct msgb *msg, const struct tlv_definition *def, const struct tlv_parsed *tp)
Encode a set of decoded TLVs according to a given definition into a message buffer.
Definition: tlv_parser.c:172
uint8_t msg[0]
Definition: gsm_08_08.h:522
variable-length tag, variable-length length
Definition: tlv.h:472
tag, 16 bit length, value
Definition: tlv.h:469
struct tlv_parsed * osmo_tlvp_copy(const struct tlv_parsed *tp_orig, void *ctx)
Copy tlv_parsed using given talloc context.
Definition: tlv_parser.c:69
#define T16LV_GROSS_LEN(x)
gross length of a T16LV type field
Definition: tlv.h:38
result of the TLV parser
Definition: tlv.h:487
static uint8_t * t16lv_put(uint8_t *buf, uint16_t tag, uint8_t len, const uint8_t *val)
put (append) a TL16V field
Definition: tlv.h:153
static uint8_t * tlv_put(uint8_t *buf, uint8_t tag, uint8_t len, const uint8_t *val)
Append a TLV field, a Tag-Length-Value field.
Definition: tlv.h:100
uint8_t fixed_len
length in case of TLV_TYPE_FIXED
Definition: tlv.h:478
fixed-length value-only
Definition: tlv.h:465
void tlv_def_patch(struct tlv_definition *dst, const struct tlv_definition *src)
take a master (src) tlvdev and fill up all empty slots in &#39;dst&#39;
Definition: tlv_parser.c:437
static uint8_t * msgb_vtvlv_gan_push(struct msgb *msg, uint16_t tag, uint16_t len, const uint8_t *val)
Definition: tlv.h:446
static uint32_t tlvp_val32_unal(const struct tlv_parsed *tp, int pos)
Align given TLV element with 32 bit value to an address that is a multiple of 4.
Definition: tlv.h:582
Definition of All 256 IE / TLV.
Definition: tlv.h:482
int osmo_tlvp_merge(struct tlv_parsed *dst, const struct tlv_parsed *src)
Merge all tlv_parsed attributes of &#39;src&#39; into &#39;dst&#39;.
Definition: tlv_parser.c:104
static uint8_t * msgb_tl_put(struct msgb *msg, uint8_t tag)
put (append) a TL fields to a Message buffers
Definition: tlv.h:374
static uint8_t * msgb_v_put(struct msgb *msg, uint8_t val)
put (append) a V field to a Message buffers
Definition: tlv.h:366
int tlv_parse(struct tlv_parsed *dec, const struct tlv_definition *def, const uint8_t *buf, int buf_len, uint8_t lv_tag, uint8_t lv_tag2)
Parse an entire buffer of TLV encoded Information Elements.
Definition: tlv_parser.c:334
#define LV_GROSS_LEN(x)
gross length of a LV type field
Definition: tlv.h:28
tag-only
Definition: tlv.h:466
int tlv_encode_one(struct msgb *msg, enum tlv_type type, uint8_t tag, unsigned int len, const uint8_t *val)
Encode a single TLV into given message buffer.
Definition: tlv_parser.c:131
tag, variable length, value
Definition: tlv.h:470
const uint8_t * val
pointer to value
Definition: tlv.h:459
#define TLVP_VAL(x, y)
Definition: tlv.h:513
#define TLVP_VAL_MINLEN(_tp, tag, min_len)
Like TLVP_VAL(), but enforcing a minimum val length.
Definition: tlv.h:545
static uint8_t * vtvlv_gan_put(uint8_t *buf, uint16_t tag, uint16_t len, const uint8_t *val)
Definition: tlv.h:218
static uint8_t * msgb_tlv_push(struct msgb *msg, uint8_t tag, uint8_t len, const uint8_t *val)
push (prepend) a TLV field to a Message buffers
Definition: tlv.h:394
struct tlv_definition vtvlv_gan_att_def
Definition: tlv_parser.c:49
static uint8_t * msgb_lv_put(struct msgb *msg, uint8_t len, const uint8_t *val)
put (append) a LV field to a Message buffers
Definition: tlv.h:333
static uint8_t * msgb_tvlv_put(struct msgb *msg, uint8_t tag, uint16_t len, const uint8_t *val)
put (append) a TvLV field to Message buffers
Definition: tlv.h:264
tag and value (both 4 bit) in 1 byte
Definition: tlv.h:471
static uint8_t * msgb_t16lv_put(struct msgb *msg, uint16_t tag, uint8_t len, const uint8_t *val)
Definition: tlv.h:246