summaryrefslogtreecommitdiff
path: root/include/net.h
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2015-01-19 22:16:07 -0700
committerSimon Glass <sjg@chromium.org>2015-01-23 21:44:59 -0700
commit9b0e35cb4889eb04a7ea5dd648d73df0bf37cc68 (patch)
tree5e3b454e1d4d9a07de41419d56c62b40633adddf /include/net.h
parent5da38086bd6c39efd09e57900702b99541844339 (diff)
downloadu-boot-imx-9b0e35cb4889eb04a7ea5dd648d73df0bf37cc68.zip
u-boot-imx-9b0e35cb4889eb04a7ea5dd648d73df0bf37cc68.tar.gz
u-boot-imx-9b0e35cb4889eb04a7ea5dd648d73df0bf37cc68.tar.bz2
net: Add a separate file for IP checksumming
Move the checksum code out into its own file so it can be used elsewhere. Also use a new version which supports a length which is not a multiple of 2 and add a new function to add two checksums. Signed-off-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'include/net.h')
-rw-r--r--include/net.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/include/net.h b/include/net.h
index 3da35fe..73ea88b 100644
--- a/include/net.h
+++ b/include/net.h
@@ -482,6 +482,36 @@ extern void net_set_ip_header(uchar *pkt, IPaddr_t dest, IPaddr_t source);
extern void net_set_udp_header(uchar *pkt, IPaddr_t dest, int dport,
int sport, int len);
+/**
+ * compute_ip_checksum() - Compute IP checksum
+ *
+ * @addr: Address to check (must be 16-bit aligned)
+ * @nbytes: Number of bytes to check (normally a multiple of 2)
+ * @return 16-bit IP checksum
+ */
+unsigned compute_ip_checksum(const void *addr, unsigned nbytes);
+
+/**
+ * add_ip_checksums() - add two IP checksums
+ *
+ * @offset: Offset of first sum (if odd we do a byte-swap)
+ * @sum: First checksum
+ * @new_sum: New checksum to add
+ * @return updated 16-bit IP checksum
+ */
+unsigned add_ip_checksums(unsigned offset, unsigned sum, unsigned new_sum);
+
+/**
+ * ip_checksum_ok() - check if a checksum is correct
+ *
+ * This works by making sure the checksum sums to 0
+ *
+ * @addr: Address to check (must be 16-bit aligned)
+ * @nbytes: Number of bytes to check (normally a multiple of 2)
+ * @return true if the checksum matches, false if not
+ */
+int ip_checksum_ok(const void *addr, unsigned nbytes);
+
/* Checksum */
extern int NetCksumOk(uchar *, int); /* Return true if cksum OK */
extern uint NetCksum(uchar *, int); /* Calculate the checksum */