XINU
pdump.c
Go to the documentation of this file.
1 /* pdump.c - packet dump function */
2 
3 #include <xinu.h>
4 
5 /*------------------------------------------------------------------------
6  * pdump - dump a packet assuming all fields are in network byte order
7  *------------------------------------------------------------------------
8  */
9 void pdump(struct netpacket *pptr)
10 {
11  struct arppacket *aptr;
12 
13  kprintf("%02x:%02x:%02x:%02x:%02x:%02x >",
14  pptr->net_ethsrc[0],
15  pptr->net_ethsrc[1],
16  pptr->net_ethsrc[2],
17  pptr->net_ethsrc[3],
18  pptr->net_ethsrc[4],
19  pptr->net_ethsrc[5]
20  );
21  kprintf(" %02x:%02x:%02x:%02x:%02x:%02x, ",
22  pptr->net_ethdst[0],
23  pptr->net_ethdst[1],
24  pptr->net_ethdst[2],
25  pptr->net_ethdst[3],
26  pptr->net_ethdst[4],
27  pptr->net_ethdst[5]
28  );
29 
30  kprintf("ethertype ");
31 
32  switch (ntohs(pptr->net_ethtype)) {
33 
34  case 0x0806:
35  kprintf("ARP (0x%04x), length %d: ",
36  ntohs(pptr->net_ethtype),
37  sizeof(struct arppacket));
38  aptr = (struct arppacket *)pptr;
39 
40  if ( (ntohs(aptr->arp_htype) != ARP_HTYPE) ||
41  (ntohs(aptr->arp_ptype) != ARP_PTYPE) ) {
42  break;
43  }
44 
45  kprintf("hard addr len=%d), proto addr len=%d), ",
46  aptr->arp_hlen,
47  aptr->arp_plen);
48 
49  if (ntohs(aptr->arp_op) == ARP_OP_REQ) {
50  kprintf("Request who-has %d.%d.%d.%d tell %d.%d.%d.%d, ",
51  (ntohl(aptr->arp_tarpa)>>24)&0xff,
52  (ntohl(aptr->arp_tarpa)>>16)&0xff,
53  (ntohl(aptr->arp_tarpa)>>8)&0xff,
54  ntohl(aptr->arp_tarpa)&0xff,
55  (ntohl(aptr->arp_sndpa)>>24)&0xff,
56  (ntohl(aptr->arp_sndpa)>>16)&0xff,
57  (ntohl(aptr->arp_sndpa)>>8)&0xff,
58  ntohl(aptr->arp_sndpa)&0xff);
59  } else if (ntohs(aptr->arp_op) == ARP_OP_RPLY) {
60  kprintf("Reply %d.%d.%d.%d is-at %02x:%02x:%02x:%02x:%02x:%02x, ",
61  (ntohl(aptr->arp_sndpa)>>24)&0xff,
62  (ntohl(aptr->arp_sndpa)>>16)&0xff,
63  (ntohl(aptr->arp_sndpa)>>8)&0xff,
64  ntohl(aptr->arp_sndpa)&0xff,
65  aptr->arp_sndha[0],
66  aptr->arp_sndha[1],
67  aptr->arp_sndha[2],
68  aptr->arp_sndha[3],
69  aptr->arp_sndha[4],
70  aptr->arp_sndha[5]);
71  } else {
72  break;
73  }
74 
75  kprintf("length %d\n", sizeof(struct arppacket) - ETH_HDR_LEN);
76  break;
77 
78  case 0x0800:
79  kprintf("IPv4 (0x%04x), length %d: ",
80  ntohs(pptr->net_ethtype),
81  ntohs(pptr->net_iplen) + ETH_HDR_LEN);
82 
83  kprintf("(");
84  kprintf("tos 0x%01x, ttl %d, id %d, offset %d ",
85  pptr->net_iptos,
86  pptr->net_ipttl,
87  ntohs(pptr->net_ipid),
88  (ntohs(pptr->net_ipfrag) & 0x1fff));
89 
90  kprintf("flags ");
91  if (ntohs(pptr->net_ipfrag) & 0x4000)
92  kprintf("[DF], ");
93  else if (ntohs(pptr->net_ipfrag) & 0x2000)
94  kprintf("[MF], " );
95  else
96  kprintf("[none], ");
97 
98  kprintf("[ip checksum %s], ",
99  ipcksum(pptr) == 0 ? "ok" : "fail");
100 
101  if (pptr->net_ipproto == IP_UDP) {
102  kprintf("proto UDP (%d), length %d",
103  pptr->net_ipproto, ntohs(pptr->net_iplen));
104  kprintf(")\n");
105  kprintf("\t%d.%d.%d.%d > ",
106  (ntohl(pptr->net_ipsrc)>>24)&0xff,
107  (ntohl(pptr->net_ipsrc)>>16)&0xff,
108  (ntohl(pptr->net_ipsrc)>>8)&0xff,
109  (ntohl(pptr->net_ipsrc)&0xff));
110  kprintf("%d.%d.%d.%d: ",
111  (ntohl(pptr->net_ipdst)>>24)&0xff,
112  (ntohl(pptr->net_ipdst)>>16)&0xff,
113  (ntohl(pptr->net_ipdst)>>8)&0xff,
114  (ntohl(pptr->net_ipdst)&0xff));
115  kprintf("[udp checksum none] ");
116  kprintf("UDP, src port %d, dst port %d, length %d\n",
117  ntohs(pptr->net_udpsport),
118  ntohs(pptr->net_udpdport),
119  ntohs(pptr->net_udplen) - UDP_HDR_LEN);
120  break;
121  } else if (pptr->net_ipproto == IP_ICMP) {
122  kprintf("proto ICMP (%d), length %d",
123  pptr->net_ipproto, ntohs(pptr->net_iplen));
124  kprintf(")\n");
125  kprintf("\t%d.%d.%d.%d > ",
126  (ntohl(pptr->net_ipsrc)>>24)&0xff,
127  (ntohl(pptr->net_ipsrc)>>16)&0xff,
128  (ntohl(pptr->net_ipsrc)>>8)&0xff,
129  (ntohl(pptr->net_ipsrc)&0xff));
130  kprintf("%d.%d.%d.%d: ",
131  (ntohl(pptr->net_ipdst)>>24)&0xff,
132  (ntohl(pptr->net_ipdst)>>16)&0xff,
133  (ntohl(pptr->net_ipdst)>>8)&0xff,
134  (ntohl(pptr->net_ipdst)&0xff));
135 
136  if (pptr->net_ictype == ICMP_ECHOREQST)
137  kprintf("ICMP echo request, ");
138  else if (pptr->net_ictype == ICMP_ECHOREPLY)
139  kprintf("ICMP echo reply, ");
140  else
141  break;
142 
143  kprintf("id %d, seq %d\n",
144  ntohs(pptr->net_icident),
145  ntohs(pptr->net_icseq));
146 
147  break;
148  }
149  else
150  break;
151  default:
152  kprintf("unknown\n");
153  break;
154 
155  }
156 
157  return;
158 }
159 
160 /*------------------------------------------------------------------------
161  * pdumph - dump a packet assuming all fields are in host byte order
162  *------------------------------------------------------------------------
163  */
164 void pdumph(struct netpacket *pptr)
165 {
166  struct arppacket *aptr;
167 
168  kprintf("%02x:%02x:%02x:%02x:%02x:%02x >",
169  pptr->net_ethsrc[0],
170  pptr->net_ethsrc[1],
171  pptr->net_ethsrc[2],
172  pptr->net_ethsrc[3],
173  pptr->net_ethsrc[4],
174  pptr->net_ethsrc[5]
175  );
176  kprintf(" %02x:%02x:%02x:%02x:%02x:%02x, ",
177  pptr->net_ethdst[0],
178  pptr->net_ethdst[1],
179  pptr->net_ethdst[2],
180  pptr->net_ethdst[3],
181  pptr->net_ethdst[4],
182  pptr->net_ethdst[5]
183  );
184 
185  kprintf("ethertype ");
186 
187  switch (pptr->net_ethtype) {
188 
189  case 0x0806:
190  kprintf("ARP (0x%04x), length %d: ",
191  pptr->net_ethtype,
192  sizeof(struct arppacket));
193  aptr = (struct arppacket *)pptr;
194 
195  if ( (aptr->arp_htype != ARP_HTYPE) ||
196  (aptr->arp_ptype != ARP_PTYPE) ) {
197  break;
198  }
199 
200  kprintf("hard addr len=%d), proto addr len=%d), ",
201  aptr->arp_hlen,
202  aptr->arp_plen);
203 
204  if (aptr->arp_op == ARP_OP_REQ) {
205  kprintf("Request who-has %d.%d.%d.%d tell %d.%d.%d.%d, ",
206  (aptr->arp_tarpa>>24)&0xff,
207  (aptr->arp_tarpa>>16)&0xff,
208  (aptr->arp_tarpa>>8)&0xff,
209  aptr->arp_tarpa&0xff,
210  (aptr->arp_sndpa>>24)&0xff,
211  (aptr->arp_sndpa>>16)&0xff,
212  (aptr->arp_sndpa>>8)&0xff,
213  aptr->arp_sndpa&0xff);
214  } else if (aptr->arp_op == ARP_OP_RPLY) {
215  kprintf("Reply %d.%d.%d.%d is-at %02x:%02x:%02x:%02x:%02x:%02x, ",
216  (aptr->arp_sndpa>>24)&0xff,
217  (aptr->arp_sndpa>>16)&0xff,
218  (aptr->arp_sndpa>>8)&0xff,
219  aptr->arp_sndpa&0xff,
220  aptr->arp_sndha[0],
221  aptr->arp_sndha[1],
222  aptr->arp_sndha[2],
223  aptr->arp_sndha[3],
224  aptr->arp_sndha[4],
225  aptr->arp_sndha[5]);
226  } else {
227  break;
228  }
229 
230  kprintf("length %d\n", sizeof(struct arppacket) - ETH_HDR_LEN);
231  break;
232 
233  case 0x0800:
234  kprintf("IPv4 (0x%04x), length %d: ",
235  pptr->net_ethtype,
236  pptr->net_iplen + ETH_HDR_LEN);
237 
238  kprintf("(");
239  kprintf("tos 0x%01x, ttl %d, id %d, offset %d ",
240  pptr->net_iptos,
241  pptr->net_ipttl,
242  pptr->net_ipid,
243  pptr->net_ipfrag & 0x1fff);
244 
245  kprintf("flags ");
246  if (pptr->net_ipfrag & 0x4000)
247  kprintf("[DF], ");
248  else if (pptr->net_ipfrag & 0x2000)
249  kprintf("[MF], " );
250  else
251  kprintf("[none], ");
252 
253  kprintf("[ip checksum %s], ",
254  ipcksum(pptr) == 0 ? "ok" : "fail");
255 
256  if (pptr->net_ipproto == IP_UDP) {
257  kprintf("proto UDP (%d), length %d",
258  pptr->net_ipproto, pptr->net_iplen);
259  kprintf(")\n");
260  kprintf("\t%d.%d.%d.%d > ",
261  (pptr->net_ipsrc>>24)&0xff,
262  (pptr->net_ipsrc>>16)&0xff,
263  (pptr->net_ipsrc>>8)&0xff,
264  (pptr->net_ipsrc&0xff));
265  kprintf("%d.%d.%d.%d: ",
266  (pptr->net_ipdst>>24)&0xff,
267  (pptr->net_ipdst>>16)&0xff,
268  (pptr->net_ipdst>>8)&0xff,
269  (pptr->net_ipdst&0xff));
270  kprintf("[udp checksum none] ");
271  kprintf("UDP, src port %d, dst port %d, length %d\n",
272  pptr->net_udpsport,
273  pptr->net_udpdport,
274  pptr->net_udplen - UDP_HDR_LEN);
275  break;
276  } else if (pptr->net_ipproto == IP_ICMP) {
277  kprintf("proto ICMP (%d), length %d",
278  pptr->net_ipproto, pptr->net_iplen);
279  kprintf(")\n");
280  kprintf("\t%d.%d.%d.%d > ",
281  (pptr->net_ipsrc>>24)&0xff,
282  (pptr->net_ipsrc>>16)&0xff,
283  (pptr->net_ipsrc>>8)&0xff,
284  (pptr->net_ipsrc&0xff));
285  kprintf("%d.%d.%d.%d: ",
286  (pptr->net_ipsrc>>24)&0xff,
287  (pptr->net_ipsrc>>16)&0xff,
288  (pptr->net_ipsrc>>8)&0xff,
289  (pptr->net_ipsrc&0xff));
290 
291  if (pptr->net_ictype == ICMP_ECHOREQST)
292  kprintf("ICMP echo request, ");
293  else if (pptr->net_ictype == ICMP_ECHOREPLY)
294  kprintf("ICMP echo reply, ");
295  else
296  break;
297 
298  kprintf("id %d, seq %d\n",
299  pptr->net_icident,
300  pptr->net_icseq);
301  kprintf("icmp ckeckcum %s\n",
302  icmp_cksum((char *)&pptr->net_ictype,
303  ntohs(pptr->net_iplen)-IP_HDR_LEN)==0?
304  "OK":"failed");
305  break;
306  }
307  else
308  break;
309  default:
310  kprintf("unknown\n");
311  break;
312 
313  }
314 
315  return;
316 }
syscall kprintf(char *fmt,...)
ポーリングI/Oを使用して、フォーマットされた文字列をコンソールに出力する。
Definition: kprintf.c:98
#define IP_UDP
IP向けのUDPプロトコルタイプ
Definition: ip.h:16
byte net_ictype
Definition: net.h:39
uint16 net_ethtype
Definition: net.h:19
byte arp_plen
ARPプロトコルアドレス長さ
Definition: arp.h:54
#define ARP_PTYPE
IPプロトコルタイプ
Definition: arp.h:14
#define ICMP_ECHOREQST
Definition: icmp.h:17
全てのシステムヘッダファイルをインクルードする。
byte net_ethdst[ETH_ADDR_LEN]
Definition: net.h:17
uint16 net_ipid
Definition: net.h:23
byte arp_hlen
ARPハードウェアアドレス長さ
Definition: arp.h:52
#define ARP_OP_RPLY
リプライオペコード
Definition: arp.h:18
uint16 net_ipfrag
Definition: net.h:24
#define IP_HDR_LEN
IPヘッダのバイト数。
Definition: ip.h:20
#define ICMP_ECHOREPLY
Definition: icmp.h:16
uint16 arp_ptype
ARPプロトコルタイプ
Definition: arp.h:50
uint16 net_udpsport
Definition: net.h:32
byte net_ethsrc[ETH_ADDR_LEN]
Definition: net.h:18
uint16 ipcksum(struct netpacket *)
Definition: ip.c:286
uint16 net_iplen
Definition: net.h:22
void pdump(struct netpacket *pptr)
Definition: pdump.c:9
#define ARP_HTYPE
Ethernetハードウェアタイプ
Definition: arp.h:12
#define IP_ICMP
IP向けのICMPプロトコルタイプ
Definition: ip.h:14
uint16 icmp_cksum(char *, int32)
Definition: icmp.c:359
byte arp_sndha[ARP_HALEN]
ARP送信者のEthernetアドレス
Definition: arp.h:58
#define ntohl(x)
Definition: prototypes.h:623
uint16 net_icseq
Definition: net.h:43
IP&Ethernet用のARPパケットフォーマット
Definition: arp.h:39
uint16 net_udplen
Definition: net.h:34
#define ntohs(x)
Definition: prototypes.h:622
#define ETH_HDR_LEN
Definition: ether.h:22
#define ARP_OP_REQ
リクエストオペコード
Definition: arp.h:16
byte net_iptos
Definition: net.h:21
Definition: net.h:16
uint32 net_ipsrc
Definition: net.h:28
uint32 net_ipdst
Definition: net.h:29
void pdumph(struct netpacket *pptr)
Definition: pdump.c:164
uint16 net_udpdport
Definition: net.h:33
uint16 net_icident
Definition: net.h:42
uint32 arp_tarpa
ARPターゲットのIPアドレス
Definition: arp.h:64
byte net_ipproto
Definition: net.h:26
byte net_ipttl
Definition: net.h:25
uint16 arp_htype
ARPハードウェアタイプ
Definition: arp.h:48
uint32 arp_sndpa
ARP送信者のIPアドレス
Definition: arp.h:60
uint16 arp_op
ARPオペレーション
Definition: arp.h:56
#define UDP_HDR_LEN
Definition: udp.h:18