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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ip_frag.c

?? LWIP源碼.rar
?? C
字號:
/* @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 "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)];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 */ static void ip_reass_timer(void *arg){  (void)arg;  if (ip_reasstmr > 1) {    ip_reasstmr--;    sys_timeout(IP_REASS_TMO, ip_reass_timer, NULL);  } else if (ip_reasstmr == 1)  ip_reasstmr = 0;}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;    sys_timeout(IP_REASS_TMO, ip_reass_timer, NULL);    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 old packet\n"));    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 (%d:%d/%d).\n", offset,        offset + len, IP_REASS_BUFSIZE));      sys_untimeout(ip_reass_timer, NULL);      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 %d into %d:%d\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. */      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. */      ip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8) & 7];      LWIP_DEBUGF(IP_REASS_DEBUG,       ("ip_reass: updating many bytes in bitmap (%d:%d).\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;      }      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 %d\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. */      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 %d/%d failed (%x)\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. */      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 %d didn't contain %x (%x)\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. */      sys_untimeout(ip_reass_timer, NULL);      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 (%d) to %p, %d 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 packet if too large * * Chop the packet 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);  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);    pbuf_chain(header, rambuf);    netif->output(netif, header, dest);    IPFRAG_STATS_INC(ip_frag.xmit);    pbuf_free(header);    left -= cop;  }  pbuf_free(rambuf);  return ERR_OK;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美国产一区二区在线播放| 亚洲狠狠丁香婷婷综合久久久| 成人午夜免费av| 99视频精品免费视频| 日韩一级精品视频在线观看| 中文字幕一区二区不卡| 久久成人久久鬼色| 欧美日韩综合一区| 国产精品天干天干在观线| 久久99久久99精品免视看婷婷| 亚洲国产一区视频| 风间由美中文字幕在线看视频国产欧美| 亚洲成人激情综合网| 韩国视频一区二区| 欧美精品18+| 亚洲第一在线综合网站| 99久久99久久精品免费观看| 久久久久高清精品| 久久不见久久见中文字幕免费| 久久精品国产精品青草| 精品1区2区3区| 亚洲精品伦理在线| 91老师片黄在线观看| 国产日产欧美一区| 精品无码三级在线观看视频| 91麻豆精品国产91久久久资源速度| 欧美一区二区三区在| 夜夜夜精品看看| 在线观看亚洲精品| 亚洲综合在线视频| 91久久线看在观草草青青| 亚洲日本va午夜在线电影| gogo大胆日本视频一区| 国产精品久久久久久久久晋中| 亚洲在线一区二区三区| 成人av在线播放网址| 国产精品久久久久久久岛一牛影视| 最新欧美精品一区二区三区| gogogo免费视频观看亚洲一| 亚洲天堂网中文字| 91高清视频在线| 夜夜精品视频一区二区| 欧美日韩电影在线播放| 蜜臀av性久久久久蜜臀av麻豆| 国产精品 日产精品 欧美精品| 99视频在线精品| 亚洲主播在线播放| 欧美一区二区三区婷婷月色| 天涯成人国产亚洲精品一区av| 成人免费视频播放| 亚洲人精品一区| 欧美性大战久久久久久久蜜臀| 日韩美女天天操| 国产精品一区二区男女羞羞无遮挡 | 日本欧美一区二区三区| 欧美精品日韩一本| 国产在线精品一区二区夜色| 国产女人aaa级久久久级| 91最新地址在线播放| 亚洲国产一区二区a毛片| 日韩午夜精品电影| aaa国产一区| 免费av成人在线| 日本一区二区成人| 一本久久综合亚洲鲁鲁五月天| 欧美不卡一区二区| 99精品欧美一区二区蜜桃免费 | 国产成人h网站| 亚洲精品乱码久久久久久黑人 | 精品国产精品一区二区夜夜嗨| ㊣最新国产の精品bt伙计久久| 久久爱www久久做| 国产精品美女久久久久久| 欧美日韩免费观看一区三区| 蜜桃一区二区三区在线| 亚洲人成网站在线| 精品国产乱码久久久久久久| 欧洲av一区二区嗯嗯嗯啊| 久久精品国产久精国产爱| 亚洲欧美日本在线| 欧美成人女星排名| 欧美少妇一区二区| 成年人网站91| 国模冰冰炮一区二区| 亚洲a一区二区| 亚洲色图.com| 国产色综合久久| 日韩精品一区二区三区中文不卡| 强制捆绑调教一区二区| 亚洲视频一二三区| 精品成人在线观看| 91极品视觉盛宴| 99久久婷婷国产精品综合| 精品一区二区三区的国产在线播放 | 亚洲一二三级电影| 久久久久97国产精华液好用吗| 裸体健美xxxx欧美裸体表演| 尤物av一区二区| 自拍视频在线观看一区二区| 国产亚洲1区2区3区| 亚洲精品在线观看视频| 91精品国产福利| 欧美蜜桃一区二区三区 | 国产精品免费视频网站| 精品第一国产综合精品aⅴ| 911精品产国品一二三产区| 色婷婷久久久综合中文字幕| 成人一区二区视频| 国产精品一区三区| 国产精品一区二区无线| 国产精品18久久久久久久久| 免费久久99精品国产| 青娱乐精品视频在线| 天天影视网天天综合色在线播放| 精品国产91久久久久久久妲己 | 国产午夜精品一区二区三区视频| 国产91丝袜在线播放0| 国内精品伊人久久久久av影院| 国产亚洲综合av| 久久精品视频一区二区三区| 国产日韩精品视频一区| 精品国产精品网麻豆系列 | 国产精品一二三区在线| 韩国成人精品a∨在线观看| 久久er精品视频| 国产伦理精品不卡| 国产成人8x视频一区二区| 国产成人综合在线观看| 播五月开心婷婷综合| 国产91色综合久久免费分享| 成人黄色大片在线观看| 99精品久久只有精品| 欧美三级三级三级| 欧美大片免费久久精品三p| 精品国产亚洲在线| 中文字幕第一页久久| 最新国产成人在线观看| 亚洲mv在线观看| 国产一区二三区好的| 高清视频一区二区| 欧美综合亚洲图片综合区| 6080日韩午夜伦伦午夜伦| 精品理论电影在线| 中文字幕中文字幕中文字幕亚洲无线 | 欧美一级搡bbbb搡bbbb| 欧美videos中文字幕| 久久久九九九九| 亚洲精品ww久久久久久p站| 日韩精品福利网| 成人免费看视频| 这里只有精品电影| 国产人久久人人人人爽| 亚洲一区二区三区影院| 精品一区二区三区久久久| 一本在线高清不卡dvd| 欧美人xxxx| 国产精品高清亚洲| 日日夜夜精品视频免费| 国产成人精品网址| 欧美日韩一级片网站| 国产日本亚洲高清| 天天射综合影视| 99久久99久久精品国产片果冻| 国产麻豆视频精品| 欧美日韩午夜在线视频| 欧美国产亚洲另类动漫| 亚洲超碰精品一区二区| 国产不卡在线一区| 6080午夜不卡| 一二三四社区欧美黄| 国产成人无遮挡在线视频| 7777精品伊人久久久大香线蕉 | 久久婷婷国产综合国色天香| 一区二区在线观看免费视频播放| 国产精品美女久久久久久 | 国产福利一区二区三区在线视频| 久久99最新地址| 欧美日韩国产综合一区二区三区| 日本精品视频一区二区三区| 国产亚洲欧美日韩日本| 日本伊人精品一区二区三区观看方式| 一区二区三区精品久久久| 丁香一区二区三区| 精品欧美乱码久久久久久| 自拍偷拍欧美激情| 成人午夜免费av| 国产三区在线成人av| 国产一区视频在线看| 欧美精品久久久久久久久老牛影院| 欧美电影影音先锋| 一级中文字幕一区二区| 成人影视亚洲图片在线| 久久久噜噜噜久噜久久综合| 久久精品国产99国产| 欧美男男青年gay1069videost| 久久综合中文字幕| 极品少妇xxxx偷拍精品少妇| 精品污污网站免费看| 亚洲一区二区中文在线| 欧洲亚洲精品在线|