* bug fixes from Sven-Ola
[olsrd.git] / lib / bmf / src / Packet.c
1 /*
2  * OLSR Basic Multicast Forwarding (BMF) plugin.
3  * Copyright (c) 2005, 2006, Thales Communications, Huizen, The Netherlands.
4  * Written by Erik Tromp.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without 
8  * modification, are permitted provided that the following conditions 
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright 
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright 
14  *   notice, this list of conditions and the following disclaimer in 
15  *   the documentation and/or other materials provided with the 
16  *   distribution.
17  * * Neither the name of Thales, BMF nor the names of its 
18  *   contributors may be used to endorse or promote products derived 
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
24  * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
25  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
28  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
29  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 
30  * OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 /* $Id: Packet.c,v 1.2 2007/02/08 10:31:43 bernd67 Exp $ */
34
35 #include "Packet.h"
36
37 /* System includes */
38 #include <assert.h> /* assert() */
39 #include <sys/types.h> /* u_int32_t */
40 #include <netinet/in.h> /* ntohs(), htons() */
41 #include <asm/byteorder.h>
42 #include <linux/ip.h>
43
44 /* Retrieve the TTL (Time To Live) value from the IP header of the
45  * passed ethernet packet */
46 int GetIpTtl(unsigned char* buffer)
47 {
48   struct iphdr* iph;
49
50   assert(buffer != NULL);
51
52   iph = (struct iphdr*) (buffer + IP_HDR_OFFSET);
53   return iph->ttl;
54 }
55
56 void SaveTtlAndChecksum(unsigned char* buffer, struct TSaveTtl* sttl)
57 {
58   struct iphdr* iph;
59
60   assert(buffer != NULL && sttl != NULL);
61
62   iph = (struct iphdr*) (buffer + IP_HDR_OFFSET);
63   sttl->ttl = iph->ttl;
64   sttl->check = ntohs(iph->check);
65 }
66
67 void RestoreTtlAndChecksum(unsigned char* buffer, struct TSaveTtl* sttl)
68 {
69   struct iphdr* iph;
70
71   assert(buffer != NULL && sttl != NULL);
72
73   iph = (struct iphdr*) (buffer + IP_HDR_OFFSET);
74   iph->ttl = sttl->ttl;
75   iph->check = htons(sttl->check);
76 }
77
78 /* For an IP packet, decrement the TTL value and update the IP header
79  * checksum accordingly. See also RFC1141. */
80 void PacketDecreaseTtlAndUpdateHeaderChecksum(unsigned char* buffer)
81 {
82   struct iphdr* iph;
83   u_int32_t sum;
84
85   assert(buffer != NULL);
86
87   iph = (struct iphdr*) (buffer + IP_HDR_OFFSET);
88
89   iph->ttl--; /* decrement ttl */
90   sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */
91   iph->check = htons(sum + (sum>>16)); /* add carry */
92 }