aboutsummaryrefslogtreecommitdiffstats
path: root/csource/common.go
diff options
context:
space:
mode:
authorAndrey Konovalov <andreyknvl@gmail.com>2017-05-17 01:56:40 +0200
committerGitHub <noreply@github.com>2017-05-17 01:56:40 +0200
commit64cd235dcf60d3ab0dec3d4b0f168297782417a7 (patch)
tree67c41279da959d253aab080b873284e6e2e5186a /csource/common.go
parentffb66e506d9083140196d9b4b2a46e15bc4a5d1e (diff)
parentac0c70f74a5badbebec721c2be0602ea98c0437b (diff)
Merge pull request #169 from xairy/executor-csum
prog, executor: move checksum computation to executor
Diffstat (limited to 'csource/common.go')
-rw-r--r--csource/common.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/csource/common.go b/csource/common.go
index f09cbf24d..2551cbbb9 100644
--- a/csource/common.go
+++ b/csource/common.go
@@ -275,6 +275,36 @@ static uintptr_t syz_emit_ethernet(uintptr_t a0, uintptr_t a1)
}
#endif
+struct csum_inet {
+ uint32_t acc;
+};
+
+void csum_inet_init(struct csum_inet* csum)
+{
+ csum->acc = 0;
+}
+
+void csum_inet_update(struct csum_inet* csum, const uint8_t* data, size_t length)
+{
+ if (length == 0)
+ return;
+
+ size_t i;
+ for (i = 0; i < length - 1; i += 2)
+ csum->acc += *(uint16_t*)&data[i];
+
+ if (length & 1)
+ csum->acc += (uint16_t)data[length - 1];
+
+ while (csum->acc > 0xffff)
+ csum->acc = (csum->acc & 0xffff) + (csum->acc >> 16);
+}
+
+uint16_t csum_inet_digest(struct csum_inet* csum)
+{
+ return ~csum->acc;
+}
+
#ifdef __NR_syz_open_dev
static uintptr_t syz_open_dev(uintptr_t a0, uintptr_t a1, uintptr_t a2)
{