Changes to p2pd for duplicate packet filter
authorCaspar van Zon <CHW.van.Zon@mindef.nl>
Thu, 18 Mar 2010 14:09:00 +0000 (15:09 +0100)
committerCaspar van Zon <CHW.van.Zon@mindef.nl>
Thu, 18 Mar 2010 14:09:00 +0000 (15:09 +0100)
1  2 
lib/p2pd/src/Packet.c

 -/*
 - * The olsr.org Optimized Link-State Routing daemon(olsrd)
 - * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file
 - * All rights reserved.
 - *
 - * Redistribution and use in source and binary forms, with or without
 - * modification, are permitted provided that the following conditions
 - * are met:
 - *
 - * * Redistributions of source code must retain the above copyright
 - *   notice, this list of conditions and the following disclaimer.
 - * * Redistributions in binary form must reproduce the above copyright
 - *   notice, this list of conditions and the following disclaimer in
 - *   the documentation and/or other materials provided with the
 - *   distribution.
 - * * Neither the name of olsr.org, olsrd nor the names of its
 - *   contributors may be used to endorse or promote products derived
 - *   from this software without specific prior written permission.
 - *
 - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 - * POSSIBILITY OF SUCH DAMAGE.
 - *
 - * Visit http://www.olsr.org for more information.
 - *
 - * If you find this software useful feel free to make a donation
 - * to the project. For more information see the website or contact
 - * the copyright holders.
 - *
 - */
 -
 -#include "Packet.h"
 -
 -/* System includes */
 -#include <stddef.h>             /* NULL */
 -#include <assert.h>             /* assert() */
 -#include <string.h>             /* memcpy() */
 -#include <sys/types.h>          /* u_int8_t, u_int16_t, u_int32_t */
 -#include <netinet/in.h>         /* ntohs(), htons() */
 -#include <netinet/ip.h>         /* struct iphdr */
 -
 -/* -------------------------------------------------------------------------
 - * Function   : IsIpv4Fragment
 - * Description: Check if an IP packet is an IP fragment
 - * Input      : ipPacket - the IP packet
 - * Output     : none
 - * Return     : true (1) or false (0)
 - * Data Used  : none
 - * ------------------------------------------------------------------------- */
 -int IsIpv4Fragment(struct ip* hdr)
 -{
 -  assert(hdr != NULL);
 -
 -  if ((ntohs(hdr->ip_off) & IP_OFFMASK) != 0)
 -  {
 -    return 1;
 -  }
 -  return 0;
 -} /* IsIpv4Fragment */
 -
 -int IsMulticastv4(struct ip* hdr)
 -{
 -  uint32_t addr;
 -
 -  assert(hdr != NULL);
 -
 -  memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));
 -  if ((addr & 0xE0000000) == 0xE0000000)
 -    return 1;
 -  
 -  return 0;
 -}
 -
 -int IsBroadcast(struct ip* hdr)
 -{
 -  uint32_t addr;
 -
 -  assert(hdr != NULL);
 -
 -  memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));
 -  if (addr == 0xFFFFFFFF)
 -    return 1;
 -    
 -  return 0;
 -}
 -
 -/* -------------------------------------------------------------------------
 - * Function   : IsIpv6Fragment
 - * Description: Check if an IP packet is an IP fragment
 - * Input      : ipPacket - the IP packet
 - * Output     : none
 - * Return     : true (1) or false (0)
 - * Data Used  : none
 - * ------------------------------------------------------------------------- */
 -int IsIpv6Fragment(struct ip6_hdr* hdr __attribute__ ((unused)))
 -{
 -  assert(hdr != NULL);
 -  
 -//#error Implementation required
 -  if (0)
 -    return 1;
 -    
 -  return 0;
 -}
 -
 -int IsMulticastv6(struct ip6_hdr* hdr __attribute__ ((unused)))
 -{
 -  assert(hdr != NULL);
 -
 -
 -  return 0;
 -}
 -
 -/* -------------------------------------------------------------------------
 - * Function   : GetIpHeaderLength
 - * Description: Retrieve the IP header length (in bytes) of an IP packet
 - * Input      : ipPacket - the IP packet
 - * Output     : none
 - * Return     : IP header length
 - * Data Used  : none
 - * ------------------------------------------------------------------------- */
 -unsigned int
 -GetIpHeaderLength(unsigned char *ipPacket)
 -{
 -  struct iphdr *iph;
 -
 -  assert(ipPacket != NULL);
 -
 -  iph = (struct iphdr *)ipPacket;
 -  return iph->ihl << 2;
 -}                               /* GetIpHeaderLength */
 -
 -/* -------------------------------------------------------------------------
 - * Function   : GetIpPacket
 - * Description: Retrieve the IP packet from BMF encapsulation UDP data
 - * Input      : encapsulationUdpData - the encapsulation UDP data
 - * Output     : none
 - * Return     : The IP packet
 - * Data Used  : none
 - * ------------------------------------------------------------------------- */
 -unsigned char *
 -GetIpPacket(unsigned char *encapsulationUdpData)
 -{
 -  return encapsulationUdpData + ENCAP_HDR_LEN;
 -}                               /* GetIpPacket */
 -
 -
 -
 -
 -/*
 - * Local Variables:
 - * c-basic-offset: 2
 - * indent-tabs-mode: nil
 - * End:
 - */
 +/*\r
 + * The olsr.org Optimized Link-State Routing daemon(olsrd)\r
 + * Copyright (c) 2004-2009, the olsr.org team - see HISTORY file\r
 + * All rights reserved.\r
 + *\r
 + * Redistribution and use in source and binary forms, with or without\r
 + * modification, are permitted provided that the following conditions\r
 + * are met:\r
 + *\r
 + * * Redistributions of source code must retain the above copyright\r
 + *   notice, this list of conditions and the following disclaimer.\r
 + * * Redistributions in binary form must reproduce the above copyright\r
 + *   notice, this list of conditions and the following disclaimer in\r
 + *   the documentation and/or other materials provided with the\r
 + *   distribution.\r
 + * * Neither the name of olsr.org, olsrd nor the names of its\r
 + *   contributors may be used to endorse or promote products derived\r
 + *   from this software without specific prior written permission.\r
 + *\r
 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
 + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
 + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r
 + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r
 + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r
 + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r
 + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
 + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r
 + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
 + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
 + * POSSIBILITY OF SUCH DAMAGE.\r
 + *\r
 + * Visit http://www.olsr.org for more information.\r
 + *\r
 + * If you find this software useful feel free to make a donation\r
 + * to the project. For more information see the website or contact\r
 + * the copyright holders.\r
 + *\r
 + */\r
 +\r
 +#include "Packet.h"\r
 +\r
 +/* System includes */\r
 +#include <stddef.h>             /* NULL */\r
 +#include <assert.h>             /* assert() */\r
 +#include <string.h>             /* memcpy() */\r
 +#include <sys/types.h>          /* u_int8_t, u_int16_t, u_int32_t */\r
 +#include <netinet/in.h>         /* ntohs(), htons() */\r
 +#include <netinet/ip.h>         /* struct iphdr */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : IsIpFragment\r
 + * Description: Check if an IP packet is an IP fragment\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : true (1) or false (0)\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +int IsIpFragment(unsigned char* ipPacket)\r
 +{\r
 +  struct ip* iph;\r
 +\r
 +  assert(ipPacket != NULL);\r
 +\r
 +  iph = (struct ip*) ipPacket;\r
 +  if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0)\r
 +  {\r
 +    return 1;\r
 +  }\r
 +  return 0;\r
 +} /* IsIpFragment */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : GetIpTotalLength\r
 + * Description: Retrieve the total length of the IP packet (in bytes) of\r
 + *              an IP packet\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : IP packet length\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +u_int16_t GetIpTotalLength(unsigned char* ipPacket)\r
 +{\r
 +  struct iphdr* iph;\r
 +\r
 +  assert(ipPacket != NULL);\r
 +\r
 +  iph = (struct iphdr*) ipPacket;\r
 +  return ntohs(iph->tot_len);\r
 +} /* GetIpTotalLength */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : IsIpv4Fragment\r
 + * Description: Check if an IP packet is an IP fragment\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : true (1) or false (0)\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +int IsIpv4Fragment(struct ip* hdr)\r
 +{\r
 +  assert(hdr != NULL);\r
 +\r
 +  if ((ntohs(hdr->ip_off) & IP_OFFMASK) != 0)\r
 +  {\r
 +    return 1;\r
 +  }\r
 +  return 0;\r
 +} /* IsIpv4Fragment */\r
 +\r
 +int IsMulticastv4(struct ip* hdr)\r
 +{\r
 +  uint32_t addr;\r
 +\r
 +  assert(hdr != NULL);\r
 +\r
 +  memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));\r
 +  if ((addr & 0xE0000000) == 0xE0000000)\r
 +    return 1;\r
 +  \r
 +  return 0;\r
 +}\r
 +\r
 +int IsBroadcast(struct ip* hdr)\r
 +{\r
 +  uint32_t addr;\r
 +\r
 +  assert(hdr != NULL);\r
 +\r
 +  memcpy(&addr, &hdr->ip_dst.s_addr, sizeof(addr));\r
 +  if (addr == 0xFFFFFFFF)\r
 +    return 1;\r
 +    \r
 +  return 0;\r
 +}\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : IsIpv6Fragment\r
 + * Description: Check if an IP packet is an IP fragment\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : true (1) or false (0)\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
