Fix header formatting
This commit is contained in:
parent
ba891c3cf3
commit
b9f024161f
|
@ -0,0 +1,5 @@
|
||||||
|
module github.com/dirtbags/netshovel
|
||||||
|
|
||||||
|
go 1.13
|
||||||
|
|
||||||
|
require github.com/google/gopacket v1.1.18
|
|
@ -0,0 +1,7 @@
|
||||||
|
github.com/google/gopacket v1.1.18 h1:lum7VRA9kdlvBi7/v2p7/zcbkduHaCH/SVVyurs7OpY=
|
||||||
|
github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM=
|
||||||
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
44
packet.go
44
packet.go
|
@ -91,6 +91,9 @@ func (pkt *Packet) DescribeFields() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func center(s string, w int) string {
|
func center(s string, w int) string {
|
||||||
|
if w < 3 {
|
||||||
|
return "?"
|
||||||
|
}
|
||||||
if len(s) > w {
|
if len(s) > w {
|
||||||
s = s[0:w-3] + "…"
|
s = s[0:w-3] + "…"
|
||||||
}
|
}
|
||||||
|
@ -100,39 +103,54 @@ func center(s string, w int) string {
|
||||||
// DescribeHeader returns a multi-line string describing this packet's header structure
|
// DescribeHeader returns a multi-line string describing this packet's header structure
|
||||||
func (pkt *Packet) DescribeHeader() string {
|
func (pkt *Packet) DescribeHeader() string {
|
||||||
out := new(strings.Builder)
|
out := new(strings.Builder)
|
||||||
fmt.Fprintln(out, " 0 1 ")
|
out.WriteString(" 0 1\n")
|
||||||
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")
|
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")
|
||||||
|
out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
|
||||||
|
|
||||||
bitOffset := 0
|
bitOffset := 0
|
||||||
for _, f := range pkt.header {
|
for _, f := range pkt.header {
|
||||||
bits := f.bits
|
bits := f.bits
|
||||||
for bits > 0 {
|
for bits > 0 {
|
||||||
if bitOffset == 0 {
|
|
||||||
fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
|
|
||||||
}
|
|
||||||
|
|
||||||
linebits := bits
|
linebits := bits
|
||||||
if linebits+bitOffset > 0x20 {
|
if linebits+bitOffset > 0x20 {
|
||||||
linebits = 0x20 - bitOffset
|
linebits = 0x20 - bitOffset
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate centered string
|
// Generate centered string
|
||||||
// TODO: right-align value, center name
|
val := fmt.Sprintf("0x%x", f.value)
|
||||||
nameval := fmt.Sprintf("%s (0x%x)", f.name, f.value)
|
nameval := f.name
|
||||||
fmt.Fprintf(out, "|%s", center(nameval, linebits*2-1))
|
if f.bits == bits {
|
||||||
|
out.WriteString("|")
|
||||||
|
} else {
|
||||||
|
out.WriteString(" ")
|
||||||
|
val = ""
|
||||||
|
nameval = "..."
|
||||||
|
}
|
||||||
|
out.WriteString(center(nameval, linebits*2-len(val)-2))
|
||||||
|
out.WriteString(val)
|
||||||
|
out.WriteString(" ")
|
||||||
|
|
||||||
bitOffset += linebits
|
bitOffset += linebits
|
||||||
bits -= linebits
|
bits -= linebits
|
||||||
if linebits == 0x20 {
|
if bitOffset == 0x20 {
|
||||||
fmt.Fprintln(out, "|")
|
if bits == 0 {
|
||||||
|
out.WriteString("|")
|
||||||
|
} else {
|
||||||
|
out.WriteString(" ")
|
||||||
|
}
|
||||||
|
out.WriteString("\n")
|
||||||
|
out.WriteString("+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")
|
||||||
bitOffset = 0
|
bitOffset = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if bitOffset > 0 {
|
if bitOffset > 0 {
|
||||||
fmt.Fprintln(out, "|")
|
out.WriteString("|\n")
|
||||||
|
for o := 0; o < bitOffset; o++ {
|
||||||
|
out.WriteString("+-")
|
||||||
|
}
|
||||||
|
out.WriteString("+\n")
|
||||||
}
|
}
|
||||||
fmt.Fprintln(out, "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+")
|
|
||||||
return out.String()
|
return out.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
package netshovel
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/dirtbags/netshovel/gapstring"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BUG(neale): The DescribeHeader test is too simplistic.
|
||||||
|
func TestHeaders(t *testing.T) {
|
||||||
|
pkt := NewPacket()
|
||||||
|
pkt.Payload = gapstring.OfBytes([]byte{0, 1, 0, 1, 42, 0xff, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 64})
|
||||||
|
|
||||||
|
a, err := pkt.Uint16LE("le")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if a != 0x0100 {
|
||||||
|
t.Error("Uint16LE", a)
|
||||||
|
}
|
||||||
|
|
||||||
|
b, err := pkt.Uint16BE("be")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if b != 0x0001 {
|
||||||
|
t.Error("Uint16BE", b)
|
||||||
|
}
|
||||||
|
|
||||||
|
fnord, err := pkt.Uint8("fnord")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if fnord != 42 {
|
||||||
|
t.Error("Uint8", fnord)
|
||||||
|
}
|
||||||
|
|
||||||
|
biggun, err := pkt.Uint32LE("biggun")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if biggun != 0xff000001 {
|
||||||
|
t.Error("biggun", biggun)
|
||||||
|
}
|
||||||
|
|
||||||
|
bignum, err := pkt.Uint64BE("bignum")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
if bignum != 64 {
|
||||||
|
t.Error("bignum", bignum)
|
||||||
|
}
|
||||||
|
|
||||||
|
desc := pkt.DescribeHeader()
|
||||||
|
lines := strings.Split(desc, "\n")
|
||||||
|
if len(lines) != 14 {
|
||||||
|
t.Error(desc)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue