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

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

?? udp.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * 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.
 *
 *		The User Datagram Protocol (UDP).
 *
 * Version:	@(#)udp.c	1.0.13	06/02/93
 *
 * Authors:	Ross Biro, <bir7@leland.Stanford.Edu>
 *		Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 *
 * Fixes:
 *		Alan Cox	:	verify_area() calls
 *		Alan Cox	: 	stopped close while in use off icmp
 *					messages. Not a fix but a botch that
 *					for udp at least is 'valid'.
 *		Alan Cox	:	Fixed icmp handling properly
 *		Alan Cox	: 	Correct error for oversized datagrams
 *		Alan Cox	:	Tidied select() semantics. 
 *		Alan Cox	:	udp_err() fixed properly, also now 
 *					select and read wake correctly on errors
 *		Alan Cox	:	udp_send verify_area moved to avoid mem leak
 *		Alan Cox	:	UDP can count its memory
 *		Alan Cox	:	send to an uknown connection causes
 *					an ECONNREFUSED off the icmp, but
 *					does NOT close.
 *		Alan Cox	:	Switched to new sk_buff handlers. No more backlog!
 *		Alan Cox	:	Using generic datagram code. Even smaller and the PEEK
 *					bug no longer crashes it.
 *		Fred Van Kempen	: 	Net2e support for sk->broadcast.
 *		Alan Cox	:	Uses skb_free_datagram
 *		Alan Cox	:	Added get/set sockopt support.
 *		Alan Cox	:	Broadcasting without option set returns EACCES.
 *		Alan Cox	:	No wakeup calls. Instead we now use the callbacks.
 *		Alan Cox	:	Use ip_tos and ip_ttl
 *
 *
 *		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 <asm/system.h>
#include <asm/segment.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/fcntl.h>
#include <linux/socket.h>
#include <linux/sockios.h>
#include <linux/in.h>
#include <linux/errno.h>
#include <linux/timer.h>
#include <linux/termios.h>
#include <linux/mm.h>
#include "inet.h"
#include "dev.h"
#include "ip.h"
#include "protocol.h"
#include "tcp.h"
#include "skbuff.h"
#include "sock.h"
#include "udp.h"
#include "icmp.h"


#define min(a,b)	((a)<(b)?(a):(b))


static void
print_udp(struct udphdr *uh)
{
  if (inet_debug != DBG_UDP) return;

  if (uh == NULL) {
	printk("(NULL)\n");
	return;
  }
  printk("UDP: source = %d, dest = %d\n", ntohs(uh->source), ntohs(uh->dest));
  printk("     len = %d, check = %d\n", ntohs(uh->len), ntohs(uh->check));
}


/*
 * This routine is called by the ICMP module when it gets some
 * sort of error condition.  If err < 0 then the socket should
 * be closed and the error returned to the user.  If err > 0
 * it's just the icmp type << 8 | icmp code.  
 * Header points to the ip header of the error packet. We move
 * on past this. Then (as it used to claim before adjustment)
 * header points to the first 8 bytes of the udp header.  We need
 * to find the appropriate port.
 */
void
udp_err(int err, unsigned char *header, unsigned long daddr,
	unsigned long saddr, struct inet_protocol *protocol)
{
  struct udphdr *th;
  struct sock *sk;
  struct iphdr *ip=(struct iphdr *)header;
  
  header += 4*ip->ihl;
  
  th = (struct udphdr *)header;  
   
  DPRINTF((DBG_UDP,"UDP: err(err=%d, header=%X, daddr=%X, saddr=%X, protocl=%X)\n\
sport=%d,dport=%d", err, header, daddr, saddr, protocol, (int)th->source,(int)th->dest));

  sk = get_sock(&udp_prot, th->source, daddr, th->dest, saddr);

  if (sk == NULL) 
  	return;	/* No socket for error */
  	
  if (err < 0)		/* As per the calling spec */
  {
  	sk->err = -err;
  	sk->error_report(sk);		/* User process wakes to see error */
  	return;
  }
  
  if (err & 0xff00 ==(ICMP_SOURCE_QUENCH << 8)) {	/* Slow down! */
	if (sk->cong_window > 1) 
		sk->cong_window = sk->cong_window/2;
	return;
  }

  sk->err = icmp_err_convert[err & 0xff].errno;

  /* It's only fatal if we have connected to them. */
  if (icmp_err_convert[err & 0xff].fatal && sk->state == TCP_ESTABLISHED) {
	sk->err=ECONNREFUSED;
  }
  sk->error_report(sk);
}


static unsigned short
udp_check(struct udphdr *uh, int len,
	  unsigned long saddr, unsigned long daddr)
{
  unsigned long sum;

  DPRINTF((DBG_UDP, "UDP: check(uh=%X, len = %d, saddr = %X, daddr = %X)\n",
	   						uh, len, saddr, daddr));

  print_udp(uh);

  __asm__("\t addl %%ecx,%%ebx\n"
	  "\t adcl %%edx,%%ebx\n"
	  "\t adcl $0, %%ebx\n"
	  : "=b"(sum)
	  : "0"(daddr), "c"(saddr), "d"((ntohs(len) << 16) + IPPROTO_UDP*256)
	  : "cx","bx","dx" );

  if (len > 3) {
	__asm__("\tclc\n"
		"1:\n"
		"\t lodsl\n"
		"\t adcl %%eax, %%ebx\n"
		"\t loop 1b\n"
		"\t adcl $0, %%ebx\n"
		: "=b"(sum) , "=S"(uh)
		: "0"(sum), "c"(len/4) ,"1"(uh)
		: "ax", "cx", "bx", "si" );
  }

  /* Convert from 32 bits to 16 bits. */
  __asm__("\t movl %%ebx, %%ecx\n"
	  "\t shrl $16,%%ecx\n"
	  "\t addw %%cx, %%bx\n"
	  "\t adcw $0, %%bx\n"
	  : "=b"(sum)
	  : "0"(sum)
	  : "bx", "cx");

  /* Check for an extra word. */
  if ((len & 2) != 0) {
	__asm__("\t lodsw\n"
		"\t addw %%ax,%%bx\n"
		"\t adcw $0, %%bx\n"
		: "=b"(sum), "=S"(uh)
		: "0"(sum) ,"1"(uh)
		: "si", "ax", "bx");
  }

  /* Now check for the extra byte. */
  if ((len & 1) != 0) {
	__asm__("\t lodsb\n"
		"\t movb $0,%%ah\n"
		"\t addw %%ax,%%bx\n"
		"\t adcw $0, %%bx\n"
		: "=b"(sum)
		: "0"(sum) ,"S"(uh)
		: "si", "ax", "bx");
  }

  /* We only want the bottom 16 bits, but we never cleared the top 16. */
  return((~sum) & 0xffff);
}


static void
udp_send_check(struct udphdr *uh, unsigned long saddr, 
	       unsigned long daddr, int len, struct sock *sk)
{
  uh->check = 0;
  if (sk && sk->no_check) 
  	return;
  uh->check = udp_check(uh, len, saddr, daddr);
  if (uh->check == 0) uh->check = 0xffff;
}


static int
udp_send(struct sock *sk, struct sockaddr_in *sin,
	 unsigned char *from, int len)
{
  struct sk_buff *skb;
  struct device *dev;
  struct udphdr *uh;
  unsigned char *buff;
  unsigned long saddr;
  int size, tmp;
  int err;
  
  DPRINTF((DBG_UDP, "UDP: send(dst=%s:%d buff=%X len=%d)\n",
		in_ntoa(sin->sin_addr.s_addr), ntohs(sin->sin_port),
		from, len));

  err=verify_area(VERIFY_READ, from, len);
  if(err)
  	return(err);

  /* Allocate a copy of the packet. */
  size = sizeof(struct sk_buff) + sk->prot->max_header + len;
  skb = sk->prot->wmalloc(sk, size, 0, GFP_KERNEL);
  if (skb == NULL) return(-ENOMEM);

  skb->mem_addr = skb;
  skb->mem_len  = size;
  skb->sk       = NULL;	/* to avoid changing sk->saddr */
  skb->free     = 1;
  skb->arp      = 0;

  /* Now build the IP and MAC header. */
  buff = skb->data;
  saddr = 0;
  dev = NULL;
  DPRINTF((DBG_UDP, "UDP: >> IP_Header: %X -> %X dev=%X prot=%X len=%d\n",
			saddr, sin->sin_addr.s_addr, dev, IPPROTO_UDP, skb->mem_len));
  tmp = sk->prot->build_header(skb, saddr, sin->sin_addr.s_addr,
			       &dev, IPPROTO_UDP, sk->opt, skb->mem_len,sk->ip_tos,sk->ip_ttl);
  skb->sk=sk;	/* So memory is freed correctly */
			    
  if (tmp < 0 ) {
	sk->prot->wfree(sk, skb->mem_addr, skb->mem_len);
	return(tmp);
  }
  buff += tmp;
  saddr = dev->pa_addr;
  DPRINTF((DBG_UDP, "UDP: >> MAC+IP len=%d\n", tmp));

  skb->len = tmp + sizeof(struct udphdr) + len;	/* len + UDP + IP + MAC */
  skb->dev = dev;
#ifdef OLD
  /*
   * This code used to hack in some form of fragmentation.
   * I removed that, since it didn't work anyway, and it made the
   * code a bad thing to read and understand. -FvK
   */
  if (len > dev->mtu) {
#else
  if (skb->len > 4095)
  {
#endif    
	printk("UDP: send: length %d > mtu %d (ignored)\n", len, dev->mtu);
	sk->prot->wfree(sk, skb->mem_addr, skb->mem_len);
	return(-EMSGSIZE);
  }

  /* Fill in the UDP header. */
  uh = (struct udphdr *) buff;
  uh->len = htons(len + sizeof(struct udphdr));
  uh->source = sk->dummy_th.source;
  uh->dest = sin->sin_port;
  buff = (unsigned char *) (uh + 1);

  /* Copy the user data. */
  memcpy_fromfs(buff, from, len);

  /* Set up the UDP checksum. */
  udp_send_check(uh, saddr, sin->sin_addr.s_addr, skb->len - tmp, sk);

  /* Send the datagram to the interface. */
  sk->prot->queue_xmit(sk, dev, skb, 1);

  return(len);
}


static int
udp_sendto(struct sock *sk, unsigned char *from, int len, int noblock,
	   unsigned flags, struct sockaddr_in *usin, int addr_len)
{
  struct sockaddr_in sin;
  int tmp;
  int err;

  DPRINTF((DBG_UDP, "UDP: sendto(len=%d, flags=%X)\n", len, flags));

  /* Check the flags. */
  if (flags) 
  	return(-EINVAL);
  if (len < 0) 
  	return(-EINVAL);
  if (len == 0) 
  	return(0);

  /* Get and verify the address. */
  if (usin) {
	if (addr_len < sizeof(sin)) return(-EINVAL);
	err=verify_area(VERIFY_READ, usin, sizeof(sin));
	if(err)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩大陆一区二区| 中文字幕在线不卡视频| 国产精品亲子伦对白| 洋洋成人永久网站入口| 国产精品一区二区在线观看不卡| 欧美系列亚洲系列| 国产精品欧美一区二区三区| 老司机精品视频线观看86| 色网综合在线观看| 欧美国产日韩亚洲一区| 久久精品国产亚洲a| 欧美性xxxxx极品少妇| 国产精品美女视频| 国产精品一区三区| 精品免费国产二区三区| 天堂一区二区在线免费观看| 色999日韩国产欧美一区二区| 2023国产精品| 久久国产精品免费| 欧美一区二区三区精品| 亚洲一级二级三级在线免费观看| 97精品久久久午夜一区二区三区 | 欧美日韩激情在线| 日韩美女视频一区二区| 国产精品1区2区3区| 精品国产三级电影在线观看| 日韩精品成人一区二区三区| 欧美色图第一页| 亚洲一区成人在线| 色久综合一二码| 伊人婷婷欧美激情| 在线视频欧美区| 亚洲综合成人在线视频| 在线观看精品一区| 亚洲一区二区视频在线| 欧美日韩视频在线一区二区| 亚洲综合av网| 制服丝袜av成人在线看| 美国三级日本三级久久99| 欧美一级片在线观看| 奇米在线7777在线精品| 欧美成人video| 国内国产精品久久| 国产精品免费av| 91蝌蚪porny九色| 亚洲一线二线三线视频| 欧美日韩国产一级二级| 青青草伊人久久| 精品国产污网站| yourporn久久国产精品| 亚洲午夜电影网| 欧美成人官网二区| 懂色av一区二区三区免费观看 | 精品福利二区三区| 国产成人av电影免费在线观看| 中文字幕av免费专区久久| 91免费看`日韩一区二区| 午夜精品视频一区| 久久综合久久综合九色| 99久久免费精品| 男男成人高潮片免费网站| 久久免费视频色| 91久久精品国产91性色tv| 久久精品国产精品青草| 亚洲欧美在线视频| 7777精品伊人久久久大香线蕉完整版 | 国产成人精品亚洲777人妖| 亚洲欧洲在线观看av| 欧美日韩一区二区欧美激情| 国产真实乱偷精品视频免| 亚洲男人的天堂在线观看| 日韩免费福利电影在线观看| 99久久精品国产麻豆演员表| 婷婷中文字幕综合| 中文字幕第一页久久| 91精品国产综合久久精品性色| 国产成人精品网址| 偷拍自拍另类欧美| **性色生活片久久毛片| 日韩亚洲欧美成人一区| 不卡的av网站| 久久99久久久久久久久久久| 亚洲免费av高清| 久久精品人人做人人综合| 欧美三级日韩三级国产三级| 国产成人综合网站| 捆绑紧缚一区二区三区视频| 一区二区三区日韩| 欧美极品xxx| 日韩精品一区二区三区老鸭窝| 91美女在线观看| 国产v综合v亚洲欧| 另类人妖一区二区av| 亚洲午夜精品在线| 亚洲欧美偷拍卡通变态| 国产午夜精品一区二区三区嫩草 | 99免费精品视频| 激情五月播播久久久精品| 午夜一区二区三区视频| 亚洲精品视频在线看| 国产精品国产三级国产专播品爱网 | 国产精品久久久久久久久图文区| 日韩欧美国产精品| 欧美一区二区三区不卡| 7777精品伊人久久久大香线蕉 | 日精品一区二区| 亚洲国产综合色| 亚洲影院理伦片| 亚洲国产精品天堂| 亚洲综合视频在线| 亚洲国产一区二区三区青草影视| 亚洲三级视频在线观看| 国产精品成人免费精品自在线观看| 久久久噜噜噜久久人人看| 精品日韩一区二区三区| 欧美成人一区二区| 精品国产乱码久久久久久久| 欧美一级黄色录像| 欧美草草影院在线视频| 日韩免费电影网站| 久久久国产精华| 中文文精品字幕一区二区| 亚洲国产精品激情在线观看| 国产精品国产三级国产三级人妇 | 91精品国产一区二区| 欧美一级二级三级蜜桃| 欧美久久久一区| 欧美夫妻性生活| 欧美tickling网站挠脚心| 精品免费日韩av| 中文字幕av一区二区三区高| 亚洲人亚洲人成电影网站色| 亚洲免费观看高清| 天天射综合影视| 国产精品影视网| 色噜噜偷拍精品综合在线| 欧美乱妇一区二区三区不卡视频| 精品毛片乱码1区2区3区 | 国产不卡在线视频| 91麻豆swag| 91精品国产综合久久久久久久 | 久久久三级国产网站| 国产精品沙发午睡系列990531| 亚洲天堂2014| 亚洲综合视频在线观看| 久久精品久久综合| 成人午夜激情在线| 欧美日韩不卡一区二区| 国产亚洲精品资源在线26u| 欧美激情中文字幕| 亚洲va在线va天堂| 国产精品一区二区三区乱码| 欧美中文字幕亚洲一区二区va在线 | 久久国产福利国产秒拍| 91美女精品福利| 欧美不卡视频一区| 亚洲柠檬福利资源导航| 亚洲综合久久久| 欧美日韩成人一区| 国产麻豆精品theporn| 91免费视频大全| 日韩精品一区二区三区中文精品| 国产精品丝袜一区| 日本aⅴ亚洲精品中文乱码| 99久久精品一区| 精品国产凹凸成av人导航| 亚洲一区二区五区| av一区二区三区| 精品久久久久久久久久久久包黑料 | 欧美午夜影院一区| 国产欧美一区二区三区鸳鸯浴| 亚洲国产精品一区二区www在线 | 欧美夫妻性生活| 亚洲乱码日产精品bd | 麻豆成人综合网| 91丨porny丨最新| 久久久影视传媒| 五月天久久比比资源色| 日本韩国视频一区二区| 中文字幕 久热精品 视频在线| 免费av网站大全久久| 欧美中文字幕一二三区视频| 日韩一区在线看| 粉嫩绯色av一区二区在线观看| 日韩精品一区在线| 日韩—二三区免费观看av| 欧美午夜宅男影院| 一区二区在线观看视频| 波多野结衣中文字幕一区 | 精品美女一区二区| 欧美96一区二区免费视频| 欧美乱妇20p| 日韩电影在线看| 欧美肥妇free| 日本免费在线视频不卡一不卡二| 欧美色涩在线第一页| 视频一区欧美日韩| 欧美精品一级二级三级| 日日欢夜夜爽一区| 9191国产精品|