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