]>
The Tcpdump Group git mirrors - tcpdump/blob - print-forces.c
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that: (1) source code
4 * distributions retain the above copyright notice and this paragraph
5 * in its entirety, and (2) distributions including binary code include
6 * the above copyright notice and this paragraph in its entirety in
7 * the documentation or other materials provided with the distribution.
8 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11 * FOR A PARTICULAR PURPOSE.
13 * Copyright (c) 2009 Mojatatu Networks, Inc
21 #include <tcpdump-stdinc.h>
26 #include "interface.h"
34 prestlv_print(register const u_char
* pptr
, register u_int len
,
35 u_int16_t op_msk _U_
, int indent
)
37 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
38 register const u_char
*tdp
= (u_char
*) TLV_DATA(tlv
);
39 struct res_val
*r
= (struct res_val
*)tdp
;
40 u_int dlen
= len
- TLV_HDRL
;
43 printf("illegal RESULT-TLV: %d bytes!\n", dlen
);
48 if (r
->result
>= 0x18 && r
->result
<= 0xFE) {
49 printf("illegal reserved result code: 0x%x!\n", r
->result
);
54 char *ib
= indent_pr(indent
, 0);
55 printf("%s Result: %s (code 0x%x)\n", ib
,
56 tok2str(ForCES_errs
, NULL
, r
->result
), r
->result
);
61 fputs("[|forces]", stdout
);
66 fdatatlv_print(register const u_char
* pptr
, register u_int len
,
67 u_int16_t op_msk _U_
, int indent
)
69 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
70 u_int tll
= len
- TLV_HDRL
;
71 register const u_char
*tdp
= (u_char
*) TLV_DATA(tlv
);
75 type
= EXTRACT_16BITS(&tlv
->type
);
76 if (type
!= F_TLV_FULD
) {
77 printf("Error: expecting FULLDATA!\n");
82 char *ib
= indent_pr(indent
+ 2, 1);
83 printf("%s[", &ib
[1]);
84 hex_print_with_offset(ib
, tdp
, tll
, 0);
85 printf("\n%s]\n", &ib
[1]);
90 fputs("[|forces]", stdout
);
95 sdatailv_print(register const u_char
* pptr
, register u_int len
,
96 u_int16_t op_msk _U_
, int indent
)
98 u_int tll
= len
- ILV_HDRL
;
99 struct forces_ilv
*ilv
= (struct forces_ilv
*)pptr
;
105 invilv
= ilv_valid(ilv
, tll
);
107 printf("Error: BAD ILV!\n");
111 register const u_char
*tdp
= (u_char
*) ILV_DATA(ilv
);
112 char *ib
= indent_pr(indent
, 1);
113 printf("\n%s SPARSEDATA: type %x length %d\n", &ib
[1],
114 EXTRACT_32BITS(&ilv
->type
),
115 EXTRACT_32BITS(&ilv
->length
));
116 printf("%s[", &ib
[1]);
117 hex_print_with_offset(ib
, tdp
, tll
, 0);
118 printf("\n%s]\n", &ib
[1]);
121 ilv
= GO_NXT_ILV(ilv
, tll
);
127 fputs("[|forces]", stdout
);
132 sdatatlv_print(register const u_char
* pptr
, register u_int len
,
133 u_int16_t op_msk
, int indent
)
135 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
136 u_int tll
= len
- TLV_HDRL
;
137 register const u_char
*tdp
= (u_char
*) TLV_DATA(tlv
);
141 type
= EXTRACT_16BITS(&tlv
->type
);
142 if (type
!= F_TLV_SPAD
) {
143 printf("Error: expecting SPARSEDATA!\n");
147 return sdatailv_print(tdp
, tll
, op_msk
, indent
);
150 fputs("[|forces]", stdout
);
155 pkeyitlv_print(register const u_char
* pptr
, register u_int len
,
156 u_int16_t op_msk
, int indent
)
158 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
159 register const u_char
*tdp
= (u_char
*) TLV_DATA(tlv
);
160 register const u_char
*dp
= tdp
+ 4;
161 struct forces_tlv
*kdtlv
= (struct forces_tlv
*)dp
;
163 char *ib
= indent_pr(indent
, 0);
168 id
= EXTRACT_32BITS(tdp
);
169 printf("%sKeyinfo: Key 0x%x\n", ib
, id
);
171 type
= EXTRACT_16BITS(&kdtlv
->type
);
172 invtlv
= tlv_valid(kdtlv
, len
);
175 printf("%s TLV type 0x%x len %d\n",
176 tok2str(ForCES_TLV_err
, NULL
, invtlv
), type
,
177 EXTRACT_16BITS(&kdtlv
->length
));
180 tll
= EXTRACT_16BITS(&kdtlv
->length
);
181 dp
= (u_char
*) TLV_DATA(kdtlv
);
182 return fdatatlv_print(dp
, tll
, op_msk
, indent
);
185 fputs("[|forces]", stdout
);
190 pdatacnt_print(register const u_char
* pptr
, register u_int len
,
191 u_int32_t IDcnt
, u_int16_t op_msk
, int indent
)
196 char *ib
= indent_pr(indent
, 0);
198 for (i
= 0; i
< IDcnt
; i
++) {
200 id
= EXTRACT_32BITS(pptr
);
202 printf("%s ID#%02u: %d\n", ib
, i
+ 1, id
);
207 struct forces_tlv
*pdtlv
= (struct forces_tlv
*)pptr
;
215 type
= EXTRACT_16BITS(&pdtlv
->type
);
216 tll
= EXTRACT_16BITS(&pdtlv
->length
) - TLV_HDRL
;
217 aln
= F_ALN_LEN(EXTRACT_16BITS(&pdtlv
->length
));
218 invtlv
= tlv_valid(pdtlv
, len
);
221 ("%s Outstanding bytes %d for TLV type 0x%x TLV len %d\n",
222 tok2str(ForCES_TLV_err
, NULL
, invtlv
), len
, type
,
223 EXTRACT_16BITS(&pdtlv
->length
));
226 if (aln
> EXTRACT_16BITS(&pdtlv
->length
)) {
229 ("Invalid padded pathdata TLV type 0x%x len %d missing %d pad bytes\n",
230 type
, EXTRACT_16BITS(&pdtlv
->length
), aln
- len
);
232 pad
= aln
- EXTRACT_16BITS(&pdtlv
->length
);
235 if (pd_valid(type
)) {
236 struct pdata_ops
*ops
= get_forces_pd(type
);
238 if (vflag
>= 3 && ops
->v
!= F_TLV_PDAT
) {
241 ("%s %s (Length %d DataLen %d pad %d Bytes)\n",
242 ib
, ops
->s
, EXTRACT_16BITS(&pdtlv
->length
),
246 ("%s %s (Length %d DataLen %d Bytes)\n",
247 ib
, ops
->s
, EXTRACT_16BITS(&pdtlv
->length
),
251 chk_op_type(type
, op_msk
, ops
->op_msk
);
253 rc
= ops
->print((const u_char
*)pdtlv
,
254 tll
+ pad
+ TLV_HDRL
, op_msk
,
257 printf("Invalid path data content type 0x%x len %d\n",
258 type
, EXTRACT_16BITS(&pdtlv
->length
));
260 if (EXTRACT_16BITS(&pdtlv
->length
)) {
261 hex_print_with_offset("Bad Data val\n\t [",
272 fputs("[|forces]", stdout
);
277 pdata_print(register const u_char
* pptr
, register u_int len
,
278 u_int16_t op_msk
, int indent
)
280 struct pathdata_h
*pdh
= (struct pathdata_h
*)pptr
;
281 char *ib
= indent_pr(indent
, 0);
286 printf("\n%sPathdata: Flags 0x%x ID count %d\n",
287 ib
, EXTRACT_16BITS(&pdh
->pflags
), EXTRACT_16BITS(&pdh
->pIDcnt
));
290 if (EXTRACT_16BITS(&pdh
->pflags
) & F_SELKEY
) {
293 pptr
+= sizeof(struct pathdata_h
);
294 len
-= sizeof(struct pathdata_h
);
295 minsize
= EXTRACT_16BITS(&pdh
->pIDcnt
) * 4;
297 printf("\t\t\ttruncated IDs expected %uB got %uB\n", minsize
,
299 hex_print_with_offset("\t\t\tID Data[", pptr
, len
, 0);
303 return pdatacnt_print(pptr
, len
, EXTRACT_16BITS(&pdh
->pIDcnt
), op_msk
, indent
);
306 fputs("[|forces]", stdout
);
311 genoptlv_print(register const u_char
* pptr
, register u_int len
,
312 u_int16_t op_msk
, int indent
)
314 struct forces_tlv
*pdtlv
= (struct forces_tlv
*)pptr
;
318 char *ib
= indent_pr(indent
, 0);
321 type
= EXTRACT_16BITS(&pdtlv
->type
);
322 tll
= EXTRACT_16BITS(&pdtlv
->length
) - TLV_HDRL
;
323 invtlv
= tlv_valid(pdtlv
, len
);
324 printf("genoptlvprint - %s TLV type 0x%x len %d\n",
325 tok2str(ForCES_TLV
, NULL
, type
), type
, EXTRACT_16BITS(&pdtlv
->length
));
327 register const u_char
*dp
= (u_char
*) TLV_DATA(pdtlv
);
328 if (!ttlv_valid(type
)) {
329 printf("%s TLV type 0x%x len %d\n",
330 tok2str(ForCES_TLV_err
, NULL
, invtlv
), type
,
331 EXTRACT_16BITS(&pdtlv
->length
));
335 printf("%s%s, length %d (data length %d Bytes)",
336 ib
, tok2str(ForCES_TLV
, NULL
, type
),
337 EXTRACT_16BITS(&pdtlv
->length
), tll
);
339 return pdata_print(dp
, tll
, op_msk
, indent
+ 1);
341 printf("\t\t\tInvalid ForCES TLV type=%x", type
);
346 fputs("[|forces]", stdout
);
351 recpdoptlv_print(register const u_char
* pptr
, register u_int len
,
352 u_int16_t op_msk
, int indent
)
354 struct forces_tlv
*pdtlv
= (struct forces_tlv
*)pptr
;
359 register const u_char
*dp
;
364 invtlv
= tlv_valid(pdtlv
, len
);
368 ib
= indent_pr(indent
, 0);
369 type
= EXTRACT_16BITS(&pdtlv
->type
);
370 dp
= (u_char
*) TLV_DATA(pdtlv
);
371 tll
= EXTRACT_16BITS(&pdtlv
->length
) - TLV_HDRL
;
375 ("%s%s, length %d (data encapsulated %d Bytes)",
376 ib
, tok2str(ForCES_TLV
, NULL
, type
),
377 EXTRACT_16BITS(&pdtlv
->length
),
378 EXTRACT_16BITS(&pdtlv
->length
) - TLV_HDRL
);
380 rc
= pdata_print(dp
, tll
, op_msk
, indent
+ 1);
381 pdtlv
= GO_NXT_TLV(pdtlv
, len
);
386 ("\n\t\tMessy PATHDATA TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
387 EXTRACT_16BITS(&pdtlv
->type
), tll
- EXTRACT_16BITS(&pdtlv
->length
));
394 fputs("[|forces]", stdout
);
399 invoptlv_print(register const u_char
* pptr
, register u_int len
,
400 u_int16_t op_msk _U_
, int indent
)
402 char *ib
= indent_pr(indent
, 1);
404 printf("%sData[", &ib
[1]);
405 hex_print_with_offset(ib
, pptr
, len
, 0);
411 int otlv_print(struct forces_tlv
*otlv
, u_int16_t op_msk _U_
, int indent
)
414 register const u_char
*dp
= (u_char
*) TLV_DATA(otlv
);
417 char *ib
= indent_pr(indent
, 0);
421 type
= EXTRACT_16BITS(&otlv
->type
);
422 tll
= EXTRACT_16BITS(&otlv
->length
) - TLV_HDRL
;
423 ops
= get_forces_optlv_h(type
);
425 printf("%sOper TLV %s(0x%x) length %d\n", ib
, ops
->s
, type
,
426 EXTRACT_16BITS(&otlv
->length
));
428 /* empty TLVs like COMMIT and TRCOMMIT are empty, we stop here .. */
429 if (!ops
->flags
& ZERO_TTLV
) {
430 if (tll
!= 0) /* instead of "if (tll)" - for readability .. */
431 printf("%s: Illegal - MUST be empty\n", ops
->s
);
434 /* rest of ops must at least have 12B {pathinfo} */
435 if (tll
< OP_MIN_SIZ
) {
436 printf("\t\tOper TLV %s(0x%x) length %d\n", ops
->s
, type
,
437 EXTRACT_16BITS(&otlv
->length
));
438 printf("\t\tTruncated data size %d minimum required %d\n", tll
,
440 return invoptlv_print(dp
, tll
, ops
->op_msk
, indent
);
444 rc
= ops
->print(dp
, tll
, ops
->op_msk
, indent
+ 1);
448 fputs("[|forces]", stdout
);
455 asttlv_print(register const u_char
* pptr
, register u_int len
,
456 u_int16_t op_msk _U_
, int indent
)
460 u_int dlen
= len
- TLV_HDRL
;
461 char *ib
= indent_pr(indent
, 0);
462 if (dlen
!= ASTDLN
) {
463 printf("illegal ASTresult-TLV: %d bytes!\n", dlen
);
467 rescode
= EXTRACT_32BITS(pptr
);
468 if (rescode
> ASTMCD
) {
469 printf("illegal ASTresult result code: %d!\n", rescode
);
474 printf("Teardown reason:\n%s", ib
);
477 printf("Normal Teardown");
480 printf("Loss of Heartbeats");
483 printf("Out of bandwidth");
486 printf("Out of Memory");
489 printf("Application Crash");
492 printf("Unknown Teardown reason");
495 printf("(%x)\n%s", rescode
, ib
);
500 fputs("[|forces]", stdout
);
507 asrtlv_print(register const u_char
* pptr
, register u_int len
,
508 u_int16_t op_msk _U_
, int indent
)
512 u_int dlen
= len
- TLV_HDRL
;
513 char *ib
= indent_pr(indent
, 0);
515 if (dlen
!= ASRDLN
) { /* id, instance, oper tlv */
516 printf("illegal ASRresult-TLV: %d bytes!\n", dlen
);
520 rescode
= EXTRACT_32BITS(pptr
);
522 if (rescode
> ASRMCD
) {
523 printf("illegal ASRresult result code: %d!\n", rescode
);
534 printf("FE ID invalid ");
537 printf("permission denied ");
543 printf("(%x)\n%s", rescode
, ib
);
548 fputs("[|forces]", stdout
);
553 gentltlv_print(register const u_char
* pptr _U_
, register u_int len
,
554 u_int16_t op_msk _U_
, int indent _U_
)
556 u_int dlen
= len
- TLV_HDRL
;
557 if (dlen
< 4) { /* at least 32 bits must exist */
558 printf("truncated TLV: %d bytes missing! ", 4 - dlen
);
566 print_metailv(register const u_char
* pptr
, register u_int len
,
567 u_int16_t op_msk _U_
, int indent
)
569 u_int dlen
= len
- ILV_HDRL
;
571 char *ib
= indent_pr(indent
, 0);
572 /* XXX: check header length */
573 struct forces_ilv
*ilv
= (struct forces_ilv
*)pptr
;
576 printf("\n%sMetaID 0x%x length %d\n", ib
, EXTRACT_32BITS(&ilv
->type
),
577 EXTRACT_32BITS(&ilv
->length
));
578 hex_print_with_offset("\n\t\t\t\t[", ILV_DATA(ilv
), tll
, 0);
582 fputs("[|forces]", stdout
);
587 print_metatlv(register const u_char
* pptr
, register u_int len
,
588 u_int16_t op_msk _U_
, int indent
)
590 u_int dlen
= len
- TLV_HDRL
;
591 char *ib
= indent_pr(indent
, 0);
593 struct forces_ilv
*ilv
= (struct forces_ilv
*)pptr
;
596 printf("\n%s METADATA\n", ib
);
599 invilv
= ilv_valid(ilv
, tll
);
602 print_metailv((u_char
*) ilv
, tll
, 0, indent
+ 1);
604 ilv
= GO_NXT_ILV(ilv
, tll
);
610 fputs("[|forces]", stdout
);
617 print_reddata(register const u_char
* pptr
, register u_int len
,
618 u_int16_t op_msk _U_
, int indent _U_
)
620 u_int dlen
= len
- TLV_HDRL
;
623 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
625 printf("\n\t\t Redirect DATA\n");
626 if (dlen
<= RD_MIN
) {
627 printf("\n\t\ttruncated Redirect data: %d bytes missing! ",
633 invtlv
= tlv_valid(tlv
, tll
);
636 printf("Redir data type 0x%x len %d\n", EXTRACT_16BITS(&tlv
->type
),
637 EXTRACT_16BITS(&tlv
->length
));
642 hex_print_with_offset("\n\t\t\t[", TLV_DATA(tlv
), tll
, 0);
646 fputs("[|forces]", stdout
);
651 redirect_print(register const u_char
* pptr
, register u_int len
,
652 u_int16_t op_msk _U_
, int indent
)
654 struct forces_tlv
*tlv
= (struct forces_tlv
*)pptr
;
655 u_int dlen
= len
- TLV_HDRL
;
659 if (dlen
<= RD_MIN
) {
660 printf("\n\t\ttruncated Redirect TLV: %d bytes missing! ",
668 invtlv
= tlv_valid(tlv
, tll
);
671 if (EXTRACT_16BITS(&tlv
->type
) == F_TLV_METD
) {
672 print_metatlv((u_char
*) TLV_DATA(tlv
), tll
, 0, indent
);
673 } else if ((EXTRACT_16BITS(&tlv
->type
) == F_TLV_REDD
)) {
674 print_reddata((u_char
*) TLV_DATA(tlv
), tll
, 0, indent
);
676 printf("Unknown REDIRECT TLV 0x%x len %d\n",
677 EXTRACT_16BITS(&tlv
->type
), EXTRACT_16BITS(&tlv
->length
));
680 tlv
= GO_NXT_TLV(tlv
, tll
);
685 ("\n\t\tMessy Redirect TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
686 EXTRACT_16BITS(&tlv
->type
), tll
- EXTRACT_16BITS(&tlv
->length
));
693 fputs("[|forces]", stdout
);
701 lfbselect_print(register const u_char
* pptr
, register u_int len
,
702 u_int16_t op_msk
, int indent
)
704 const struct forces_lfbsh
*lfbs
;
705 struct forces_tlv
*otlv
;
706 char *ib
= indent_pr(indent
, 0);
707 u_int dlen
= len
- TLV_HDRL
;
708 u_int tll
= dlen
- OP_OFF
;
711 if (dlen
<= OP_MIN
) { /* id, instance, oper tlv header .. */
712 printf("\n\t\ttruncated lfb selector: %d bytes missing! ",
717 lfbs
= (const struct forces_lfbsh
*)pptr
;
720 printf("\n%s%s(Classid %x) instance %x\n",
721 ib
, tok2str(ForCES_LFBs
, NULL
, EXTRACT_32BITS(&lfbs
->class)),
722 EXTRACT_32BITS(&lfbs
->class),
723 EXTRACT_32BITS(&lfbs
->instance
));
726 otlv
= (struct forces_tlv
*)(lfbs
+ 1);
731 invtlv
= tlv_valid(otlv
, tll
);
734 if (op_valid(EXTRACT_16BITS(&otlv
->type
), op_msk
)) {
735 otlv_print(otlv
, 0, indent
);
740 ("\t\tINValid oper-TLV type 0x%x length %d for this ForCES message\n",
741 EXTRACT_16BITS(&otlv
->type
), EXTRACT_16BITS(&otlv
->length
));
742 invoptlv_print((u_char
*)otlv
, tll
, 0, indent
);
744 otlv
= GO_NXT_TLV(otlv
, tll
);
749 ("\n\t\tMessy oper TLV header, type (0x%x)\n\t\texcess of %d Bytes ",
750 EXTRACT_16BITS(&otlv
->type
), tll
- EXTRACT_16BITS(&otlv
->length
));
757 fputs("[|forces]", stdout
);
762 forces_type_print(register const u_char
* pptr
, const struct forcesh
*fhdr _U_
,
763 register u_int mlen
, struct tom_h
*tops
)
765 struct forces_tlv
*tltlv
;
771 tll
= mlen
- sizeof(struct forcesh
);
774 if (tops
->flags
& ZERO_TTLV
) {
775 printf("<0x%x>Illegal Top level TLV!\n", tops
->flags
);
779 if (tops
->flags
& ZERO_MORE_TTLV
)
781 if (tops
->flags
& ONE_MORE_TTLV
) {
782 printf("\tTop level TLV Data missing!\n");
787 if (tops
->flags
& ZERO_TTLV
) {
791 ttlv
= tops
->flags
>> 4;
792 tltlv
= GET_TOP_TLV(pptr
);
794 /*XXX: 15 top level tlvs will probably be fine
795 You are nuts if you send more ;-> */
798 invtlv
= tlv_valid(tltlv
, tll
);
801 if (!ttlv_valid(EXTRACT_16BITS(&tltlv
->type
))) {
802 printf("\n\tInvalid ForCES Top TLV type=0x%x",
803 EXTRACT_16BITS(&tltlv
->type
));
808 printf("\t%s, length %d (data length %d Bytes)",
809 tok2str(ForCES_TLV
, NULL
, EXTRACT_16BITS(&tltlv
->type
)),
810 EXTRACT_16BITS(&tltlv
->length
), EXTRACT_16BITS(&tltlv
->length
) - 4);
812 rc
= tops
->print((u_char
*) TLV_DATA(tltlv
),
813 EXTRACT_16BITS(&tltlv
->length
), tops
->op_msk
, 9);
817 tltlv
= GO_NXT_TLV(tltlv
, tll
);
823 printf("\tMess TopTLV header: min %lu, total %d advertised %d ",
824 (unsigned long)sizeof(struct forces_tlv
),
825 tll
, EXTRACT_16BITS(&tltlv
->length
));
832 fputs("[|forces]", stdout
);
836 void forces_print(register const u_char
* pptr
, register u_int len
)
838 const struct forcesh
*fhdr
;
844 fhdr
= (const struct forcesh
*)pptr
;
846 if (!tom_valid(fhdr
->fm_tom
)) {
847 printf("Invalid ForCES message type %d\n", fhdr
->fm_tom
);
851 mlen
= ForCES_BLN(fhdr
);
853 tops
= get_forces_tom(fhdr
->fm_tom
);
854 if (tops
->v
== TOM_RSVD
) {
855 printf("\n\tUnknown ForCES message type=0x%x", fhdr
->fm_tom
);
859 printf("\n\tForCES %s ", tops
->s
);
860 if (!ForCES_HLN_VALID(mlen
, len
)) {
862 ("Illegal ForCES pkt len - min %lu, total recvd %d, advertised %d ",
863 (unsigned long)sizeof(struct forcesh
), len
, ForCES_BLN(fhdr
));
867 TCHECK2(*(pptr
+ 20), 4);
868 flg_raw
= EXTRACT_32BITS(pptr
+ 20);
870 printf("\n\tForCES Version %d len %uB flags 0x%08x ",
871 ForCES_V(fhdr
), mlen
, flg_raw
);
872 printf("\n\tSrcID 0x%x(%s) DstID 0x%x(%s) Correlator 0x%" PRIu64
,
873 ForCES_SID(fhdr
), ForCES_node(ForCES_SID(fhdr
)),
874 ForCES_DID(fhdr
), ForCES_node(ForCES_DID(fhdr
)),
875 EXTRACT_64BITS(fhdr
->fm_cor
));
880 ("\n\tForCES flags:\n\t %s(0x%x), prio=%d, %s(0x%x),\n\t %s(0x%x), %s(0x%x)\n",
881 ForCES_ACKp(ForCES_ACK(fhdr
)), ForCES_ACK(fhdr
),
883 ForCES_EMp(ForCES_EM(fhdr
)), ForCES_EM(fhdr
),
884 ForCES_ATp(ForCES_AT(fhdr
)), ForCES_AT(fhdr
),
885 ForCES_TPp(ForCES_TP(fhdr
)), ForCES_TP(fhdr
));
887 ("\t Extra flags: rsv(b5-7) 0x%x rsv(b13-31) 0x%x\n",
888 ForCES_RS1(fhdr
), ForCES_RS2(fhdr
));
890 rc
= forces_type_print(pptr
, fhdr
, mlen
, tops
);
893 hex_print_with_offset("\n\t[", pptr
, len
, 0);
899 printf("\n\t Raw ForCES message\n\t [");
900 hex_print_with_offset("\n\t ", pptr
, len
, 0);
907 fputs("[|forces]", stdout
);