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

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

?? timer.c

?? 內核是系統的心臟
?? C
字號:
/*
 * INET		An implementation of the TCP/IP protocol suite for the LINUX
 *		operating system.  INET is implemented using the  BSD Socket
 *		interface as the means of communication with the user level.
 *
 *		TIMER - implementation of software timers.
 *
 * Version:	@(#)timer.c	1.0.7	05/25/93
 *
 * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *		Corey Minyard <wf-rch!minyard@relay.EU.net>
 *		Fred Baumgarten, <dc6iq@insu1.etec.uni-karlsruhe.de>
 *		Florian La Roche, <flla@stud.uni-sb.de>
 *
 * Fixes:
 *		Alan Cox	:	To avoid destroying a wait queue as we use it
 *					we defer destruction until the destroy timer goes
 *					off.
 *		Alan Cox	:	Destroy socket doesnt write a status value to the
 *					socket buffer _AFTER_ freeing it! Also sock ensures
 *					the socket will get removed BEFORE this is called
 *					otherwise if the timer TIME_DESTROY occurs inside
 *					of inet_bh() with this socket being handled it goes
 *					BOOM! Have to stop timer going off if inet_bh is
 *					active or the destroy causes crashes.
 *
 *		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.
 */

#include <linux/types.h>
#include <linux/errno.h>
#include <linux/socket.h>
#include <linux/in.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/timer.h>
#include <asm/system.h>
#include <linux/interrupt.h>
#include "inet.h"
#include "dev.h"
#include "ip.h"
#include "protocol.h"
#include "tcp.h"
#include "skbuff.h"
#include "sock.h"
#include "arp.h"

void
delete_timer (struct sock *t)
{
  unsigned long flags;

  save_flags (flags);
  cli();

  t->timeout = 0;
  del_timer (&t->timer);

  restore_flags (flags);
}

void
reset_timer (struct sock *t, int timeout, unsigned long len)
{
  delete_timer (t);

  if (timeout != -1)
    t->timeout = timeout;

#if 1
  /* FIXME: ??? */
  if ((int) len < 0)	/* prevent close to infinite timers. THEY _DO_ */
	len = 3;	/* happen (negative values ?) - don't ask me why ! -FB */
#endif
  t->timer.expires = len;
  add_timer (&t->timer);
}


/*
 * Now we will only be called whenever we need to do
 * something, but we must be sure to process all of the
 * sockets that need it.
 */
