From b4bdefbe9be8d3d502db5e775aa85cd5c38463db Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Mon, 6 Feb 2017 19:27:17 +0100 Subject: prog, sys: add icmp descriptions and checksum --- prog/checksum.go | 40 ++++++++++++++++++++-------------------- prog/checksum_test.go | 2 +- 2 files changed, 21 insertions(+), 21 deletions(-) (limited to 'prog') diff --git a/prog/checksum.go b/prog/checksum.go index fdc14a513..03eb81f7b 100644 --- a/prog/checksum.go +++ b/prog/checksum.go @@ -130,20 +130,7 @@ func getFieldByName(arg *Arg, name string) *Arg { panic(fmt.Sprintf("failed to find %v field in %v", name, arg.Type.Name())) } -func findCsumFieldIPv4(packet *Arg, pid int) *Arg { - csumField := getFieldByName(packet, "csum") - if typ, ok := csumField.Type.(*sys.CsumType); !ok { - panic(fmt.Sprintf("checksum field has bad type %v, arg: %+v", csumField.Type, csumField)) - } else if typ.Kind != sys.CsumIPv4 { - panic(fmt.Sprintf("checksum field has bad kind %v, arg: %+v", typ.Kind, csumField)) - } - if csumField.Value(pid) != 0 { - panic(fmt.Sprintf("checksum field has nonzero value %v, arg: %+v", csumField.Value(pid), csumField)) - } - return csumField -} - -func calcChecksumIPv4(packet, csumField *Arg, pid int) *Arg { +func calcChecksumInet(packet, csumField *Arg, pid int) *Arg { bytes := encodeArg(packet, pid) csum := ipChecksum(bytes) newCsumField := *csumField @@ -234,16 +221,29 @@ func calcChecksumsCall(c *Call, pid int) map[*Arg]*Arg { var ipSrcAddr *Arg var ipDstAddr *Arg tcp := false + + // Calculate inet checksums. + foreachArgArray(&c.Args, nil, func(arg, base *Arg, _ *[]*Arg) { + if _, ok := arg.Type.(*sys.StructType); ok { + for _, field := range arg.Inner { + if typ, ok1 := field.Type.(*sys.CsumType); ok1 { + if typ.Kind == sys.CsumInet { + newCsumField := calcChecksumInet(arg, field, pid) + if csumMap == nil { + csumMap = make(map[*Arg]*Arg) + } + csumMap[field] = newCsumField + } + } + } + } + }) + + // Calculate tcp and udp checksums. foreachArgArray(&c.Args, nil, func(arg, base *Arg, _ *[]*Arg) { // syz_csum_* structs are used in tests switch arg.Type.Name() { case "ipv4_header", "syz_csum_ipv4_header": - if csumMap == nil { - csumMap = make(map[*Arg]*Arg) - } - csumField := findCsumFieldIPv4(arg, pid) - newCsumField := calcChecksumIPv4(arg, csumField, pid) - csumMap[csumField] = newCsumField ipSrcAddr, ipDstAddr = extractHeaderParamsIPv4(arg) ipv4HeaderParsed = true case "ipv6_packet", "syz_csum_ipv6_header": diff --git a/prog/checksum_test.go b/prog/checksum_test.go index c956da509..cd16bb70b 100644 --- a/prog/checksum_test.go +++ b/prog/checksum_test.go @@ -143,7 +143,7 @@ func TestChecksumCalc(t *testing.T) { }{ { "syz_test$csum_ipv4(&(0x7f0000000000)={0x0, 0x1234, 0x5678})", - sys.CsumIPv4, + sys.CsumInet, 0x9753, }, { -- cgit mrf-deployment