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

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

?? udp.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
		return err;
	memcpy_fromfs(&sin, usin, sizeof(sin));
	if (sin.sin_family && sin.sin_family != AF_INET) 
		return(-EINVAL);
	if (sin.sin_port == 0) 
		return(-EINVAL);
  } else {
	if (sk->state != TCP_ESTABLISHED) return(-EINVAL);
	sin.sin_family = AF_INET;
	sin.sin_port = sk->dummy_th.dest;
	sin.sin_addr.s_addr = sk->daddr;
  }
  
  if(!sk->broadcast && chk_addr(sin.sin_addr.s_addr)==IS_BROADCAST)
    	return -EACCES;			/* Must turn broadcast on first */
  sk->inuse = 1;

  /* Send the packet. */
  tmp = udp_send(sk, &sin, from, len);

  /* The datagram has been sent off.  Release the socket. */
  release_sock(sk);
  return(tmp);
}


static int
udp_write(struct sock *sk, unsigned char *buff, int len, int noblock,
	  unsigned flags)
{
  return(udp_sendto(sk, buff, len, noblock, flags, NULL, 0));
}


int
udp_ioctl(struct sock *sk, int cmd, unsigned long arg)
{
  int err;
  switch(cmd) {
	case DDIOCSDBG:
		{
			int val;

			if (!suser()) return(-EPERM);
			err=verify_area(VERIFY_READ, (void *)arg, sizeof(int));
			if(err)
				return err;
			val = get_fs_long((int *)arg);
			switch(val) {
				case 0:
					inet_debug = 0;
					break;
				case 1:
					inet_debug = DBG_UDP;
					break;
				default:
					return(-EINVAL);
			}
		}
		break;
	case TIOCOUTQ:
		{
			unsigned long amount;

			if (sk->state == TCP_LISTEN) return(-EINVAL);
			amount = sk->prot->wspace(sk)/*/2*/;
			err=verify_area(VERIFY_WRITE,(void *)arg,
					sizeof(unsigned long));
			if(err)
				return(err);
			put_fs_long(amount,(unsigned long *)arg);
			return(0);
		}

	case TIOCINQ:
		{
			struct sk_buff *skb;
			unsigned long amount;

			if (sk->state == TCP_LISTEN) return(-EINVAL);
			amount = 0;
			skb = sk->rqueue;
			if (skb != NULL) {
				/*
				 * We will only return the amount
				 * of this packet since that is all
				 * that will be read.
				 */
				amount = skb->len;
			}
			err=verify_area(VERIFY_WRITE,(void *)arg,
						sizeof(unsigned long));
			if(err)
				return(err);
			put_fs_long(amount,(unsigned long *)arg);
			return(0);
		}

	default:
		return(-EINVAL);
  }
  return(0);
}


/*
 * This should be easy, if there is something there we\
 * return it, otherwise we block.
 */
int
udp_recvfrom(struct sock *sk, unsigned char *to, int len,
	     int noblock, unsigned flags, struct sockaddr_in *sin,
	     int *addr_len)
{
  int copied = 0;
  struct sk_buff *skb;
  int er;


  /*
   * This will pick up errors that occured while the program
   * was doing something else.
   */
  if (sk->err) {
	int err;

	err = -sk->err;
	sk->err = 0;
	return(err);
  }

  if (len == 0) 
  	return(0);
  if (len < 0) 
  	return(-EINVAL);

  if (addr_len) {
	er=verify_area(VERIFY_WRITE, addr_len, sizeof(*addr_len));
	if(er)
		return(er);
	put_fs_long(sizeof(*sin), addr_len);
  }
  if(sin)
  {
  	er=verify_area(VERIFY_WRITE, sin, sizeof(*sin));
  	if(er)
  		return(er);
  }
  er=verify_area(VERIFY_WRITE,to,len);
  if(er)
  	return er;
  skb=skb_recv_datagram(sk,flags,noblock,&er);
  if(skb==NULL)
  	return er;
  copied = min(len, skb->len);

  /* FIXME : should use udp header size info value */
  skb_copy_datagram(skb,sizeof(struct udphdr),to,copied);

  /* Copy the address. */
  if (sin) {
	struct sockaddr_in addr;

	addr.sin_family = AF_INET;
	addr.sin_port = skb->h.uh->source;
	addr.sin_addr.s_addr = skb->daddr;
	memcpy_tofs(sin, &addr, sizeof(*sin));
  }
  
  skb_free_datagram(skb);
  release_sock(sk);
  return(copied);
}


int
udp_read(struct sock *sk, unsigned char *buff, int len, int noblock,
	 unsigned flags)
{
  return(udp_recvfrom(sk, buff, len, noblock, flags, NULL, NULL));
}


