diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-05-07 14:46:17 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-05-07 14:46:17 +0200 |
| commit | 23b5913da901fb6482d78df10d2d7590d6125cb3 (patch) | |
| tree | 7729e6bdde917dc213abf1a2e0c53d48f609a728 /prog/checksum.go | |
| parent | f914e0a305c0396518c7284698c12d2e0fc40369 (diff) | |
prog: reorder checksum functions
Put the most important function at the top.
Diffstat (limited to 'prog/checksum.go')
| -rw-r--r-- | prog/checksum.go | 138 |
1 files changed, 69 insertions, 69 deletions
diff --git a/prog/checksum.go b/prog/checksum.go index 5062ddc6e..7c9183230 100644 --- a/prog/checksum.go +++ b/prog/checksum.go @@ -26,75 +26,6 @@ type CsumChunk struct { Size uint64 // for CsumChunkConst } -func getFieldByName(arg *GroupArg, name string) Arg { - for _, field := range arg.Inner { - if field.Type().FieldName() == name { - return field - } - } - panic(fmt.Sprintf("failed to find %v field in %v", name, arg.Type().Name())) -} - -func extractHeaderParamsIPv4(arg *GroupArg) (Arg, Arg) { - srcAddr := getFieldByName(arg, "src_ip") - if srcAddr.Size() != 4 { - panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type().Name())) - } - dstAddr := getFieldByName(arg, "dst_ip") - if dstAddr.Size() != 4 { - panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type().Name())) - } - return srcAddr, dstAddr -} - -func extractHeaderParamsIPv6(arg *GroupArg) (Arg, Arg) { - srcAddr := getFieldByName(arg, "src_ip") - if srcAddr.Size() != 16 { - panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type().Name())) - } - dstAddr := getFieldByName(arg, "dst_ip") - if dstAddr.Size() != 16 { - panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type().Name())) - } - return srcAddr, dstAddr -} - -func composePseudoCsumIPv4(tcpPacket, srcAddr, dstAddr Arg, protocol uint8) CsumInfo { - info := CsumInfo{Kind: CsumInet} - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, srcAddr, 0, 0}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, dstAddr, 0, 0}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap16(uint16(protocol))), 2}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap16(uint16(tcpPacket.Size()))), 2}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, tcpPacket, 0, 0}) - return info -} - -func composePseudoCsumIPv6(tcpPacket, srcAddr, dstAddr Arg, protocol uint8) CsumInfo { - info := CsumInfo{Kind: CsumInet} - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, srcAddr, 0, 0}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, dstAddr, 0, 0}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap32(uint32(tcpPacket.Size()))), 4}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap32(uint32(protocol))), 4}) - info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, tcpPacket, 0, 0}) - return info -} - -func findCsummedArg(arg Arg, typ *CsumType, parentsMap map[Arg]Arg) Arg { - if typ.Buf == "parent" { - if csummedArg, ok := parentsMap[arg]; ok { - return csummedArg - } - panic(fmt.Sprintf("parent for %v is not in parents map", typ.Name())) - } else { - for parent := parentsMap[arg]; parent != nil; parent = parentsMap[parent] { - if typ.Buf == parent.Type().Name() { - return parent - } - } - } - panic(fmt.Sprintf("csum field '%v' references non existent field '%v'", typ.FieldName(), typ.Buf)) -} - func calcChecksumsCall(c *Call) map[Arg]CsumInfo { var inetCsumFields []Arg var pseudoCsumFields []Arg @@ -183,3 +114,72 @@ func calcChecksumsCall(c *Call) map[Arg]CsumInfo { return csumMap } + +func findCsummedArg(arg Arg, typ *CsumType, parentsMap map[Arg]Arg) Arg { + if typ.Buf == "parent" { + if csummedArg, ok := parentsMap[arg]; ok { + return csummedArg + } + panic(fmt.Sprintf("parent for %v is not in parents map", typ.Name())) + } else { + for parent := parentsMap[arg]; parent != nil; parent = parentsMap[parent] { + if typ.Buf == parent.Type().Name() { + return parent + } + } + } + panic(fmt.Sprintf("csum field '%v' references non existent field '%v'", typ.FieldName(), typ.Buf)) +} + +func composePseudoCsumIPv4(tcpPacket, srcAddr, dstAddr Arg, protocol uint8) CsumInfo { + info := CsumInfo{Kind: CsumInet} + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, srcAddr, 0, 0}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, dstAddr, 0, 0}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap16(uint16(protocol))), 2}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap16(uint16(tcpPacket.Size()))), 2}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, tcpPacket, 0, 0}) + return info +} + +func composePseudoCsumIPv6(tcpPacket, srcAddr, dstAddr Arg, protocol uint8) CsumInfo { + info := CsumInfo{Kind: CsumInet} + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, srcAddr, 0, 0}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, dstAddr, 0, 0}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap32(uint32(tcpPacket.Size()))), 4}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkConst, nil, uint64(swap32(uint32(protocol))), 4}) + info.Chunks = append(info.Chunks, CsumChunk{CsumChunkArg, tcpPacket, 0, 0}) + return info +} + +func extractHeaderParamsIPv4(arg *GroupArg) (Arg, Arg) { + srcAddr := getFieldByName(arg, "src_ip") + if srcAddr.Size() != 4 { + panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type().Name())) + } + dstAddr := getFieldByName(arg, "dst_ip") + if dstAddr.Size() != 4 { + panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type().Name())) + } + return srcAddr, dstAddr +} + +func extractHeaderParamsIPv6(arg *GroupArg) (Arg, Arg) { + srcAddr := getFieldByName(arg, "src_ip") + if srcAddr.Size() != 16 { + panic(fmt.Sprintf("src_ip field in %v must be 4 bytes", arg.Type().Name())) + } + dstAddr := getFieldByName(arg, "dst_ip") + if dstAddr.Size() != 16 { + panic(fmt.Sprintf("dst_ip field in %v must be 4 bytes", arg.Type().Name())) + } + return srcAddr, dstAddr +} + +func getFieldByName(arg *GroupArg, name string) Arg { + for _, field := range arg.Inner { + if field.Type().FieldName() == name { + return field + } + } + panic(fmt.Sprintf("failed to find %v field in %v", name, arg.Type().Name())) +} |