- int IsIpv6Fragment(struct ip6_hdr* hdr)\r
++int IsIpv6Fragment(struct ip6_hdr* hdr __attribute__ ((unused)))\r
 +{\r
 +  assert(hdr != NULL);\r
 +  \r
 +//#error Implementation required\r
 +  if (0)\r
 +    return 1;\r
 +    \r
 +  return 0;\r
 +}\r
 +\r
- int IsMulticastv6(struct ip6_hdr* hdr)\r
++int IsMulticastv6(struct ip6_hdr* hdr __attribute__ ((unused)))\r
 +{\r
 +  assert(hdr != NULL);\r
 +\r
 +\r
 +  return 0;\r
 +}\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : GetIpHeaderLength\r
 + * Description: Retrieve the IP header length (in bytes) of an IP packet\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : IP header length\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +unsigned int\r
 +GetIpHeaderLength(unsigned char *ipPacket)\r
 +{\r
 +  struct iphdr *iph;\r
 +\r
 +  assert(ipPacket != NULL);\r
 +\r
 +  iph = (struct iphdr *)ipPacket;\r
 +  return iph->ihl << 2;\r
 +}                               /* GetIpHeaderLength */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : GetIpPacket\r
 + * Description: Retrieve the IP packet from BMF encapsulation UDP data\r
 + * Input      : encapsulationUdpData - the encapsulation UDP data\r
 + * Output     : none\r
 + * Return     : The IP packet\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +unsigned char *\r
 +GetIpPacket(unsigned char *encapsulationUdpData)\r
 +{\r
 +  return encapsulationUdpData + ENCAP_HDR_LEN;\r
 +}                               /* GetIpPacket */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : GetTtl\r
 + * Description: Retrieve the TTL (Time To Live) value from the IP header of\r
 + *              an IP packet\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : TTL value\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +u_int8_t GetTtl(unsigned char* ipPacket)\r
 +{\r
 +  struct iphdr* iph;\r
 +\r
 +  assert(ipPacket != NULL);\r
 +\r
 +  iph = (struct iphdr*) ipPacket;\r
 +  return iph->ttl;\r
 +} /* GetTtl */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : SaveTtlAndChecksum\r
 + * Description: Save the TTL (Time To Live) value and IP checksum as found in\r
 + *              the IP header of an IP packet\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : sttl - the TTL and checksum values\r
 + * Return     : none\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)\r
 +{\r
 +  struct iphdr* iph;\r
 +\r
 +  assert(ipPacket != NULL && sttl != NULL);\r
 +\r
 +  iph = (struct iphdr*) ipPacket;\r
 +  sttl->ttl = iph->ttl;\r
 +  sttl->check = ntohs(iph->check);\r
 +} /* SaveTtlAndChecksum */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : RestoreTtlAndChecksum\r
 + * Description: Restore the TTL (Time To Live) value and IP checksum in\r
 + *              the IP header of an IP packet\r
 + * Input      : ipPacket - the IP packet\r
 + *              sttl - the TTL and checksum values\r
 + * Output     : none\r
 + * Return     : none\r
 + * Data Used  : none\r
 + * ------------------------------------------------------------------------- */\r
 +void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl)\r
 +{\r
 +  struct iphdr* iph;\r
 +\r
 +  assert(ipPacket != NULL && sttl != NULL);\r
 +\r
 +  iph = (struct iphdr*) ipPacket;\r
 +  iph->ttl = sttl->ttl;\r
 +  iph->check = htons(sttl->check);\r
 +} /* RestoreTtlAndChecksum */\r
 +\r
 +/* -------------------------------------------------------------------------\r
 + * Function   : DecreaseTtlAndUpdateHeaderChecksum\r
 + * Description: For an IP packet, decrement the TTL value and update the IP header\r
 + *              checksum accordingly.\r
 + * Input      : ipPacket - the IP packet\r
 + * Output     : none\r
 + * Return     : none\r
 + * Data Used  : none\r
 + * Notes      : See also RFC1141\r
 + * ------------------------------------------------------------------------- */\r
 +void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket)\r
 +{\r
 +  struct iphdr* iph;\r
 +  u_int32_t sum;\r
 +\r
 +  assert(ipPacket != NULL);\r
 +\r
 +  iph = (struct iphdr*) ipPacket;\r
 +\r
 +  iph->ttl--; /* decrement ttl */\r
 +  sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */\r
 +  iph->check = htons(sum + (sum>>16)); /* add carry */\r
 +} /* DecreaseTtlAndUpdateHeaderChecksum */\r
 +\r
 +\r
 +\r
 +\r
 +/*\r
 + * Local Variables:\r
 + * c-basic-offset: 2\r
 + * indent-tabs-mode: nil\r
 + * End:\r
 + */\r