From de59c9f4b1462a0e8ded5e9df2c1c701e778b9d9 Mon Sep 17 00:00:00 2001 From: Eric Leblond Date: Thu, 15 Sep 2011 17:15:17 +0200 Subject: [PATCH] Add and use utility functions for checksum computing. --- src/Makefile.am | 1 + src/detect-replace.c | 31 +++------------------- src/stream-tcp-inline.c | 33 ----------------------- src/stream-tcp-inline.h | 1 - src/stream-tcp.c | 5 ++-- src/util-checksum.c | 59 +++++++++++++++++++++++++++++++++++++++++ src/util-checksum.h | 30 +++++++++++++++++++++ 7 files changed, 97 insertions(+), 63 deletions(-) create mode 100644 src/util-checksum.c create mode 100644 src/util-checksum.h diff --git a/src/Makefile.am b/src/Makefile.am index 64746cf7bc..3b490e920e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -210,6 +210,7 @@ util-proto-name.c util-proto-name.h \ util-syslog.c util-syslog.h \ util-vector.h \ util-device.c util-device.h \ +util-checksum.c util-checksum.h \ tm-modules.c tm-modules.h \ tm-queues.c tm-queues.h \ tm-queuehandlers.c tm-queuehandlers.h \ diff --git a/src/detect-replace.c b/src/detect-replace.c index 50866219f5..c9df018e52 100644 --- a/src/detect-replace.c +++ b/src/detect-replace.c @@ -45,6 +45,9 @@ extern int run_mode; #include "detect-engine-mpm.h" #include "detect-engine.h" #include "detect-engine-state.h" + +#include "util-checksum.h" + #include "util-unittest.h" #include "util-unittest-helper.h" @@ -176,33 +179,7 @@ void DetectReplaceExecute(Packet *p, DetectReplaceList *replist) memcpy(replist->found, replist->cd->replace, replist->cd->replace_len); SCLogDebug("replace: injecting '%s'", replist->cd->replace); p->flags |= PKT_STREAM_MODIFIED; - if (PKT_IS_IPV4(p)) { - if (PKT_IS_TCP(p)) { - /* TCP */ - p->tcph->th_sum = 0; - p->tcph->th_sum = TCPCalculateChecksum((uint16_t *)&(p->ip4h->ip_src), - (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); - } else if (PKT_IS_UDP(p)) { - p->udph->uh_sum = 0; - p->udph->uh_sum = UDPV4CalculateChecksum((uint16_t *)&(p->ip4h->ip_src), - (uint16_t *)p->udph, (p->payload_len + UDP_HEADER_LEN)); - } - /* IPV4 */ - p->ip4h->ip_csum = 0; - p->ip4h->ip_csum = IPV4CalculateChecksum((uint16_t *)p->ip4h, - IPV4_GET_RAW_HLEN(p->ip4h)); - } else if (PKT_IS_IPV6(p)) { - /* just TCP for IPV6 */ - if (PKT_IS_TCP(p)) { - p->tcph->th_sum = 0; - p->tcph->th_sum = TCPV6CalculateChecksum((uint16_t *)&(p->ip6h->ip6_src), - (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); - } else if (PKT_IS_UDP(p)) { - p->udph->uh_sum = 0; - p->udph->uh_sum = UDPV6CalculateChecksum((uint16_t *)&(p->ip6h->ip6_src), - (uint16_t *)p->udph, (p->payload_len + UDP_HEADER_LEN)); - } - } + ReCalculateChecksum(p); tlist = replist; replist = replist->next; SCFree(tlist); diff --git a/src/stream-tcp-inline.c b/src/stream-tcp-inline.c index 1108bd1f5c..60f6d38b2d 100644 --- a/src/stream-tcp-inline.c +++ b/src/stream-tcp-inline.c @@ -180,39 +180,6 @@ void StreamTcpInlineSegmentReplacePacket(Packet *p, TcpSegment *seg) { } } -/** - * \brief Recalculate the csum for a modified packet - * - * \param p packet to inspect - */ -void StreamTcpInlineRecalcCsum(Packet *p) { - if (!(p->flags & PKT_STREAM_MODIFIED)) { - SCReturn; - } - - if (!(PKT_IS_TCP(p))) { - SCReturn; - } - - if (PKT_IS_IPV4(p)) { - /* TCP */ - p->tcph->th_sum = 0; - p->tcph->th_sum = TCPCalculateChecksum((uint16_t *)&(p->ip4h->ip_src), - (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); - /* IPV4 */ - p->ip4h->ip_csum = 0; - p->ip4h->ip_csum = IPV4CalculateChecksum((uint16_t *)p->ip4h, - IPV4_GET_RAW_HLEN(p->ip4h)); - } else if (PKT_IS_IPV6(p)) { - /* just TCP for IPV6 */ - p->tcph->th_sum = 0; - p->tcph->th_sum = TCPV6CalculateChecksum((uint16_t *)&(p->ip6h->ip6_src), - (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); - } - - SCReturn; -} - #ifdef UNITTESTS /** \test full overlap */ diff --git a/src/stream-tcp-inline.h b/src/stream-tcp-inline.h index 3b382c38ad..49d4978176 100644 --- a/src/stream-tcp-inline.h +++ b/src/stream-tcp-inline.h @@ -29,7 +29,6 @@ int StreamTcpInlineMode(void); int StreamTcpInlineSegmentCompare(TcpSegment *, TcpSegment *); void StreamTcpInlineSegmentReplacePacket(Packet *, TcpSegment *); -void StreamTcpInlineRecalcCsum(Packet *); void StreamTcpInlineRegisterTests(void); diff --git a/src/stream-tcp.c b/src/stream-tcp.c index 20000dbb27..3de6054e60 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -44,6 +44,7 @@ #include "tm-threads.h" #include "util-pool.h" +#include "util-checksum.h" #include "util-unittest.h" #include "util-print.h" #include "util-debug.h" @@ -3653,7 +3654,7 @@ static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt, /* recalc the csum on the packet if it was modified */ if (p->flags & PKT_STREAM_MODIFIED) { - StreamTcpInlineRecalcCsum(p); + ReCalculateChecksum(p); } /* check for conditions that may make us not want to log this packet */ @@ -3686,7 +3687,7 @@ error: /* recalc the csum on the packet if it was modified */ if (p->flags & PKT_STREAM_MODIFIED) { - StreamTcpInlineRecalcCsum(p); + ReCalculateChecksum(p); } if (StreamTcpInlineMode()) { diff --git a/src/util-checksum.c b/src/util-checksum.c new file mode 100644 index 0000000000..1fd5ca9c0b --- /dev/null +++ b/src/util-checksum.c @@ -0,0 +1,59 @@ +/* Copyright (C) 2011 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program 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 + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/** + * \file + * + * \author Eric Leblond + * + * Util functions for checskum. + */ + +#include "suricata-common.h" + +int ReCalculateChecksum(Packet *p) +{ + if (PKT_IS_IPV4(p)) { + if (PKT_IS_TCP(p)) { + /* TCP */ + p->tcph->th_sum = 0; + p->tcph->th_sum = TCPCalculateChecksum((uint16_t *)&(p->ip4h->ip_src), + (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); + } else if (PKT_IS_UDP(p)) { + p->udph->uh_sum = 0; + p->udph->uh_sum = UDPV4CalculateChecksum((uint16_t *)&(p->ip4h->ip_src), + (uint16_t *)p->udph, (p->payload_len + UDP_HEADER_LEN)); + } + /* IPV4 */ + p->ip4h->ip_csum = 0; + p->ip4h->ip_csum = IPV4CalculateChecksum((uint16_t *)p->ip4h, + IPV4_GET_RAW_HLEN(p->ip4h)); + } else if (PKT_IS_IPV6(p)) { + /* just TCP for IPV6 */ + if (PKT_IS_TCP(p)) { + p->tcph->th_sum = 0; + p->tcph->th_sum = TCPV6CalculateChecksum((uint16_t *)&(p->ip6h->ip6_src), + (uint16_t *)p->tcph, (p->payload_len + TCP_GET_HLEN(p))); + } else if (PKT_IS_UDP(p)) { + p->udph->uh_sum = 0; + p->udph->uh_sum = UDPV6CalculateChecksum((uint16_t *)&(p->ip6h->ip6_src), + (uint16_t *)p->udph, (p->payload_len + UDP_HEADER_LEN)); + } + } + + return 0; +} diff --git a/src/util-checksum.h b/src/util-checksum.h new file mode 100644 index 0000000000..47815730d3 --- /dev/null +++ b/src/util-checksum.h @@ -0,0 +1,30 @@ +/* Copyright (C) 2011 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program 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 + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/** + * \file + * + * \author Eric Leblond + */ + +#ifndef __UTIL_CHECKSUM_H__ +#define __UTIL_CHECKSUM_H__ + + +int ReCalculateChecksum(Packet *p); + +#endif