File: ping.ml

package info (click to toggle)
ocaml-bitstring 2.0.2-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 1,276 kB
  • ctags: 492
  • sloc: ml: 3,360; sh: 377; makefile: 324; ansic: 113
file content (67 lines) | stat: -rw-r--r-- 2,142 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
(* Read in IPv4 and IPv6 ping packets and display them.
 * $Id: ping.ml 142 2008-07-17 15:45:56Z richard.wm.jones $
 *)

open Printf

let display pkt =
  bitmatch pkt with
  (* IPv4 packet header *)
  | { 4 : 4; hdrlen : 4; tos : 8; length : 16;
      identification : 16; flags : 3; fragoffset : 13;
      ttl : 8; protocol : 8; checksum : 16;
      source : 32;
      dest : 32;
      options : (hdrlen-5)*32 : bitstring;
      payload : -1 : bitstring } ->

    printf "IPv4:\n";
    printf "  header length: %d * 32 bit words\n" hdrlen;
    printf "  type of service: %d\n" tos;
    printf "  packet length: %d bytes\n" length;
    printf "  identification: %d\n" identification;
    printf "  flags: %d\n" flags;
    printf "  fragment offset: %d\n" fragoffset;
    printf "  ttl: %d\n" ttl;
    printf "  protocol: %d\n" protocol;
    printf "  checksum: %d\n" checksum;
    printf "  source: %lx  dest: %lx\n" source dest;
    printf "  header options + padding:\n";
    Bitstring.hexdump_bitstring stdout options;
    printf "  packet payload:\n";
    Bitstring.hexdump_bitstring stdout payload

  (* IPv6 packet header *)
  | { 6 : 4; tclass : 8; flow : 20;
      length : 16; nexthdr : 8; ttl : 8;
      source : 128 : bitstring;
      dest : 128 : bitstring;
      payload : -1 : bitstring } ->

    printf "IPv6:\n";
    printf "  traffic class: %d\n" tclass;
    printf "  flow label: %d\n" flow;
    printf "  packet (payload) length: %d bytes\n" length;
    printf "  next header: %d\n" nexthdr;
    printf "  ttl: %d\n" ttl;
    printf "  source address:\n";
    Bitstring.hexdump_bitstring stdout source;
    printf "  destination address:\n";
    Bitstring.hexdump_bitstring stdout dest;
    printf "packet payload:\n";
    Bitstring.hexdump_bitstring stdout payload

  | { version : 4 } ->
    eprintf "unknown IP version %d\n" version;
    exit 1

  | { _ } as pkt ->
    eprintf "data is smaller than one nibble:\n";
    Bitstring.hexdump_bitstring stderr pkt;
    exit 1

let () =
  let pkt = Bitstring.bitstring_of_file "ping.ipv4" in
  display pkt;
  let pkt = Bitstring.bitstring_of_file "ping.ipv6" in
  display pkt