1 /*
2 NETWIB
3 Network library
4 Copyright(c) 1999-2010 Laurent Constantin
5 -----
6
7 Main server : http://www.laurentconstantin.com/
8 Backup server : http://laurentconstantin.free.fr/
9 [my current email address is on the web servers]
10
11 -----
12 This file is part of Netwib.
13
14 Netwib is free software: you can redistribute it and/or modify
15 it under the terms of the GNU General Public License version 3
16 as published by the Free Software Foundation.
17
18 Netwib is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details (http://www.gnu.org/).
22
23 ------------------------------------------------------------------------
24 */
25
26 #include <netwib/inc/maininc.h>
27
28 /*-------------------------------------------------------------*/
netwib_tcphdr_show(netwib_consttcphdr * ptcphdr,netwib_encodetype encodetype,netwib_buf * pbuf)29 netwib_err netwib_tcphdr_show(netwib_consttcphdr *ptcphdr,
30 netwib_encodetype encodetype,
31 netwib_buf *pbuf)
32 {
33 netwib_char flags[9], *pc;
34 netwib_buf buf;
35 netwib_encodetype_context context;
36
37 switch(encodetype) {
38 case NETWIB_ENCODETYPE_SYNTH :
39 pc = flags;
40 if (ptcphdr->syn) {
41 *pc++ = 's';
42 }
43 if (ptcphdr->ack) {
44 *pc++ = 'a';
45 }
46 if (ptcphdr->fin) {
47 *pc++ = 'f';
48 }
49 if (ptcphdr->rst) {
50 *pc++ = 'r';
51 }
52 if (ptcphdr->psh) {
53 *pc++ = 'p';
54 }
55 if (ptcphdr->urg) {
56 *pc++ = 'u';
57 }
58 if (ptcphdr->cwr) {
59 *pc++ = 'c';
60 }
61 if (ptcphdr->ece) {
62 *pc++ = 'e';
63 }
64 *pc = '\0';
65 netwib_er(netwib_buf_append_fmt(pbuf, "tcp%{port}->%{port}:%s",
66 ptcphdr->src, ptcphdr->dst, flags));
67 break;
68 case NETWIB_ENCODETYPE_ARRAY :
69 netwib_er(netwib_show_array_head("TCP", pbuf));
70 netwib_er(netwib_show_array_line_begin(pbuf));
71 netwib_er(netwib_show_array_text16("source port", pbuf));
72 netwib_er(netwib_show_array_text16("destination port", pbuf));
73 netwib_er(netwib_show_array_line_end(pbuf));
74 netwib_er(netwib_show_array_line_begin(pbuf));
75 netwib_er(netwib_show_array_num16((netwib_uint16)ptcphdr->src,
76 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
77 pbuf));
78 netwib_er(netwib_show_array_num16((netwib_uint16)ptcphdr->dst,
79 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
80 pbuf));
81 netwib_er(netwib_show_array_line_end(pbuf));
82 netwib_er(netwib_show_array_text32("seqnum", pbuf));
83 netwib_er(netwib_show_array_num32(ptcphdr->seqnum,
84 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
85 pbuf));
86 netwib_er(netwib_show_array_text32("acknum", pbuf));
87 netwib_er(netwib_show_array_num32(ptcphdr->acknum,
88 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
89 pbuf));
90 netwib_er(netwib_show_array_line_begin(pbuf));
91 netwib_er(netwib_show_array_text4("doff", pbuf));
92 netwib_er(netwib_show_array_text1("r", pbuf));
93 netwib_er(netwib_show_array_text1("r", pbuf));
94 netwib_er(netwib_show_array_text1("r", pbuf));
95 netwib_er(netwib_show_array_text1("r", pbuf));
96 netwib_er(netwib_show_array_text1("C", pbuf));
97 netwib_er(netwib_show_array_text1("E", pbuf));
98 netwib_er(netwib_show_array_text1("U", pbuf));
99 netwib_er(netwib_show_array_text1("A", pbuf));
100 netwib_er(netwib_show_array_text1("P", pbuf));
101 netwib_er(netwib_show_array_text1("R", pbuf));
102 netwib_er(netwib_show_array_text1("S", pbuf));
103 netwib_er(netwib_show_array_text1("F", pbuf));
104 netwib_er(netwib_show_array_text16("window", pbuf));
105 netwib_er(netwib_show_array_line_end(pbuf));
106 netwib_er(netwib_show_array_line_begin(pbuf));
107 netwib_er(netwib_show_array_num4(ptcphdr->doff,
108 NETWIB_SHOW_ARRAY_NUMTYPE_DEC, pbuf));
109 netwib_er(netwib_show_array_num1(ptcphdr->reserved1, pbuf));
110 netwib_er(netwib_show_array_num1(ptcphdr->reserved2, pbuf));
111 netwib_er(netwib_show_array_num1(ptcphdr->reserved3, pbuf));
112 netwib_er(netwib_show_array_num1(ptcphdr->reserved4, pbuf));
113 netwib_er(netwib_show_array_num1(ptcphdr->cwr, pbuf));
114 netwib_er(netwib_show_array_num1(ptcphdr->ece, pbuf));
115 netwib_er(netwib_show_array_num1(ptcphdr->urg, pbuf));
116 netwib_er(netwib_show_array_num1(ptcphdr->ack, pbuf));
117 netwib_er(netwib_show_array_num1(ptcphdr->psh, pbuf));
118 netwib_er(netwib_show_array_num1(ptcphdr->rst, pbuf));
119 netwib_er(netwib_show_array_num1(ptcphdr->syn, pbuf));
120 netwib_er(netwib_show_array_num1(ptcphdr->fin, pbuf));
121 netwib_er(netwib_show_array_num16(ptcphdr->window,
122 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
123 pbuf));
124 netwib_er(netwib_show_array_line_end(pbuf));
125 netwib_er(netwib_show_array_line_begin(pbuf));
126 netwib_er(netwib_show_array_text16("checksum", pbuf));
127 netwib_er(netwib_show_array_text16("urgptr", pbuf));
128 netwib_er(netwib_show_array_line_end(pbuf));
129 netwib_er(netwib_show_array_line_begin(pbuf));
130 netwib_er(netwib_show_array_num16(ptcphdr->check,
131 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
132 pbuf));
133 netwib_er(netwib_show_array_num16(ptcphdr->urgptr,
134 NETWIB_SHOW_ARRAY_NUMTYPE_HEXADEC,
135 pbuf));
136 netwib_er(netwib_show_array_line_end(pbuf));
137 break;
138 default :
139 netwib_er(netwib_buf_init_mallocdefault(&buf));
140 netwib_er(netwib_pkt_append_tcphdr(ptcphdr, &buf));
141 netwib_er(netwib_buf_encode(&buf, encodetype, pbuf));
142 netwib_er(netwib_buf_close(&buf));
143 break;
144 }
145
146 if (netwib__buf_ref_data_size(&ptcphdr->opts)) {
147 netwib_er(netwib_buf_encode_transition_init(&context));
148 netwib_er(netwib_buf_encode_transition(&context, encodetype, pbuf));
149 netwib_er(netwib_buf_encode_transition(&context, encodetype, pbuf));
150 netwib_er(netwib_tcpopts_show(&ptcphdr->opts, encodetype, pbuf));
151 }
152
153 return(NETWIB_ERR_OK);
154 }
155