int
udp_connect(struct sock *sk, struct sockaddr_in *usin, int addr_len)
{
  struct sockaddr_in sin;
  int er;
  
  if (addr_len < sizeof(sin)) 
  	return(-EINVAL);

  er=verify_area(VERIFY_READ, usin, sizeof(sin));
  if(er)
  	return er;

  memcpy_fromfs(&sin, usin, sizeof(sin));
  if (sin.sin_family && sin.sin_family != AF_INET) 
  	return(-EAFNOSUPPORT);

  if(!sk->broadcast && chk_addr(sin.sin_addr.s_addr)==IS_BROADCAST)
    	return -EACCES;			/* Must turn broadcast on first */
  	
  sk->daddr = sin.sin_addr.s_addr;
  sk->dummy_th.dest = sin.sin_port;
  sk->state = TCP_ESTABLISHED;
  return(0);
}


static void
udp_close(struct sock *sk, int timeout)
{
  sk->inuse = 1;
  sk->state = TCP_CLOSE;
  if (sk->dead) destroy_sock(sk);
    else release_sock(sk);
}


/* All we need to do is get the socket, and then do a checksum. */
int
udp_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
	unsigned long daddr, unsigned short len,
	unsigned long saddr, int redo, struct inet_protocol *protocol)
{
  struct sock *sk;
  struct udphdr *uh;

  uh = (struct udphdr *) skb->h.uh;
  sk = get_sock(&udp_prot, uh->dest, saddr, uh->source, daddr);
  if (sk == NULL) 
  {
	if (chk_addr(daddr) == IS_MYADDR) 
	{
		icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, dev);
	}
	/*
	 * Hmm.  We got an UDP broadcast to a port to which we
	 * don't wanna listen.  The only thing we can do now is
	 * to ignore the packet... -FvK
	 */
	skb->sk = NULL;
	kfree_skb(skb, FREE_WRITE);
	return(0);
  }

  if (uh->check && udp_check(uh, len, saddr, daddr)) {
	DPRINTF((DBG_UDP, "UDP: bad checksum\n"));
	skb->sk = NULL;
	kfree_skb(skb, FREE_WRITE);
	return(0);
  }

  skb->sk = sk;
  skb->dev = dev;
  skb->len = len;

/* These are supposed to be switched. */
  skb->daddr = saddr;
  skb->saddr = daddr;


  /* Charge it to the socket. */
  if (sk->rmem_alloc + skb->mem_len >= sk->rcvbuf) 
  {
	skb->sk = NULL;
	kfree_skb(skb, FREE_WRITE);
	release_sock(sk);
	return(0);
  }
  sk->rmem_alloc += skb->mem_len;

  /* At this point we should print the thing out. */
  DPRINTF((DBG_UDP, "<< \n"));
  print_udp(uh);

  /* Now add it to the data chain and wake things up. */
  
  skb_queue_tail(&sk->rqueue,skb);

  skb->len = len - sizeof(*uh);

  if (!sk->dead) 
  	sk->data_ready(sk,skb->len);
  	
  release_sock(sk);
  return(0);
}


