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

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

?? fragment.c

?? OpenVPN is a robust and highly flexible tunneling application that uses all of the encryption, authe
?? C
字號:
/* *  OpenVPN -- An application to securely tunnel IP networks *             over a single UDP port, with support for SSL/TLS-based *             session authentication and key exchange, *             packet encryption, packet authentication, and *             packet compression. * *  Copyright (C) 2002-2004 James Yonan <jim@yonan.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program (see the file COPYING included with this *  distribution); if not, write to the Free Software Foundation, Inc., *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifdef WIN32#include "config-win32.h"#else#include "config.h"#endif#include "syshead.h"#include "misc.h"#include "fragment.h"#include "integer.h"#include "memdbg.h"#define FRAG_ERR(s) { errmsg = s; goto error; }static voidfragment_list_buf_init (struct fragment_list *list, const struct frame *frame){  int i;  for (i = 0; i < N_FRAG_BUF; ++i)    list->fragments[i].buf = alloc_buf (BUF_SIZE (frame));}static voidfragment_list_buf_free (struct fragment_list *list){  int i;  for (i = 0; i < N_FRAG_BUF; ++i)    free_buf (&list->fragments[i].buf);}/* * Given a sequence ID number, get a fragment buffer.  Use a sliding window, * similar to packet_id code. */static struct fragment *fragment_list_get_buf (struct fragment_list *list, int seq_id){  int diff;  if (abs (diff = modulo_subtract (seq_id, list->seq_id, N_SEQ_ID)) >= N_FRAG_BUF)    {      int i;      for (i = 0; i < N_FRAG_BUF; ++i)	list->fragments[i].defined = false;      list->index = 0;      list->seq_id = seq_id;      diff = 0;    }  while (diff > 0)    {      list->fragments[list->index = modulo_add (list->index, 1, N_FRAG_BUF)].defined = false;      list->seq_id = modulo_add (list->seq_id, 1, N_SEQ_ID);      --diff;    }  return &list->fragments[modulo_add (list->index, diff, N_FRAG_BUF)];}struct fragment_master *fragment_init (struct frame *frame){  struct fragment_master *ret;  /* code that initializes other parts of     fragment_master assume an initial CLEAR */  ALLOC_OBJ_CLEAR (ret, struct fragment_master);  /* add in the size of our contribution to the expanded frame size */  frame_add_to_extra_frame (frame, sizeof(fragment_header_type));  /*   * Outgoing sequence ID is randomized to reduce   * the probability of sequence number collisions   * when openvpn sessions are restarted.  This is   * not done out of any need for security, as all   * fragmentation control information resides   * inside of the encrypted/authenticated envelope.   */  ret->outgoing_seq_id = (int)get_random() & (N_SEQ_ID - 1);  event_timeout_init (&ret->wakeup, FRAG_WAKEUP_INTERVAL, now);  return ret;}voidfragment_free (struct fragment_master *f){  fragment_list_buf_free (&f->incoming);  free_buf (&f->outgoing);  free_buf (&f->outgoing_return);  free (f);}voidfragment_frame_init (struct fragment_master *f, const struct frame *frame){  fragment_list_buf_init (&f->incoming, frame);  f->outgoing = alloc_buf (BUF_SIZE (frame));  f->outgoing_return = alloc_buf (BUF_SIZE (frame));}/* * Accept an incoming datagram (which may be a fragment) from remote. * If the datagram is whole (i.e not a fragment), pass through. * If the datagram is a fragment, join with other fragments received so far. * If a fragment fully completes the datagram, return the datagram. */voidfragment_incoming (struct fragment_master *f, struct buffer *buf,		   const struct frame* frame){  const char *errmsg = NULL;  fragment_header_type flags = 0;  int frag_type = 0;  if (buf->len > 0)    {      /* get flags from packet head */      if (!buf_read (buf, &flags, sizeof (flags)))	FRAG_ERR ("flags not found in packet");      flags = ntoh_fragment_header_type (flags);      /* get fragment type from flags */      frag_type = ((flags >> FRAG_TYPE_SHIFT) & FRAG_TYPE_MASK);#if 0      /*       * If you want to extract FRAG_EXTRA_MASK/FRAG_EXTRA_SHIFT bits,       * do it here.       */      if (frag_type == FRAG_WHOLE || frag_type == FRAG_YES_NOTLAST)	{	}#endif      /* handle the fragment type */      if (frag_type == FRAG_WHOLE)	{	  msg (D_FRAG_DEBUG,	       "FRAG_IN buf->len=%d type=FRAG_WHOLE flags="	       fragment_header_format,	       buf->len,	       flags);	  if (flags & (FRAG_SEQ_ID_MASK | FRAG_ID_MASK))	    FRAG_ERR ("spurrious FRAG_WHOLE flags");	}      else if (frag_type == FRAG_YES_NOTLAST || frag_type == FRAG_YES_LAST)	{	  const int seq_id = ((flags >> FRAG_SEQ_ID_SHIFT) & FRAG_SEQ_ID_MASK);	  const int n = ((flags >> FRAG_ID_SHIFT) & FRAG_ID_MASK);	  const int size = ((frag_type == FRAG_YES_LAST)			    ? (int)(((flags >> FRAG_SIZE_SHIFT) & FRAG_SIZE_MASK) << FRAG_SIZE_ROUND_SHIFT)			    : buf->len);	  /* get the appropriate fragment buffer based on received seq_id */	  struct fragment *frag = fragment_list_get_buf (&f->incoming, seq_id);	  msg (D_FRAG_DEBUG,	       "FRAG_IN len=%d type=%d seq_id=%d frag_id=%d size=%d flags="	       fragment_header_format,	       buf->len,	       frag_type,	       seq_id,	       n,	       size,	       flags);	  /* make sure that size is an even multiple of 1<<FRAG_SIZE_ROUND_SHIFT */	  if (size & FRAG_SIZE_ROUND_MASK)	    FRAG_ERR ("bad fragment size");	  /* is this the first fragment for our sequence number? */	  if (!frag->defined || (frag->defined && frag->max_frag_size != size))	    {	      frag->defined = true;	      frag->max_frag_size = size;	      frag->map = 0;	      ASSERT (buf_init (&frag->buf, FRAME_HEADROOM (frame)));	    }	  /* copy the data to fragment buffer */	  if (!buf_copy_range (&frag->buf, n * size, buf, 0, buf->len))	    FRAG_ERR ("fragment buffer overflow");	  /* set elements in bit array to reflect which fragments have been received */	  frag->map |= (((frag_type == FRAG_YES_LAST) ? FRAG_MAP_MASK : 1) << n);	  /* update timestamp on partially built datagram */	  frag->timestamp = now;	  /* received full datagram? */	  if ((frag->map & FRAG_MAP_MASK) == FRAG_MAP_MASK)	    {	      frag->defined = false;	      *buf = frag->buf;	    }	  else	    {	      buf->len = 0;	    }	}      else if (frag_type == FRAG_TEST)	{	  FRAG_ERR ("FRAG_TEST not implemented");	}      else	{	  FRAG_ERR ("unknown fragment type");	}    }  return; error:  if (errmsg)    msg (D_FRAG_ERRORS, "FRAG_IN error flags=" fragment_header_format ": %s", flags, errmsg);  buf->len = 0;  return;}/* pack fragment parms into a uint32_t and prepend to buffer */static voidfragment_prepend_flags (struct buffer *buf,			int type,			int seq_id,			int frag_id,			int frag_size){  fragment_header_type flags = ((type & FRAG_TYPE_MASK) << FRAG_TYPE_SHIFT)    | ((seq_id & FRAG_SEQ_ID_MASK) << FRAG_SEQ_ID_SHIFT)    | ((frag_id & FRAG_ID_MASK) << FRAG_ID_SHIFT);  if (type == FRAG_WHOLE || type == FRAG_YES_NOTLAST)    {      /*       * If you want to set FRAG_EXTRA_MASK/FRAG_EXTRA_SHIFT bits,       * do it here.       */      msg (D_FRAG_DEBUG,	   "FRAG_OUT len=%d type=%d seq_id=%d frag_id=%d frag_size=%d flags="	   fragment_header_format,	   buf->len, type, seq_id, frag_id, frag_size, flags);    }  else    {      flags |= (((frag_size >> FRAG_SIZE_ROUND_SHIFT) & FRAG_SIZE_MASK) << FRAG_SIZE_SHIFT);      msg (D_FRAG_DEBUG,	   "FRAG_OUT len=%d type=%d seq_id=%d frag_id=%d frag_size=%d flags="	   fragment_header_format,	   buf->len, type, seq_id, frag_id, frag_size, flags);    }  flags = hton_fragment_header_type (flags);  ASSERT (buf_write_prepend (buf, &flags, sizeof (flags)));}/* * Without changing the number of fragments, return a possibly smaller * max fragment size that will allow for the last fragment to be of * similar size as previous fragments. */static inline intoptimal_fragment_size (int len, int max_frag_size){  const int mfs_aligned = (max_frag_size & ~FRAG_SIZE_ROUND_MASK);  const int div = len / mfs_aligned;  const int mod = len % mfs_aligned;  if (div > 0 && mod > 0 && mod < mfs_aligned * 3 / 4)    return min_int (mfs_aligned, (max_frag_size - ((max_frag_size - mod) / (div + 1))				  + FRAG_SIZE_ROUND_MASK) & ~FRAG_SIZE_ROUND_MASK);  else    return mfs_aligned;}/* process an outgoing datagram, possibly breaking it up into fragments */voidfragment_outgoing (struct fragment_master *f, struct buffer *buf,		   const struct frame* frame){  const char *errmsg = NULL;  if (buf->len > 0)    {      ASSERT (!f->outgoing.len);      if (buf->len > PAYLOAD_SIZE_DYNAMIC(frame)) /* should we fragment? */	{	  /*	   * Send the datagram as a series of 2 or more fragments.	   */	  f->outgoing_frag_size = optimal_fragment_size (buf->len, PAYLOAD_SIZE_DYNAMIC(frame));	  if (buf->len > f->outgoing_frag_size * MAX_FRAGS)	    FRAG_ERR ("too many fragments would be required to send datagram");	  ASSERT (buf_init (&f->outgoing, FRAME_HEADROOM (frame)));	  ASSERT (buf_copy (&f->outgoing, buf));	  f->outgoing_seq_id = modulo_add (f->outgoing_seq_id, 1, N_SEQ_ID);	  f->outgoing_frag_id = 0;	  buf->len = 0;	  ASSERT (fragment_ready_to_send (f, buf, frame));	}      else	{	  /*	   * Send the datagram whole.	   */	  fragment_prepend_flags (buf,				  FRAG_WHOLE,				  0,				  0,				  0);	}    }  return; error:  if (errmsg)    msg (D_FRAG_ERRORS, "FRAG_OUT error, len=%d frag_size=%d MAX_FRAGS=%d: %s",	 buf->len, f->outgoing_frag_size, MAX_FRAGS, errmsg);  buf->len = 0;  return;}/* return true (and set buf) if we have an outgoing fragment which is ready to send */boolfragment_ready_to_send (struct fragment_master *f, struct buffer *buf,			const struct frame* frame){  if (fragment_outgoing_defined (f))    {      /* get fragment size, and determine if it is the last fragment */      int size = f->outgoing_frag_size;      int last = false;      if (f->outgoing.len <= size)	{	  size = f->outgoing.len;	  last = true;	}      /* initialize return buffer */      *buf = f->outgoing_return;      ASSERT (buf_init (buf, FRAME_HEADROOM (frame)));      ASSERT (buf_copy_n (buf, &f->outgoing, size));      /* fragment flags differ based on whether or not we are sending the last fragment */      fragment_prepend_flags (buf,			      last ? FRAG_YES_LAST : FRAG_YES_NOTLAST,			      f->outgoing_seq_id,			      f->outgoing_frag_id++,			      f->outgoing_frag_size);      ASSERT (!last || !f->outgoing.len); /* outgoing buffer length should be zero after last fragment sent */      return true;    }  else    return false;}static voidfragment_ttl_reap (struct fragment_master *f){  int i;  for (i = 0; i < N_FRAG_BUF; ++i)    {      struct fragment *frag = &f->incoming.fragments[i];      if (frag->defined && frag->timestamp + FRAG_TTL_SEC <= now)	{	  msg (D_FRAG_ERRORS, "FRAG TTL expired i=%d", i);	  frag->defined = false;	}    }}/* called every FRAG_WAKEUP_INTERVAL seconds */voidfragment_wakeup (struct fragment_master *f, struct frame *frame){  /* delete fragments with expired TTLs */  fragment_ttl_reap (f);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区黄| 亚洲一区二区三区影院| 亚洲欧美日韩国产另类专区| 天堂久久一区二区三区| 不卡av电影在线播放| 日韩欧美一区二区免费| 国产精品免费观看视频| 亚洲国产精品精华液网站| 国产91精品欧美| 精品久久久网站| 亚洲3atv精品一区二区三区| 99re66热这里只有精品3直播| 精品国产一二三区| 亚洲成a人在线观看| 色综合天天综合网天天看片| 久久久影视传媒| 国内精品国产三级国产a久久| 欧美三级一区二区| 亚洲男人的天堂在线aⅴ视频| 国产成人精品亚洲777人妖| 日韩精品一区二区三区视频| 亚洲成人免费视频| 在线中文字幕不卡| 樱桃视频在线观看一区| 91理论电影在线观看| 中文字幕在线视频一区| 粉嫩久久99精品久久久久久夜| 日韩免费性生活视频播放| 日本va欧美va精品发布| 日韩三级高清在线| 美女精品一区二区| 欧美大白屁股肥臀xxxxxx| 全国精品久久少妇| 日韩欧美专区在线| 国产永久精品大片wwwapp| 久久众筹精品私拍模特| 国产九九视频一区二区三区| 久久综合资源网| 丁香婷婷综合网| 成人免费一区二区三区在线观看| caoporm超碰国产精品| 亚洲色图在线视频| 欧日韩精品视频| 天天操天天色综合| 久久中文字幕电影| 99久久久久免费精品国产| 一区二区三区中文字幕在线观看| 91国偷自产一区二区使用方法| 亚洲综合偷拍欧美一区色| 欧美日韩一二区| 蜜桃视频在线观看一区二区| 亚洲精品在线网站| 99国产精品99久久久久久| 亚洲国产日产av| 日韩免费成人网| www.欧美日韩| 视频一区中文字幕| 久久久蜜臀国产一区二区| av电影在线观看一区| 亚洲成人777| 久久这里只有精品6| 97精品久久久久中文字幕| 调教+趴+乳夹+国产+精品| 久久一区二区视频| 色哟哟在线观看一区二区三区| 人人精品人人爱| 中文字幕av资源一区| 欧美日产在线观看| 成人视屏免费看| 日韩精品成人一区二区三区| 久久精品亚洲国产奇米99| 91极品美女在线| 国产精品91xxx| 亚洲成人av资源| 国产精品久久久久久久久久久免费看 | 91精品在线麻豆| 成人福利视频在线看| 日韩国产一二三区| 成人免费在线视频| wwwwww.欧美系列| 欧美日韩精品免费观看视频| 国产高清在线观看免费不卡| 亚洲va欧美va人人爽午夜| 国产精品视频九色porn| 日韩欧美一卡二卡| 欧美日韩国产不卡| 97se亚洲国产综合自在线观| 国产一区二区电影| 丝袜亚洲另类丝袜在线| 一区二区日韩av| 久久久国际精品| 精品理论电影在线观看| 欧美精品高清视频| 欧美性一二三区| 99久久精品国产精品久久| 精品一区二区在线视频| 亚洲国产综合91精品麻豆| 日韩一区中文字幕| 中文字幕va一区二区三区| 久久久一区二区三区| 91超碰这里只有精品国产| 在线看不卡av| 91久久香蕉国产日韩欧美9色| 高清国产一区二区| 国产一区二区三区高清播放| 六月婷婷色综合| 日本成人在线看| 秋霞电影一区二区| 日韩二区在线观看| 天使萌一区二区三区免费观看| 一区二区三区视频在线观看| 成人欧美一区二区三区视频网页| 欧美激情一区二区| 国产精品国产三级国产有无不卡| 国产欧美精品一区二区三区四区| 国产午夜一区二区三区| 精品国产污污免费网站入口| 国产精品久99| 亚洲国产精品v| 国产精品不卡在线观看| 国产精品久久毛片a| 亚洲精品视频免费看| 洋洋成人永久网站入口| 亚洲午夜久久久久久久久电影院| 亚洲精品美国一| 亚洲va欧美va国产va天堂影院| 亚洲成人精品一区二区| 日韩av中文字幕一区二区| 美女爽到高潮91| 国产91精品久久久久久久网曝门 | 欧美精品一区二区三区四区| 欧美变态口味重另类| 日本一区二区高清| 夜夜精品浪潮av一区二区三区 | 国产精品污网站| 亚洲人午夜精品天堂一二香蕉| 伊人色综合久久天天人手人婷| 午夜欧美在线一二页| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品福利一区二区三区免费视频| 欧美精品一区二区三区蜜桃视频| 国产亚洲精品资源在线26u| 国产精品久久久一本精品| 亚洲在线观看免费| 蜜桃免费网站一区二区三区| 波多野结衣中文字幕一区| 欧美优质美女网站| 久久综合一区二区| 亚洲精品久久久蜜桃| 精品一二三四区| 91碰在线视频| 久久综合久久综合亚洲| 亚洲精品菠萝久久久久久久| 免费在线成人网| 99re亚洲国产精品| 欧美成人一区二区三区片免费| 中文字幕一区二区三区精华液| 香蕉av福利精品导航| 国产精品综合av一区二区国产馆| 91行情网站电视在线观看高清版| 日韩欧美国产精品一区| 亚洲欧美色图小说| 国产一区久久久| 精品视频全国免费看| 中文字幕在线一区| 国产一区91精品张津瑜| 欧美午夜免费电影| 国产精品麻豆欧美日韩ww| 美腿丝袜在线亚洲一区| 色久优优欧美色久优优| 欧美国产日韩在线观看| 免费高清视频精品| 日本乱码高清不卡字幕| 国产免费观看久久| 黄色日韩网站视频| 91精品国产综合久久香蕉的特点 | 99在线精品观看| 久久欧美一区二区| 免费xxxx性欧美18vr| 91福利社在线观看| 日韩毛片一二三区| 懂色一区二区三区免费观看| 宅男噜噜噜66一区二区66| 夜夜爽夜夜爽精品视频| 91麻豆国产福利在线观看| 国产精品久久久久久久久图文区 | 狠狠色伊人亚洲综合成人| 欧美日韩亚洲综合| 一区二区三区丝袜| 欧洲一区在线观看| 中文字幕综合网| 91农村精品一区二区在线| 国产精品美女久久久久久久| 国产大陆亚洲精品国产| 欧美成人免费网站| 九九热在线视频观看这里只有精品| 欧美久久久久久蜜桃| 亚洲福利视频三区| 欧美精品三级日韩久久| 亚洲福利国产精品|