⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packet.c

📁 wifi 无线网络路由协议OLSR linux下C代码
💻 C
字号:
/* * OLSR Basic Multicast Forwarding (BMF) plugin. * Copyright (c) 2005 - 2007, Thales Communications, Huizen, The Netherlands. * Written by Erik Tromp. * 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 Thales, BMF 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. *//* ------------------------------------------------------------------------- * File       : Packet.c * Description: IP packet and Ethernet frame processing functions * Created    : 29 Jun 2006 * * ------------------------------------------------------------------------- */#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   : IsIpFragment * 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 IsIpFragment(unsigned char* ipPacket){  struct ip* iph;  assert(ipPacket != NULL);  iph = (struct ip*) ipPacket;  if ((ntohs(iph->ip_off) & IP_OFFMASK) != 0)  {    return 1;  }  return 0;} /* IsIpFragment *//* ------------------------------------------------------------------------- * Function   : GetIpTotalLength * Description: Retrieve the total length of the IP packet (in bytes) of *              an IP packet * Input      : ipPacket - the IP packet * Output     : none * Return     : IP packet length * Data Used  : none * ------------------------------------------------------------------------- */u_int16_t GetIpTotalLength(unsigned char* ipPacket){  struct iphdr* iph;  assert(ipPacket != NULL);  iph = (struct iphdr*) ipPacket;  return ntohs(iph->tot_len);} /* GetIpTotalLength *//* ------------------------------------------------------------------------- * 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   : GetTtl * Description: Retrieve the TTL (Time To Live) value from the IP header of *              an IP packet * Input      : ipPacket - the IP packet * Output     : none * Return     : TTL value * Data Used  : none * ------------------------------------------------------------------------- */u_int8_t GetTtl(unsigned char* ipPacket){  struct iphdr* iph;  assert(ipPacket != NULL);  iph = (struct iphdr*) ipPacket;  return iph->ttl;} /* GetTtl *//* ------------------------------------------------------------------------- * Function   : SaveTtlAndChecksum * Description: Save the TTL (Time To Live) value and IP checksum as found in *              the IP header of an IP packet * Input      : ipPacket - the IP packet * Output     : sttl - the TTL and checksum values * Return     : none * Data Used  : none * ------------------------------------------------------------------------- */void SaveTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl){  struct iphdr* iph;  assert(ipPacket != NULL && sttl != NULL);  iph = (struct iphdr*) ipPacket;  sttl->ttl = iph->ttl;  sttl->check = ntohs(iph->check);} /* SaveTtlAndChecksum *//* ------------------------------------------------------------------------- * Function   : RestoreTtlAndChecksum * Description: Restore the TTL (Time To Live) value and IP checksum in *              the IP header of an IP packet * Input      : ipPacket - the IP packet *              sttl - the TTL and checksum values * Output     : none * Return     : none * Data Used  : none * ------------------------------------------------------------------------- */void RestoreTtlAndChecksum(unsigned char* ipPacket, struct TSaveTtl* sttl){  struct iphdr* iph;  assert(ipPacket != NULL && sttl != NULL);  iph = (struct iphdr*) ipPacket;  iph->ttl = sttl->ttl;  iph->check = htons(sttl->check);} /* RestoreTtlAndChecksum *//* ------------------------------------------------------------------------- * Function   : DecreaseTtlAndUpdateHeaderChecksum * Description: For an IP packet, decrement the TTL value and update the IP header *              checksum accordingly. * Input      : ipPacket - the IP packet * Output     : none * Return     : none * Data Used  : none * Notes      : See also RFC1141 * ------------------------------------------------------------------------- */void DecreaseTtlAndUpdateHeaderChecksum(unsigned char* ipPacket){  struct iphdr* iph;  u_int32_t sum;  assert(ipPacket != NULL);  iph = (struct iphdr*) ipPacket;  iph->ttl--; /* decrement ttl */  sum = ntohs(iph->check) + 0x100; /* increment checksum high byte */  iph->check = htons(sum + (sum>>16)); /* add carry */} /* DecreaseTtlAndUpdateHeaderChecksum *//* ------------------------------------------------------------------------- * Function   : GetIpHeader * Description: Retrieve the IP header from BMF encapsulation UDP data * Input      : encapsulationUdpData - the encapsulation UDP data * Output     : none * Return     : IP header * Data Used  : none * ------------------------------------------------------------------------- */struct ip* GetIpHeader(unsigned char* encapsulationUdpData){  return (struct ip*)(encapsulationUdpData + ENCAP_HDR_LEN);} /* GetIpHeader *//* ------------------------------------------------------------------------- * 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 *//* ------------------------------------------------------------------------- * Function   : GetEncapsulationUdpDataLength * Description: Return the length of BMF encapsulation UDP data * Input      : encapsulationUdpData - the encapsulation UDP data * Output     : none * Return     : The encapsulation data length * Data Used  : none * ------------------------------------------------------------------------- */u_int16_t GetEncapsulationUdpDataLength(unsigned char* encapsulationUdpData){  return GetIpTotalLength(GetIpPacket(encapsulationUdpData)) + ENCAP_HDR_LEN;} /* GetEncapsulationUdpDataLength */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -