亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ip_frag.c

?? 基于AT91SAM7x256的硬件平臺(tái)的WEB服務(wù)器源碼(A&shy DS版本, ucOS_II+LWIP+自己編寫的DNS查詢工具)
?? C
字號(hào):
/* @file *  * This is the IP packet segmentation and reassembly implementation. * *//* * Copyright (c) 2001-2004 Swedish Institute of Computer Science. * All rights reserved.  *  * Redistribution and use in source and binary forms, with or without modification,  * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, *    this list of conditions and the following disclaimer. * 2. 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. * 3. The name of the author may not be used to endorse or promote products *    derived from this software without specific prior written permission.  * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. * * This file is part of the lwIP TCP/IP stack. *  * Author: Jani Monoses <jani@iv.ro>  * original reassembly code by Adam Dunkels <adam@sics.se> *  */#include <string.h>#include "lwip/opt.h"/* #include "lwip/sys.h" */#include "lwip/ip.h"#include "lwip/ip_frag.h"#include "lwip/netif.h"#include "lwip/stats.h"/* * Copy len bytes from offset in pbuf to buffer  * * helper used by both ip_reass and ip_frag */static struct pbuf *copy_from_pbuf(struct pbuf *p, u16_t * offset,           u8_t * buffer, u16_t len){  u16_t l;  p->payload = (u8_t *)p->payload + *offset;  p->len -= *offset;  while (len) {    l = len < p->len ? len : p->len;    memcpy(buffer, p->payload, l);    buffer += l;    len -= l;    if (len)      p = p->next;    else      *offset = l;  }  return p;}#define IP_REASS_BUFSIZE 5760#define IP_REASS_MAXAGE 30#define IP_REASS_TMO 1000static u8_t ip_reassbuf[IP_HLEN + IP_REASS_BUFSIZE];static u8_t ip_reassbitmap[IP_REASS_BUFSIZE / (8 * 8) + 1];static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f,  0x0f, 0x07, 0x03, 0x01};static u16_t ip_reasslen;static u8_t ip_reassflags;#define IP_REASS_FLAG_LASTFRAG 0x01static u8_t ip_reasstmr;/** * Reassembly timer base function * for both NO_SYS == 0 and 1 (!). * * Should be called every 1000 msec. */voidip_reass_tmr(void){  if (ip_reasstmr > 0) {    ip_reasstmr--;  }}/** * Reassembles incoming IP fragments into an IP datagram. * * @param p points to a pbuf chain of the fragment * @return NULL if reassembly is incomplete, ? otherwise */struct pbuf *ip_reass(struct pbuf *p){  struct pbuf *q;  struct ip_hdr *fraghdr, *iphdr;  u16_t offset, len;  u16_t i;  IPFRAG_STATS_INC(ip_frag.recv);  iphdr = (struct ip_hdr *) ip_reassbuf;  fraghdr = (struct ip_hdr *) p->payload;  /* If ip_reasstmr is zero, no packet is present in the buffer, so we     write the IP header of the fragment into the reassembly     buffer. The timer is updated with the maximum age. */  if (ip_reasstmr == 0) {    LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: new packet\n"));    memcpy(iphdr, fraghdr, IP_HLEN);    ip_reasstmr = IP_REASS_MAXAGE;    ip_reassflags = 0;    /* Clear the bitmap. */    memset(ip_reassbitmap, 0, sizeof(ip_reassbitmap));  }  /* Check if the incoming fragment matches the one currently present     in the reasembly buffer. If so, we proceed with copying the     fragment into the buffer. */  if (ip_addr_cmp(&iphdr->src, &fraghdr->src) &&      ip_addr_cmp(&iphdr->dest, &fraghdr->dest) &&      IPH_ID(iphdr) == IPH_ID(fraghdr)) {    LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n",      ntohs(IPH_ID(fraghdr))));    IPFRAG_STATS_INC(ip_frag.cachehit);    /* Find out the offset in the reassembly buffer where we should       copy the fragment. */    len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;    offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;    /* If the offset or the offset + fragment length overflows the       reassembly buffer, we discard the entire packet. */    if (offset > IP_REASS_BUFSIZE || offset + len > IP_REASS_BUFSIZE) {      LWIP_DEBUGF(IP_REASS_DEBUG,       ("ip_reass: fragment outside of buffer (%"S16_F":%"S16_F"/%"S16_F").\n", offset,        offset + len, IP_REASS_BUFSIZE));      ip_reasstmr = 0;      goto nullreturn;    }    /* Copy the fragment into the reassembly buffer, at the right       offset. */    LWIP_DEBUGF(IP_REASS_DEBUG,     ("ip_reass: copying with offset %"S16_F" into %"S16_F":%"S16_F"\n", offset,      IP_HLEN + offset, IP_HLEN + offset + len));    i = IPH_HL(fraghdr) * 4;    copy_from_pbuf(p, &i, &ip_reassbuf[IP_HLEN + offset], len);    /* Update the bitmap. */    if (offset / (8 * 8) == (offset + len) / (8 * 8)) {      LWIP_DEBUGF(IP_REASS_DEBUG,       ("ip_reass: updating single byte in bitmap.\n"));      /* If the two endpoints are in the same byte, we only update that byte. */      LWIP_ASSERT("offset / (8 * 8) < sizeof(ip_reassbitmap)",                   offset / (8 * 8) < sizeof(ip_reassbitmap));      ip_reassbitmap[offset / (8 * 8)] |=        bitmap_bits[(offset / 8) & 7] &        ~bitmap_bits[((offset + len) / 8) & 7];    } else {      /* If the two endpoints are in different bytes, we update the         bytes in the endpoints and fill the stuff inbetween with         0xff. */      LWIP_ASSERT("offset / (8 * 8) < sizeof(ip_reassbitmap)",                   offset / (8 * 8) < sizeof(ip_reassbitmap));      ip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8) & 7];      LWIP_DEBUGF(IP_REASS_DEBUG,       ("ip_reass: updating many bytes in bitmap (%"S16_F":%"S16_F").\n",        1 + offset / (8 * 8), (offset + len) / (8 * 8)));      for (i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) {        ip_reassbitmap[i] = 0xff;      }      LWIP_ASSERT("(offset + len) / (8 * 8) < sizeof(ip_reassbitmap)",                   (offset + len) / (8 * 8) < sizeof(ip_reassbitmap));      ip_reassbitmap[(offset + len) / (8 * 8)] |=        ~bitmap_bits[((offset + len) / 8) & 7];    }    /* If this fragment has the More Fragments flag set to zero, we       know that this is the last fragment, so we can calculate the       size of the entire packet. We also set the       IP_REASS_FLAG_LASTFRAG flag to indicate that we have received       the final fragment. */    if ((ntohs(IPH_OFFSET(fraghdr)) & IP_MF) == 0) {      ip_reassflags |= IP_REASS_FLAG_LASTFRAG;      ip_reasslen = offset + len;      LWIP_DEBUGF(IP_REASS_DEBUG,       ("ip_reass: last fragment seen, total len %"S16_F"\n",        ip_reasslen));    }    /* Finally, we check if we have a full packet in the buffer. We do       this by checking if we have the last fragment and if all bits       in the bitmap are set. */    if (ip_reassflags & IP_REASS_FLAG_LASTFRAG) {      /* Check all bytes up to and including all but the last byte in         the bitmap. */      LWIP_ASSERT("ip_reasslen / (8 * 8) - 1 < sizeof(ip_reassbitmap)",                   ip_reasslen / (8 * 8) - 1 < sizeof(ip_reassbitmap));      for (i = 0; i < ip_reasslen / (8 * 8) - 1; ++i) {        if (ip_reassbitmap[i] != 0xff) {          LWIP_DEBUGF(IP_REASS_DEBUG,           ("ip_reass: last fragment seen, bitmap %"S16_F"/%"S16_F" failed (%"X16_F")\n",            i, ip_reasslen / (8 * 8) - 1, ip_reassbitmap[i]));          goto nullreturn;        }      }      /* Check the last byte in the bitmap. It should contain just the         right amount of bits. */      LWIP_ASSERT("ip_reasslen / (8 * 8) < sizeof(ip_reassbitmap)",                   ip_reasslen / (8 * 8) < sizeof(ip_reassbitmap));      if (ip_reassbitmap[ip_reasslen / (8 * 8)] !=        (u8_t) ~ bitmap_bits[ip_reasslen / 8 & 7]) {         LWIP_DEBUGF(IP_REASS_DEBUG,          ("ip_reass: last fragment seen, bitmap %"S16_F" didn't contain %"X16_F" (%"X16_F")\n",        ip_reasslen / (8 * 8), ~bitmap_bits[ip_reasslen / 8 & 7],        ip_reassbitmap[ip_reasslen / (8 * 8)]));        goto nullreturn;      }      /* Pretend to be a "normal" (i.e., not fragmented) IP packet         from now on. */      ip_reasslen += IP_HLEN;      IPH_LEN_SET(iphdr, htons(ip_reasslen));      IPH_OFFSET_SET(iphdr, 0);      IPH_CHKSUM_SET(iphdr, 0);      IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));      /* If we have come this far, we have a full packet in the         buffer, so we allocate a pbuf and copy the packet into it. We         also reset the timer. */      ip_reasstmr = 0;      pbuf_free(p);      p = pbuf_alloc(PBUF_LINK, ip_reasslen, PBUF_POOL);      if (p != NULL) {        i = 0;        for (q = p; q != NULL; q = q->next) {          /* Copy enough bytes to fill this pbuf in the chain. The             available data in the pbuf is given by the q->len variable. */          LWIP_DEBUGF(IP_REASS_DEBUG,           ("ip_reass: memcpy from %p (%"S16_F") to %p, %"S16_F" bytes\n",            (void *)&ip_reassbuf[i], i, q->payload,            q->len > ip_reasslen - i ? ip_reasslen - i : q->len));          memcpy(q->payload, &ip_reassbuf[i],            q->len > ip_reasslen - i ? ip_reasslen - i : q->len);          i += q->len;        }        IPFRAG_STATS_INC(ip_frag.fw);      } else {        IPFRAG_STATS_INC(ip_frag.memerr);      }      LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: p %p\n", (void*)p));      return p;    }  }nullreturn:  IPFRAG_STATS_INC(ip_frag.drop);  pbuf_free(p);  return NULL;}#define MAX_MTU 1500static u8_t buf[MEM_ALIGN_SIZE(MAX_MTU)];/** * Fragment an IP datagram if too large for the netif. * * Chop the datagram in MTU sized chunks and send them in order * by using a fixed size static memory buffer (PBUF_ROM) */err_t ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest){  struct pbuf *rambuf;  struct pbuf *header;  struct ip_hdr *iphdr;  u16_t nfb = 0;  u16_t left, cop;  u16_t mtu = netif->mtu;  u16_t ofo, omf;  u16_t last;  u16_t poff = IP_HLEN;  u16_t tmp;  /* Get a RAM based MTU sized pbuf */  rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF);  if (rambuf == NULL) {    return ERR_MEM;  }  rambuf->tot_len = rambuf->len = mtu;  rambuf->payload = MEM_ALIGN((void *)buf);  /* Copy the IP header in it */  iphdr = rambuf->payload;  memcpy(iphdr, p->payload, IP_HLEN);  /* Save original offset */  tmp = ntohs(IPH_OFFSET(iphdr));  ofo = tmp & IP_OFFMASK;  omf = tmp & IP_MF;  left = p->tot_len - IP_HLEN;  while (left) {    last = (left <= mtu - IP_HLEN);    /* Set new offset and MF flag */    ofo += nfb;    tmp = omf | (IP_OFFMASK & (ofo));    if (!last)      tmp = tmp | IP_MF;    IPH_OFFSET_SET(iphdr, htons(tmp));    /* Fill this fragment */    nfb = (mtu - IP_HLEN) / 8;    cop = last ? left : nfb * 8;    p = copy_from_pbuf(p, &poff, (u8_t *) iphdr + IP_HLEN, cop);    /* Correct header */    IPH_LEN_SET(iphdr, htons(cop + IP_HLEN));    IPH_CHKSUM_SET(iphdr, 0);    IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));    if (last)      pbuf_realloc(rambuf, left + IP_HLEN);    /* This part is ugly: we alloc a RAM based pbuf for      * the link level header for each chunk and then      * free it.A PBUF_ROM style pbuf for which pbuf_header     * worked would make things simpler.     */    header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM);    if (header != NULL) {      pbuf_chain(header, rambuf);      netif->output(netif, header, dest);      IPFRAG_STATS_INC(ip_frag.xmit);      pbuf_free(header);    } else {      pbuf_free(rambuf);            return ERR_MEM;        }    left -= cop;  }  pbuf_free(rambuf);  return ERR_OK;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看日韩电影| 亚洲国产精品综合小说图片区| 中文字幕乱码久久午夜不卡| 综合久久国产九一剧情麻豆| 一区二区三区成人| 麻豆精品久久精品色综合| 成人综合激情网| 欧洲精品在线观看| 精品人在线二区三区| 中文字幕在线不卡国产视频| 日韩电影在线一区| 成人成人成人在线视频| 欧美三级三级三级| 久久久久久久一区| 亚洲一区自拍偷拍| 国产麻豆精品在线观看| 在线看不卡av| 国产亚洲欧美日韩俺去了| 一区二区三区蜜桃| 国产黄色成人av| 正在播放亚洲一区| 亚洲欧洲三级电影| 九色综合狠狠综合久久| 色丁香久综合在线久综合在线观看| 日韩欧美一级精品久久| 亚洲精品第一国产综合野| 国产一区二区三区精品视频| 欧美在线你懂的| 国产精品网曝门| 免播放器亚洲一区| 91精品福利视频| 国产精品欧美经典| 麻豆精品一二三| 欧美日韩免费一区二区三区视频| 国产精品网站一区| 国产真实乱子伦精品视频| 欧美日韩美少妇| 亚洲免费观看高清在线观看| 国产又粗又猛又爽又黄91精品| 在线观看不卡一区| 亚洲欧洲成人自拍| 国产精品乡下勾搭老头1| 欧美久久久久中文字幕| 亚洲欧美一区二区三区久本道91 | 欧美视频精品在线| 国产精品久久久久精k8| 国产一区二区三区日韩| 91精品免费观看| 亚洲高清免费视频| 色哟哟一区二区三区| ㊣最新国产の精品bt伙计久久| 国产美女久久久久| 日韩一区二区三区四区| 亚洲aaa精品| 欧美亚洲国产bt| 又紧又大又爽精品一区二区| 99视频热这里只有精品免费| 国产亚洲综合在线| 精品亚洲国产成人av制服丝袜| 91精品中文字幕一区二区三区| 亚洲在线观看免费| 色屁屁一区二区| 国产精品久久久久久久久免费相片| 国产精品综合二区| 久久久久久久久免费| 国内外精品视频| 精品蜜桃在线看| 久久精品国产亚洲高清剧情介绍 | 日韩av中文字幕一区二区| 在线观看日韩av先锋影音电影院| 亚洲欧美韩国综合色| 99精品国产一区二区三区不卡 | 91在线小视频| 亚洲天堂网中文字| 色视频成人在线观看免| 一区二区三区 在线观看视频| 色综合久久中文字幕综合网| 亚洲女同ⅹxx女同tv| 日本韩国一区二区三区| 亚洲国产精品久久人人爱蜜臀| 欧美天堂一区二区三区| 午夜av电影一区| 91麻豆精品国产91久久久资源速度 | 国产综合色在线| 久久久久久久久久看片| 国产成人免费视| 亚洲欧洲成人av每日更新| 色婷婷av久久久久久久| 亚洲成人精品影院| 日韩欧美中文字幕精品| 国产一区二区h| 国产精品进线69影院| 色丁香久综合在线久综合在线观看 | 粉嫩高潮美女一区二区三区| 一区在线播放视频| 欧美网站大全在线观看| 麻豆91在线看| 欧美国产激情二区三区| 一本一道波多野结衣一区二区| 亚洲成人动漫一区| 精品国产a毛片| 成人av网站在线观看免费| 一片黄亚洲嫩模| 日韩欧美一区二区久久婷婷| 国产福利一区二区| 亚洲女人的天堂| 日韩欧美专区在线| av不卡一区二区三区| 午夜影视日本亚洲欧洲精品| 亚洲精品一区二区三区精华液| 波多野结衣在线一区| 亚洲国产精品人人做人人爽| 精品成人a区在线观看| 99久久国产综合精品女不卡| 亚洲国产日韩a在线播放| 欧美成人福利视频| 色猫猫国产区一区二在线视频| 日韩黄色免费网站| 国产精品女人毛片| 91精品国产品国语在线不卡| 国产不卡视频在线观看| 亚洲国产日韩av| 欧美国产视频在线| 91精品中文字幕一区二区三区| 国产成人福利片| 舔着乳尖日韩一区| 国产精品素人视频| 日韩一区二区精品葵司在线 | 亚洲愉拍自拍另类高清精品| 精品播放一区二区| 在线亚洲一区二区| 国产精品羞羞答答xxdd| 亚洲电影视频在线| 国产精品日韩精品欧美在线| 8x8x8国产精品| av在线这里只有精品| 久久99精品国产| 亚洲韩国精品一区| 亚洲欧洲精品一区二区精品久久久 | 亚洲欧美在线视频观看| 精品国产免费一区二区三区四区| 色综合久久久久综合体| 国产美女精品在线| 奇米影视7777精品一区二区| 亚洲欧美日韩国产手机在线| 国产欧美日韩视频在线观看| 777奇米成人网| 91福利视频在线| 99久久婷婷国产综合精品| 紧缚奴在线一区二区三区| 亚洲一二三区不卡| 综合激情成人伊人| 国产精品区一区二区三| 精品sm捆绑视频| 欧美一区日韩一区| 欧美在线不卡视频| 99re视频精品| 成人av资源网站| 国产传媒一区在线| 狠狠色丁香婷婷综合| 开心九九激情九九欧美日韩精美视频电影| 一区二区免费看| 亚洲欧美福利一区二区| 国产精品久久久久三级| 国产婷婷一区二区| 久久中文字幕电影| 精品欧美一区二区久久| 欧美丰满一区二区免费视频| 欧美性videosxxxxx| 在线视频亚洲一区| 91国偷自产一区二区开放时间| 99久久99久久精品国产片果冻| 成人综合在线观看| 成人av午夜影院| www.日韩av| 91色乱码一区二区三区| 91在线国产观看| 波多野结衣中文字幕一区 | 国产精品久久久久7777按摩| 亚洲国产精品t66y| 国产精品久久久久久久久果冻传媒| 国产精品久久看| 亚洲天天做日日做天天谢日日欢 | 欧美在线999| 欧美美女激情18p| 777奇米四色成人影色区| 欧美顶级少妇做爰| 日韩欧美一级二级三级久久久| 亚洲精品一区二区在线观看| 精品国产一区二区精华| 欧美videos大乳护士334| 日韩免费性生活视频播放| 精品国产乱码久久久久久免费| 久久久电影一区二区三区| 欧美激情一区二区在线| 亚洲日韩欧美一区二区在线| 一区二区三区欧美日韩| 婷婷六月综合亚洲| 精品午夜久久福利影院| 风间由美一区二区av101|