void
net_timer (unsigned long data)
{
  struct sock *sk = (struct sock*)data;
  int why = sk->timeout;
  /* timeout is overwritten by 'delete_timer' and 'reset_timer' */

  if (sk->inuse || in_inet_bh()) {
    sk->timer.expires = 10;
    add_timer(&sk->timer);
    return;
  }
  sk->inuse = 1;

  DPRINTF ((DBG_TMR, "net_timer: found sk=%X why = %d\n", sk, why));
  if (sk->wfront && 
      before(sk->window_seq, sk->wfront->h.seq) &&
      sk->send_head == NULL &&
      sk->ack_backlog == 0 &&
      sk->state != TCP_TIME_WAIT)
    reset_timer(sk, TIME_PROBE0, sk->rto);
  else if (sk->keepopen)
    reset_timer (sk, TIME_KEEPOPEN, TCP_TIMEOUT_LEN);

  /* Always see if we need to send an ack. */
  if (sk->ack_backlog) {
    sk->prot->read_wakeup (sk);
    if (! sk->dead)
      wake_up_interruptible (sk->sleep);
  }

  /* Now we need to figure out why the socket was on the timer. */
  switch (why) {
    case TIME_DONE:
	if (! sk->dead || sk->state != TCP_CLOSE) {
	  printk ("non dead socket in time_done\n");
	  release_sock (sk);
	  break;
	}
	destroy_sock (sk);
	break;
    case TIME_DESTROY:
	/* We've waited for a while for all the memory associated with
	 * the socket to be freed.  We need to print an error message.
	 */
	if(sk->wmem_alloc!=0 || sk->rmem_alloc!=0)
	{
		DPRINTF ((DBG_TMR, "possible memory leak.  sk = %X\n", sk));
		sk->wmem_alloc++;	/* So it DOESNT go away */
		destroy_sock (sk);
		sk->wmem_alloc--;	/* Might now have hit 0 - fall through and do it again if so */
		sk->inuse = 0;	/* This will be ok, the destroy won't totally work */
	}
	if(sk->wmem_alloc==0 && sk->rmem_alloc==0)
		destroy_sock(sk);	/* Socket gone, DONT update sk->inuse! */
	break;
    case TIME_CLOSE:
	/* We've waited long enough, close the socket. */
	sk->state = TCP_CLOSE;
	delete_timer (sk);
	/* Kill the ARP entry in case the hardware has changed. */
	arp_destroy_maybe (sk->daddr);
	if (!sk->dead)
	  wake_up_interruptible (sk->sleep);
	sk->shutdown = SHUTDOWN_MASK;
	reset_timer (sk, TIME_DESTROY, TCP_DONE_TIME);
	release_sock (sk);
	break;
    case TIME_PROBE0:
	tcp_send_probe0(sk);
	release_sock (sk);
	break;
    case TIME_WRITE:	/* try to retransmit. */
	/* It could be we got here because we needed to send an ack.
	 * So we need to check for that.
	 */
	if (sk->send_head) {
	  if (jiffies < (sk->send_head->when + sk->rto)) {
	    reset_timer (sk, TIME_WRITE, 
			 (sk->send_head->when + sk->rto - jiffies));
	    release_sock (sk);
	    break;
	  }
	  /* printk("timer: seq %d retrans %d out %d cong %d\n", sk->send_head->h.seq,
	     sk->retransmits, sk->packets_out, sk->cong_window); */
	  DPRINTF ((DBG_TMR, "retransmitting.\n"));
	  sk->prot->retransmit (sk, 0);
	  if ((sk->state == TCP_ESTABLISHED && sk->retransmits && !(sk->retransmits & 7))
	    || (sk->state != TCP_ESTABLISHED && sk->retransmits > TCP_RETR1)) {
	    DPRINTF ((DBG_TMR, "timer.c TIME_WRITE time-out 1\n"));
	    arp_destroy_maybe (sk->daddr);
	    ip_route_check (sk->daddr);
	  }
	  if (sk->state != TCP_ESTABLISHED && sk->retransmits > TCP_RETR2) {
	    DPRINTF ((DBG_TMR, "timer.c TIME_WRITE time-out 2\n"));
	    sk->err = ETIMEDOUT;
	    if (sk->state == TCP_FIN_WAIT1 || sk->state == TCP_FIN_WAIT2
	      || sk->state == TCP_LAST_ACK) {
	      sk->state = TCP_TIME_WAIT;
	      reset_timer (sk, TIME_CLOSE, TCP_TIMEWAIT_LEN);
	    } else {
	      sk->prot->close (sk, 1);
	      break;
	    }
	  }
	}
	release_sock (sk);
	break;
    case TIME_KEEPOPEN:
	/* Send something to keep the connection open. */
	if (sk->prot->write_wakeup)
	  sk->prot->write_wakeup (sk);
	sk->retransmits++;
	if (sk->shutdown == SHUTDOWN_MASK) {
	  sk->prot->close (sk, 1);
	  sk->state = TCP_CLOSE;
	}

	if ((sk->state == TCP_ESTABLISHED && sk->retransmits && !(sk->retransmits & 7))
	  || (sk->state != TCP_ESTABLISHED && sk->retransmits > TCP_RETR1)) {
	  DPRINTF ((DBG_TMR, "timer.c TIME_KEEPOPEN time-out 1\n"));
	  arp_destroy_maybe (sk->daddr);
	  ip_route_check (sk->daddr);
	  release_sock (sk);
	  break;
	}
	if (sk->state != TCP_ESTABLISHED && sk->retransmits > TCP_RETR2) {
	  DPRINTF ((DBG_TMR, "timer.c TIME_KEEPOPEN time-out 2\n"));
	  arp_destroy_maybe (sk->daddr);
	  sk->err = ETIMEDOUT;
	  if (sk->state == TCP_FIN_WAIT1 || sk->state == TCP_FIN_WAIT2) {
	    sk->state = TCP_TIME_WAIT;
	    if (!sk->dead)
	      wake_up_interruptible (sk->sleep);
	    release_sock (sk);
	  } else {
	    sk->prot->close (sk, 1);
	  }
	  break;
	}
	release_sock (sk);
	break;
    default:
	printk ("net timer expired - reason unknown, sk=%08X\n", (int)sk);
	release_sock (sk);
	break;
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕va一区二区三区| 精品一区二区三区蜜桃| 裸体歌舞表演一区二区| 成人av网站在线观看| 欧美男生操女生| 中文字幕日韩欧美一区二区三区| 亚洲v精品v日韩v欧美v专区| 成人美女视频在线看| 日韩精品一区在线| 亚洲成人av福利| 一本一道综合狠狠老| 日本一区二区三区dvd视频在线| 天天综合天天综合色| 91香蕉国产在线观看软件| 国产v日产∨综合v精品视频| www.激情成人| 麻豆一区二区99久久久久| 91啦中文在线观看| 国产情人综合久久777777| 日韩vs国产vs欧美| 欧美日韩小视频| 亚洲免费大片在线观看| 99视频精品全部免费在线| 国产婷婷一区二区| 国产美女娇喘av呻吟久久| 日韩欧美二区三区| 日本不卡视频一二三区| 欧美日韩精品一区二区三区| 亚洲一区二区三区四区在线 | 成人的网站免费观看| 精品久久人人做人人爱| 久久激情五月婷婷| 久久综合网色—综合色88| 久久精品久久精品| 2021国产精品久久精品| 狠狠狠色丁香婷婷综合激情| 久久久久99精品一区| 日本aⅴ亚洲精品中文乱码| 91精品久久久久久蜜臀| 免费一级欧美片在线观看| 欧美一区二区网站| 久久99深爱久久99精品| 久久久久久麻豆| 成人小视频免费观看| 亚洲码国产岛国毛片在线| 欧美日韩午夜影院| 日本欧美大码aⅴ在线播放| 欧美tk—视频vk| 国产乱码精品一区二区三区忘忧草 | 亚洲精品国产第一综合99久久| 成人高清视频在线观看| 一区免费观看视频| 在线亚洲一区二区| 天天综合网天天综合色| 久久综合狠狠综合久久激情| 成人av在线一区二区三区| 亚洲日本青草视频在线怡红院| 欧美三区在线观看| 国产米奇在线777精品观看| 中文字幕亚洲区| 7777精品伊人久久久大香线蕉完整版| 久久精品国产亚洲一区二区三区| 国产午夜精品久久| 欧美日韩视频一区二区| 久久精品免费看| 亚洲天堂福利av| 欧美电影免费观看高清完整版在线观看 | 欧美一区二区网站| 国产成人在线观看免费网站| 一区二区三区高清在线| 日韩精品一区二区三区老鸭窝| 99这里只有精品| 日本美女一区二区三区| 中文字幕一区免费在线观看| 制服丝袜亚洲色图| 95精品视频在线| 久久99精品久久久久久久久久久久| 国产精品欧美经典| 欧美一二三区在线| 欧美影视一区在线| 高清成人在线观看| 美国精品在线观看| 一区二区三区蜜桃| 中文字幕av一区二区三区高| 欧美一区二区网站| 欧美午夜一区二区三区| 成人精品视频一区二区三区| 蜜臀精品一区二区三区在线观看| 亚洲色图在线视频| 国产日韩欧美a| 精品日韩一区二区| 宅男噜噜噜66一区二区66| 在线免费不卡视频| 国产精品一区2区| 奇米色一区二区三区四区| 一级精品视频在线观看宜春院| 国产欧美综合在线观看第十页| 欧美tk—视频vk| 日韩一卡二卡三卡四卡| 欧美日韩视频一区二区| 在线免费观看日本欧美| 91麻豆免费视频| 91在线国产福利| 99久久国产免费看| 91原创在线视频| 成年人国产精品| 成人免费看视频| 国产成人精品在线看| 韩国一区二区视频| 精品一区二区三区在线观看 | 香蕉影视欧美成人| 亚洲精品自拍动漫在线| 自拍偷拍亚洲综合| 亚洲精品自拍动漫在线| 亚洲麻豆国产自偷在线| 一区二区日韩av| 亚洲国产一区二区三区| 亚洲成av人在线观看| 五月天欧美精品| 三级亚洲高清视频| 美脚の诱脚舐め脚责91| 国产做a爰片久久毛片| 国产一区在线不卡| youjizz久久| 99久久99久久免费精品蜜臀| 色av综合在线| 欧美男生操女生| 26uuu精品一区二区| 国产亚洲一区二区三区在线观看| 国产精品无人区| 亚洲色图都市小说| 日本不卡免费在线视频| 国产一区不卡视频| 99免费精品在线| 欧美伦理视频网站| 久久久久久99精品| 中文字幕佐山爱一区二区免费| 亚洲精品v日韩精品| 一区二区三区欧美视频| 免费久久精品视频| 国产成人欧美日韩在线电影| 97国产精品videossex| 欧美日韩不卡在线| 国产三级一区二区三区| 亚洲精品乱码久久久久久| 午夜视频在线观看一区二区三区| 激情综合五月婷婷| 色婷婷久久久亚洲一区二区三区 | 蜜臀a∨国产成人精品| 国产高清精品网站| 日本韩国欧美一区| 久久伊99综合婷婷久久伊| 日韩毛片精品高清免费| 免费成人在线视频观看| 99re视频精品| 欧美va亚洲va在线观看蝴蝶网| 日韩毛片视频在线看| 九一九一国产精品| 在线观看视频一区| 26uuu国产在线精品一区二区| 亚洲精品免费看| 黄色小说综合网站| 91成人在线精品| 亚洲国产高清aⅴ视频| 日韩av在线免费观看不卡| 成人a区在线观看| 欧美电影一区二区| 亚洲三级视频在线观看| 国产九色精品成人porny| 欧美区一区二区三区| 日韩美女视频一区二区| 国产精品一级在线| 精品久久国产老人久久综合| 亚洲最大的成人av| 不卡电影免费在线播放一区| 精品1区2区在线观看| 视频在线观看一区| 色94色欧美sute亚洲13| 欧美激情一区在线观看| 另类中文字幕网| 在线成人午夜影院| 亚洲一区在线观看免费| zzijzzij亚洲日本少妇熟睡| 久久精品一区二区| 国产精品一级二级三级| 日韩美一区二区三区| 天天综合天天做天天综合| 精品视频999| 亚洲男人的天堂网| 91亚洲永久精品| 18涩涩午夜精品.www| 国产一区视频在线看| 精品国产免费人成电影在线观看四季| 石原莉奈在线亚洲三区| 欧美人伦禁忌dvd放荡欲情| 亚洲高清在线视频| 欧美欧美午夜aⅴ在线观看| 亚洲 欧美综合在线网络| 欧美午夜不卡视频| 午夜a成v人精品|