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

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

?? ip_frag.c

?? SEP3203_DTU
?? 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 <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;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产欧美一区二区| 久久免费电影网| 国产麻豆精品久久一二三| 日本一不卡视频| 中文字幕乱码亚洲精品一区| 欧美精三区欧美精三区| 国产福利一区二区| 青青草97国产精品免费观看无弹窗版 | 亚洲精品五月天| 久久嫩草精品久久久久| 欧美日韩国产乱码电影| 99久久er热在这里只有精品15| 免费在线欧美视频| 亚洲精选在线视频| 中文字幕亚洲一区二区va在线| 91精品在线观看入口| 91色视频在线| 丰满亚洲少妇av| 国模少妇一区二区三区| 亚洲高清久久久| 一区二区三区视频在线观看| 久久精品一二三| 精品日本一线二线三线不卡| 精品视频一区三区九区| 91免费看视频| 成人av网址在线观看| 精品一区二区三区影院在线午夜| 亚洲成人午夜影院| 亚洲一区二区三区激情| 日韩伦理免费电影| 亚洲欧美综合在线精品| 国产亚洲精品精华液| 精品久久久久久久久久久久包黑料 | 91麻豆精品国产91久久久使用方法| 波波电影院一区二区三区| 国产精品资源在线看| 日韩写真欧美这视频| 51午夜精品国产| 欧美日韩一区二区三区四区 | 性做久久久久久久免费看| 亚洲最色的网站| 综合久久久久久久| 久久九九99视频| 国产日韩欧美在线一区| 日本一区二区三区电影| 国产精品欧美久久久久一区二区| 国产日产精品1区| 国产嫩草影院久久久久| 国产蜜臀97一区二区三区| 欧美韩国日本综合| 国产精品久久久久精k8| 亚洲色图清纯唯美| 一区二区免费在线| 亚洲综合色噜噜狠狠| 亚洲高清在线精品| 首页国产欧美久久| 久久成人免费日本黄色| 国产毛片一区二区| 不卡视频一二三| 色综合 综合色| 欧美日韩黄色一区二区| 日韩一级片在线观看| 久久久久国色av免费看影院| 国产三级久久久| 亚洲美女区一区| 日本一道高清亚洲日美韩| 国产一区二区福利视频| 成人性生交大合| 在线日韩av片| 日韩精品一区二区三区视频在线观看| 久久人人爽人人爽| **欧美大码日韩| 舔着乳尖日韩一区| 国产美女在线精品| 99视频在线观看一区三区| 欧美在线制服丝袜| 日韩欧美国产系列| 国产精品久久精品日日| 婷婷丁香激情综合| 国产成人精品免费一区二区| 在线看不卡av| 久久精品日产第一区二区三区高清版| 亚洲欧美欧美一区二区三区| 日韩av在线发布| 不卡一区二区中文字幕| 欧美精品第一页| 日本一区二区三级电影在线观看 | 狠狠色狠狠色综合日日91app| 成人h动漫精品一区二区| 欧美日韩国产综合一区二区三区| 国产午夜精品福利| 一区二区三区日韩欧美| 国内精品写真在线观看| 91丨porny丨户外露出| 欧美成人免费网站| 一区二区三区电影在线播| 久久97超碰国产精品超碰| 色先锋久久av资源部| 日韩美一区二区三区| 亚洲精品国产第一综合99久久| 久久激情五月婷婷| 一本久久精品一区二区| 2024国产精品| 午夜在线电影亚洲一区| 国产成人av一区二区三区在线 | 在线观看国产日韩| 国产欧美日韩一区二区三区在线观看| 日韩高清一级片| 在线免费观看日韩欧美| 中文字幕欧美国产| 国精产品一区一区三区mba桃花| 欧美在线观看你懂的| 亚洲国产精品av| 久久av资源网| 91精品国产91热久久久做人人| 亚洲天堂成人网| 懂色av一区二区在线播放| 精品美女一区二区三区| 亚洲成人777| 91国产免费观看| 国产精品美女www爽爽爽| 精品夜夜嗨av一区二区三区| 欧美日本乱大交xxxxx| 亚洲欧美二区三区| a在线播放不卡| 国产精品情趣视频| 国产成人午夜视频| 国产清纯在线一区二区www| 极品少妇xxxx精品少妇偷拍| 91精品国产手机| 日韩精品午夜视频| 欧美日韩大陆在线| 亚洲aaa精品| 欧美日韩久久不卡| 亚洲成人手机在线| 欧美日韩三级一区二区| 一区二区三区在线视频播放| 99久久国产综合色|国产精品| 国产精品免费aⅴ片在线观看| 国产在线播放一区| 26uuu色噜噜精品一区二区| 看片网站欧美日韩| 欧美xfplay| 国产精品一卡二卡| 国产欧美日韩卡一| 波多野结衣亚洲| 中文字幕日韩欧美一区二区三区| 成人午夜伦理影院| 国产精品久久久久久久久久久免费看 | 色国产综合视频| 亚洲国产精品精华液网站 | 欧美精品一区二| 国产精品中文欧美| 国产精品污www在线观看| 成人app网站| 一区二区三区中文字幕在线观看| 色老综合老女人久久久| 亚洲午夜免费视频| 欧美一区二区三区免费观看视频| 日av在线不卡| 国产亚洲欧美日韩日本| 成人精品免费看| 亚洲色欲色欲www| 欧美日韩精品是欧美日韩精品| 男男成人高潮片免费网站| 久久这里都是精品| 成人黄色777网| 一区二区久久久| 日韩精品一区二区三区中文不卡| 国产一区二区精品久久99| 国产精品日韩成人| 欧美日韩一区高清| 韩国v欧美v亚洲v日本v| 国产精品免费视频观看| 欧美性色aⅴ视频一区日韩精品| 日韩—二三区免费观看av| 精品国产乱码久久久久久免费| 福利一区在线观看| 亚洲午夜三级在线| 欧美精品一区在线观看| 99国产精品久久久久| 天天综合天天综合色| 中文文精品字幕一区二区| 欧美日本一区二区| 国产aⅴ综合色| 亚洲成人动漫精品| 亚洲国产精品精华液2区45| 欧美视频精品在线| 欧美日韩亚洲综合在线| 黄网站免费久久| 亚洲自拍偷拍网站| 国产视频一区二区在线观看| 91浏览器入口在线观看| 久久99国产精品尤物| 亚洲另类在线制服丝袜| 2023国产精品| 91麻豆精品国产91久久久久久久久 | 中文在线一区二区| 日韩小视频在线观看专区| 色成人在线视频|