struct proto udp_prot = {
  sock_wmalloc,
  sock_rmalloc,
  sock_wfree,
  sock_rfree,
  sock_rspace,
  sock_wspace,
  udp_close,
  udp_read,
  udp_write,
  udp_sendto,
  udp_recvfrom,
  ip_build_header,
  udp_connect,
  NULL,
  ip_queue_xmit,
  ip_retransmit,
  NULL,
  NULL,
  udp_rcv,
  datagram_select,
  udp_ioctl,
  NULL,
  NULL,
  ip_setsockopt,
  ip_getsockopt,
  128,
  0,
  {NULL,},
  "UDP"
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品国产一区二区精华液| 久久综合九色综合欧美亚洲| 成人性生交大片免费看在线播放| 婷婷夜色潮精品综合在线| 欧美日韩五月天| 亚洲人成伊人成综合网小说| 精品国产乱子伦一区| 色吊一区二区三区| 成人性生交大片免费看中文| 人人精品人人爱| 久久婷婷色综合| 欧美成va人片在线观看| 欧美无砖专区一中文字| 国产盗摄一区二区三区| 亚洲麻豆国产自偷在线| 国产拍揄自揄精品视频麻豆| 精品国产乱子伦一区| 6080yy午夜一二三区久久| 99精品视频一区二区三区| 国产露脸91国语对白| 精品亚洲国产成人av制服丝袜| 久久久久久**毛片大全| 欧美本精品男人aⅴ天堂| 亚洲精品在线观看网站| 欧美一区二区三区免费视频| 欧美日韩国产高清一区| 欧美一级专区免费大片| 日韩精品一区二区三区在线观看 | 亚洲一区二区成人在线观看| 国产欧美日韩不卡免费| 久久久九九九九| 中文字幕第一区二区| 国产精品女主播在线观看| 国产日韩欧美制服另类| 中文一区一区三区高中清不卡| 久久午夜免费电影| 久久日韩精品一区二区五区| 久久精品免费在线观看| 国产精品丝袜一区| 亚洲欧美国产77777| 色悠悠久久综合| 91浏览器在线视频| 欧美性感一区二区三区| 欧美一区二区精美| 久久色成人在线| 欧美日韩一区二区三区视频| 国产精品免费视频一区| 午夜精品123| 国产在线一区二区| 一本一道综合狠狠老| 91麻豆精品国产91久久久资源速度 | 99re免费视频精品全部| 欧美一区国产二区| 日本一区二区动态图| 日产国产欧美视频一区精品| 国产成人午夜视频| 天天色综合成人网| 国产精品资源网| 91精品欧美一区二区三区综合在| 国产欧美精品一区| 亚洲国产视频一区| 国内精品久久久久影院薰衣草| 成人禁用看黄a在线| 国产一区中文字幕| 欧美日韩和欧美的一区二区| 亚洲视频小说图片| 激情亚洲综合在线| 欧美电影一区二区三区| 久久伊人蜜桃av一区二区| 五月激情综合网| 一本大道久久a久久精品综合| 成人影视亚洲图片在线| 9191久久久久久久久久久| 成人免费在线视频| 一本到不卡免费一区二区| 久久九九全国免费| 国产伦精品一区二区三区视频青涩 | 激情综合一区二区三区| 日韩黄色免费电影| 91日韩一区二区三区| 欧美国产日韩一二三区| 91麻豆国产香蕉久久精品| 亚洲欧美日韩在线播放| 色婷婷精品大在线视频| 午夜久久久久久久久| 青青草一区二区三区| 成人激情视频网站| 亚洲婷婷综合色高清在线| 亚洲影院久久精品| 成人在线综合网| 亚洲一区在线观看免费观看电影高清| 亚洲永久免费av| 韩国成人精品a∨在线观看| 成人永久aaa| 欧美大片在线观看| 粉嫩欧美一区二区三区高清影视 | 日韩精品电影在线| 国产欧美精品国产国产专区| 国产精品麻豆欧美日韩ww| 久久精品夜色噜噜亚洲aⅴ| 91毛片在线观看| 久久久综合视频| 欧美三区免费完整视频在线观看| 日韩三级.com| 色琪琪一区二区三区亚洲区| 日本欧美一区二区三区| 日韩免费视频一区| 欧美精品丝袜久久久中文字幕| 麻豆国产精品视频| 亚洲精品在线免费播放| 毛片av一区二区| 亚洲免费电影在线| 久久一留热品黄| 久久久久久日产精品| 国产真实乱偷精品视频免| 开心九九激情九九欧美日韩精美视频电影 | 色老汉一区二区三区| 亚洲一区二区三区四区的| 欧美丰满美乳xxx高潮www| 中文久久乱码一区二区| 久久蜜桃香蕉精品一区二区三区| 欧美高清在线精品一区| 欧美日韩国产综合一区二区 | 日韩国产精品久久久| 色综合久久中文综合久久牛| 国产乱子伦视频一区二区三区| 亚洲午夜激情网站| 日本一区二区免费在线观看视频| 91精品国产高清一区二区三区| 欧美日韩一区二区三区不卡| 国产精品中文字幕日韩精品 | 狠狠色丁香九九婷婷综合五月| 午夜欧美在线一二页| 亚洲高清中文字幕| 亚洲啪啪综合av一区二区三区| 欧美一区二区大片| 日本乱码高清不卡字幕| 中文字幕一区二区三| 另类小说色综合网站| 国产毛片精品一区| 激情综合一区二区三区| 日韩精品资源二区在线| 日韩欧美一级在线播放| 欧美一区二区三区白人| 成人av网在线| 成人高清免费在线播放| 精品写真视频在线观看| 亚洲不卡av一区二区三区| 亚洲视频免费看| 成人黄色在线看| 91九色02白丝porn| 亚洲免费观看高清完整版在线| 欧美日韩久久久一区| 播五月开心婷婷综合| 亚洲一区二区三区视频在线| 国产精品伦理一区二区| 久久久久国产精品厨房| 7777精品伊人久久久大香线蕉 | 欧美精品在线观看播放| 欧美亚洲禁片免费| 亚洲va国产天堂va久久en| 经典三级在线一区| 青青草国产成人av片免费| 日韩一区二区三区免费观看| 精品国产精品网麻豆系列| 久久久久高清精品| 亚洲综合一二区| 久久国产精品99久久人人澡| 国产精一品亚洲二区在线视频| 国产精品一区二区三区乱码 | 欧美激情一区在线观看| av一区二区三区| 91啪亚洲精品| 欧美色倩网站大全免费| 制服丝袜av成人在线看| 日韩精品最新网址| 亚洲激情第一区| 亚洲精品水蜜桃| 91蜜桃网址入口| 欧美色图激情小说| 蜜乳av一区二区三区| 蜜桃91丨九色丨蝌蚪91桃色| 久久99精品久久久久婷婷| 日韩一级片网站| 亚洲最大的成人av| 欧美在线一二三| 日韩美女久久久| 久久综合九色综合久久久精品综合| 亚洲午夜久久久久久久久电影院 | av不卡免费在线观看| 国产白丝网站精品污在线入口| 国产99精品在线观看| 99久久99久久综合| 免费不卡在线视频| 一区二区三区四区五区视频在线观看 | 欧美性生活久久| 欧美午夜一区二区三区免费大片| 久久久噜噜噜久久人人看| 欧美亚洲动漫精品| 在线播放91灌醉迷j高跟美女 |