From 97696c7b36dd33a7848558900691e8062b68bc40 Mon Sep 17 00:00:00 2001 From: "7u83@mail.ru" <7u83@mail.ru@noemail.net> Date: Sun, 24 Aug 2014 18:50:33 +0000 Subject: [PATCH] Checksum for image data message elements. FossilOrigin-Name: bfe6cf9ca48592aa3fc6f572620b48ed29ba6f383e3ef52bd913758cc9675f35 --- src/capwap/lw_checksum.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/capwap/lw_checksum.c diff --git a/src/capwap/lw_checksum.c b/src/capwap/lw_checksum.c new file mode 100644 index 00000000..7c6daf40 --- /dev/null +++ b/src/capwap/lw_checksum.c @@ -0,0 +1,40 @@ +/* + This file is part of libcapwap. + + libcapwap is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + libcapwap is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Foobar. If not, see . + +*/ + +#include "lwapp.h" + +/** + * Calculate the 16-bit checksum for LWAPP image data message + * elements with opcode 3 - used by Cisco also in CAPWAP + */ +uint16_t lw_checksum(uint8_t * d, int len) +{ + int i; + uint32_t cs = 0; + for (i = 0; i < len; i += 2) { + uint16_t w = d[i] << 8; + + if (i + 1 < len) + w |= d[i + 1]; + + cs += w ^= 0xffff; + cs += cs >> 16; + cs &= 0xffff; + } + return (uint16_t) cs; +}