aboutsummaryrefslogtreecommitdiffstats
path: root/csource/csource.go
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@google.com>2017-04-27 20:31:00 +0200
committerAndrey Konovalov <andreyknvl@google.com>2017-05-12 15:47:59 +0200
commitac0c70f74a5badbebec721c2be0602ea98c0437b (patch)
tree69278d03cdaae547c1c87a84deb44969081837bd /csource/csource.go
parentb2dbb4f4d10f436088ba8a1d2d18437911a83887 (diff)
prog, executor: move checksum computation to executor
This commit moves checksum computation to executor. This will allow to embed dynamically generated values (like TCP sequence numbers) into packets.
Diffstat (limited to 'csource/csource.go')
-rw-r--r--csource/csource.go27
1 files changed, 26 insertions, 1 deletions
diff --git a/csource/csource.go b/csource/csource.go
index 1bf3fc7a1..6a21f54e6 100644
--- a/csource/csource.go
+++ b/csource/csource.go
@@ -226,8 +226,33 @@ loop:
esc = append(esc, '\\', 'x', hex(v>>4), hex(v<<4>>4))
}
fmt.Fprintf(w, "\tNONFAILING(memcpy((void*)0x%x, \"%s\", %v));\n", addr, esc, size)
+ case prog.ExecArgCsum:
+ csum_kind := read()
+ switch csum_kind {
+ case prog.ExecArgCsumInet:
+ fmt.Fprintf(w, "\tstruct csum_inet csum_%d;\n", n)
+ fmt.Fprintf(w, "\tcsum_inet_init(&csum_%d);\n", n)
+ csum_chunks_num := read()
+ for i := uintptr(0); i < csum_chunks_num; i++ {
+ chunk_kind := read()
+ chunk_value := read()
+ chunk_size := read()
+ switch chunk_kind {
+ case prog.ExecArgCsumChunkData:
+ fmt.Fprintf(w, "\tNONFAILING(csum_inet_update(&csum_%d, (const uint8_t*)0x%x, %d));\n", n, chunk_value, chunk_size)
+ case prog.ExecArgCsumChunkConst:
+ fmt.Fprintf(w, "\tuint%d_t csum_%d_chunk_%d = 0x%x;\n", chunk_size*8, n, i, chunk_value)
+ fmt.Fprintf(w, "\tcsum_inet_update(&csum_%d, (const uint8_t*)&csum_%d_chunk_%d, %d);\n", n, n, i, chunk_size)
+ default:
+ panic(fmt.Sprintf("unknown checksum chunk kind %v", chunk_kind))
+ }
+ }
+ fmt.Fprintf(w, "\tNONFAILING(*(uint16_t*)0x%x = csum_inet_digest(&csum_%d));\n", addr, n)
+ default:
+ panic(fmt.Sprintf("unknown csum kind %v", csum_kind))
+ }
default:
- panic("bad argument type")
+ panic(fmt.Sprintf("bad argument type %v", instr))
}
case prog.ExecInstrCopyout:
addr := read()