netshovel

Network Archaeology library for Go
git clone https://git.woozle.org/neale/netshovel.git

commit
b9f0241
parent
ba891c3
author
Neale Pickett
date
2020-09-24 18:58:15 -0600 MDT
Fix header formatting
4 files changed,  +103, -13
A go.mod
A go.sum
A go.mod
+5, -0
1@@ -0,0 +1,5 @@
2+module github.com/dirtbags/netshovel
3+
4+go 1.13
5+
6+require github.com/google/gopacket v1.1.18
A go.sum
+7, -0
1@@ -0,0 +1,7 @@
2+github.com/google/gopacket v1.1.18 h1:lum7VRA9kdlvBi7/v2p7/zcbkduHaCH/SVVyurs7OpY=
3+github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
4+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
6+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
7+golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
8+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
M packet.go
+31, -13
 1@@ -91,6 +91,9 @@ func (pkt *Packet) DescribeFields() string {
 2 }
 3 
 4 func center(s string, w int) string {
 5+	if w < 3 {
 6+		return "?"
 7+	}
 8 	if len(s) > w {
 9 		s = s[0:w-3] + "…"
10 	}
11@@ -100,39 +103,54 @@ func center(s string, w int) string {
12 // DescribeHeader returns a multi-line string describing this packet's header structure
13 func (pkt *Packet) DescribeHeader() string {
14 	out := new(strings.Builder)
15-	fmt.Fprintln(out, " 0                               1                            ")
16-	fmt.Fprintln(out, " mo0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f")
17+	out.WriteString(" 0                               1\n")
18+	out.WriteString(" 0 1 2 3 4 5 6 7 8 9 a b c d e f 0 1 2 3 4 5 6 7 8 9 a b c d e f\n")
19+	out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
20 
21 	bitOffset := 0
22 	for _, f := range pkt.header {
23 		bits := f.bits
24 		for bits > 0 {
25-			if bitOffset == 0 {
26-				fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
27-			}
28-
29 			linebits := bits
30 			if linebits+bitOffset > 0x20 {
31 				linebits = 0x20 - bitOffset
32 			}
33 
34 			// Generate centered string
35-			// TODO: right-align value, center name
36-			nameval := fmt.Sprintf("%s (0x%x)", f.name, f.value)
37-			fmt.Fprintf(out, "|%s", center(nameval, linebits*2-1))
38+			val := fmt.Sprintf("0x%x", f.value)
39+			nameval := f.name
40+			if f.bits == bits {
41+				out.WriteString("|")
42+			} else {
43+				out.WriteString(" ")
44+				val = ""
45+				nameval = "..."
46+			}
47+			out.WriteString(center(nameval, linebits*2-len(val)-2))
48+			out.WriteString(val)
49+			out.WriteString(" ")
50 
51 			bitOffset += linebits
52 			bits -= linebits
53-			if linebits == 0x20 {
54-				fmt.Fprintln(out, "|")
55+			if bitOffset == 0x20 {
56+				if bits == 0 {
57+					out.WriteString("|")
58+				} else {
59+					out.WriteString(" ")
60+				}
61+				out.WriteString("\n")
62+				out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
63 				bitOffset = 0
64 			}
65 		}
66 	}
67 	if bitOffset > 0 {
68-		fmt.Fprintln(out, "|")
69+		out.WriteString("|\n")
70+		for o := 0; o < bitOffset; o++ {
71+			out.WriteString("+-")
72+		}
73+		out.WriteString("+\n")
74 	}
75-	fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
76 	return out.String()
77 }
78 
A packet_test.go
+60, -0
 1@@ -0,0 +1,60 @@
 2+package netshovel
 3+
 4+import (
 5+	"strings"
 6+	"testing"
 7+
 8+	"github.com/dirtbags/netshovel/gapstring"
 9+)
10+
11+// BUG(neale): The DescribeHeader test is too simplistic.
12+func TestHeaders(t *testing.T) {
13+	pkt := NewPacket()
14+	pkt.Payload = gapstring.OfBytes([]byte{0, 1, 0, 1, 42, 0xff, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64})
15+
16+	a, err := pkt.Uint16LE("le")
17+	if err != nil {
18+		t.Error(err)
19+	}
20+	if a != 0x0100 {
21+		t.Error("Uint16LE", a)
22+	}
23+
24+	b, err := pkt.Uint16BE("be")
25+	if err != nil {
26+		t.Error(err)
27+	}
28+	if b != 0x0001 {
29+		t.Error("Uint16BE", b)
30+	}
31+
32+	fnord, err := pkt.Uint8("fnord")
33+	if err != nil {
34+		t.Error(err)
35+	}
36+	if fnord != 42 {
37+		t.Error("Uint8", fnord)
38+	}
39+
40+	biggun, err := pkt.Uint32LE("biggun")
41+	if err != nil {
42+		t.Error(err)
43+	}
44+	if biggun != 0xff000001 {
45+		t.Error("biggun", biggun)
46+	}
47+
48+	bignum, err := pkt.Uint64BE("bignum")
49+	if err != nil {
50+		t.Error(err)
51+	}
52+	if bignum != 64 {
53+		t.Error("bignum", bignum)
54+	}
55+
56+	desc := pkt.DescribeHeader()
57+	lines := strings.Split(desc, "\n")
58+	if len(lines) != 14 {
59+		t.Error(desc)
60+	}
61+}