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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? raw.c

?? An implementation of the TCP/IP protocol suite for the LINUX operating system. INET is implemented u
?? C
字號:
  1 /*
  2  * INET         An implementation of the TCP/IP protocol suite for the LINUX
  3  *              operating system.  INET is implemented using the  BSD Socket
  4  *              interface as the means of communication with the user level.
  5  *
  6  *              RAW - implementation of IP "raw" sockets.
  7  *
  8  * Version:     @(#)raw.c       1.0.4   05/25/93
  9  *
 10  * Authors:     Ross Biro, <bir7@leland.Stanford.Edu>
 11  *              Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 12  *
 13  * Fixes:
 14  *              Alan Cox        :       verify_area() fixed up
 15  *              Alan Cox        :       ICMP error handling
 16  *              Alan Cox        :       EMSGSIZE if you send too big a packet
 17  *              Alan Cox        :       Now uses generic datagrams and shared skbuff
 18  *                                      library. No more peek crashes, no more backlogs
 19  *              Alan Cox        :       Checks sk->broadcast.
 20  *              Alan Cox        :       Uses skb_free_datagram/skb_copy_datagram
 21  *              Alan Cox        :       Raw passes ip options too
 22  *              Alan Cox        :       Setsocketopt added
 23  *              Alan Cox        :       Fixed error return for broadcasts
 24  *              Alan Cox        :       Removed wake_up calls
 25  *              Alan Cox        :       Use ttl/tos
 26  *
 27  *              This program is free software; you can redistribute it and/or
 28  *              modify it under the terms of the GNU General Public License
 29  *              as published by the Free Software Foundation; either version
 30  *              2 of the License, or (at your option) any later version.
 31  */
 32 #include <asm/system.h>
 33 #include <asm/segment.h>
 34 #include <linux/types.h>
 35 #include <linux/sched.h>
 36 #include <linux/errno.h>
 37 #include <linux/timer.h>
 38 #include <linux/mm.h>
 39 #include <linux/kernel.h>
 40 #include <linux/fcntl.h>
 41 #include <linux/socket.h>
 42 #include <linux/in.h>
 43 #include "inet.h"
 44 #include "dev.h"
 45 #include "ip.h"
 46 #include "protocol.h"
 47 #include "tcp.h"
 48 #include "skbuff.h"
 49 #include "sock.h"
 50 #include "icmp.h"
 51 #include "udp.h"
 52 
 53 
 54 static unsigned long
 55 min(unsigned long a, unsigned long b)
 56 {
 57   if (a < b) return(a);
 58   return(b);
 59 }
 60 
 61 
 62 /* raw_err gets called by the icmp module. */
 63 void
 64 raw_err (int err, unsigned char *header, unsigned long daddr,
 65          unsigned long saddr, struct inet_protocol *protocol)
 66 {
 67   struct sock *sk;
 68    
 69   DPRINTF((DBG_RAW, "raw_err(err=%d, hdr=%X, daddr=%X, saddr=%X, protocl=%X)\n",
 70                 err, header, daddr, saddr, protocol));
 71 
 72   if (protocol == NULL) return;
 73   sk = (struct sock *) protocol->data;
 74   if (sk == NULL) return;
 75 
 76   /* This is meaningless in raw sockets. */
 77   if (err & 0xff00 == (ICMP_SOURCE_QUENCH << 8)) {
 78         if (sk->cong_window > 1) sk->cong_window = sk->cong_window/2;
 79         return;
 80   }
 81 
 82   sk->err = icmp_err_convert[err & 0xff].errno;
 83   sk->error_report(sk);
 84   
 85   return;
 86 }
 87 
 88 
 89 /*
 90  * This should be the easiest of all, all we do is\
 91  * copy it into a buffer.
 92  */
 93 int
 94 raw_rcv(struct sk_buff *skb, struct device *dev, struct options *opt,
 95         unsigned long daddr, unsigned short len, unsigned long saddr,
 96         int redo, struct inet_protocol *protocol)
 97 {
 98   struct sock *sk;
 99 
100   DPRINTF((DBG_RAW, "raw_rcv(skb=%X, dev=%X, opt=%X, daddr=%X,\n"
101            "         len=%d, saddr=%X, redo=%d, protocol=%X)\n",
102            skb, dev, opt, daddr, len, saddr, redo, protocol));
103 
104   if (skb == NULL) return(0);
105   if (protocol == NULL) {
106         kfree_skb(skb, FREE_READ);
107         return(0);
108   }
109   sk = (struct sock *) protocol->data;
110   if (sk == NULL) {
111         kfree_skb(skb, FREE_READ);
112         return(0);
113   }
114 
115   /* Now we need to copy this into memory. */
116   skb->sk = sk;
117   skb->len = len + skb->ip_hdr->ihl*sizeof(long);
118   skb->h.raw = (unsigned char *) skb->ip_hdr;
119   skb->dev = dev;
120   skb->saddr = daddr;
121   skb->daddr = saddr;
122 
123   /* Charge it too the socket. */
124   if (sk->rmem_alloc + skb->mem_len >= sk->rcvbuf) {
125         skb->sk = NULL;
126         kfree_skb(skb, FREE_READ);
127         return(0);
128   }
129   sk->rmem_alloc += skb->mem_len;
130   skb_queue_tail(&sk->rqueue,skb);
131   sk->data_ready(sk,skb->len);
132   release_sock(sk);
133   return(0);
134 }
135 
136 
137 /* This will do terrible things if len + ipheader + devheader > dev->mtu */
138 static int
139 raw_sendto(struct sock *sk, unsigned char *from, int len,
140            int noblock,
141            unsigned flags, struct sockaddr_in *usin, int addr_len)
142 {
143   struct sk_buff *skb;
144   struct device *dev=NULL;
145   struct sockaddr_in sin;
146   int tmp;
147   int err;
148 
149   DPRINTF((DBG_RAW, "raw_sendto(sk=%X, from=%X, len=%d, noblock=%d, flags=%X,\n"
150            "            usin=%X, addr_len = %d)\n", sk, from, len, noblock,
151            flags, usin, addr_len));
152 
153   /* Check the flags. */
154   if (flags) return(-EINVAL);
155   if (len < 0) return(-EINVAL);
156 
157   err=verify_area(VERIFY_READ,from,len);
158   if(err)
159         return err;
160   /* Get and verify the address. */
161   if (usin) {
162         if (addr_len < sizeof(sin)) return(-EINVAL);
163         err=verify_area (VERIFY_READ, usin, sizeof (sin));
164         if(err)
165                 return err;
166         memcpy_fromfs(&sin, usin, sizeof(sin));
167         if (sin.sin_family && sin.sin_family != AF_INET) return(-EINVAL);
168   } else {
169         if (sk->state != TCP_ESTABLISHED) return(-EINVAL);
170         sin.sin_family = AF_INET;
171         sin.sin_port = sk->protocol;
172         sin.sin_addr.s_addr = sk->daddr;
173   }
174   if (sin.sin_port == 0) sin.sin_port = sk->protocol;
175   
176   if (sk->broadcast == 0 && chk_addr(sin.sin_addr.s_addr)==IS_BROADCAST)
177         return -EACCES;
178 
179   sk->inuse = 1;
180   skb = NULL;
181   while (skb == NULL) {
182         if(sk->err!=0)
183         {
184                 err= -sk->err;
185                 sk->err=0;
186                 release_sock(sk);
187                 return(err);
188         }
189         
190         skb = sk->prot->wmalloc(sk,
191                         len+sizeof(*skb) + sk->prot->max_header,
192                         0, GFP_KERNEL);
193         if (skb == NULL) {
194                 int tmp;
195 
196                 DPRINTF((DBG_RAW, "raw_sendto: write buffer full?\n"));
197                 if (noblock) 
198                         return(-EAGAIN);
199                 tmp = sk->wmem_alloc;
200                 release_sock(sk);
201                 cli();
202                 if (tmp <= sk->wmem_alloc) {
203                         interruptible_sleep_on(sk->sleep);
204                         if (current->signal & ~current->blocked) {
205                                 sti();
206                                 return(-ERESTARTSYS);
207                         }
208                 }
209                 sk->inuse = 1;
210                 sti();
211         }
212   }
213   skb->mem_addr = skb;
214   skb->mem_len = len + sizeof(*skb) +sk->prot->max_header;
215   skb->sk = sk;
216 
217   skb->free = 1; /* these two should be unecessary. */
218   skb->arp = 0;
219 
220   tmp = sk->prot->build_header(skb, sk->saddr, 
221                                sin.sin_addr.s_addr, &dev,
222                                sk->protocol, sk->opt, skb->mem_len, sk->ip_tos,sk->ip_ttl);
223   if (tmp < 0) {
224         DPRINTF((DBG_RAW, "raw_sendto: error building ip header.\n"));
225         kfree_skb(skb,FREE_WRITE);
226         release_sock(sk);
227         return(tmp);
228   }
229 
230   /* verify_area(VERIFY_WRITE, from, len);*/
231   memcpy_fromfs(skb->data + tmp, from, len);
232 
233   /* If we are using IPPROTO_RAW, we need to fill in the source address in
234      the IP header */
235 
236   if(sk->protocol==IPPROTO_RAW) {
237     unsigned char *buff;
238     struct iphdr *iph;
239 
240     buff = skb->data;
241     buff += tmp;
242     iph = (struct iphdr *)buff;
243     iph->saddr = sk->saddr;
244   }
245 
246   skb->len = tmp + len;
247   
248   if(dev!=NULL && skb->len > 4095)
249   {
250         kfree_skb(skb, FREE_WRITE);
251         release_sock(sk);
252         return(-EMSGSIZE);
253   }
254   
255   sk->prot->queue_xmit(sk, dev, skb, 1);
256   release_sock(sk);
257   return(len);
258 }
259 
260 
261 static int
262 raw_write(struct sock *sk, unsigned char *buff, int len, int noblock,
263            unsigned flags)
264 {
265   return(raw_sendto(sk, buff, len, noblock, flags, NULL, 0));
266 }
267 
268 
269 static void
270 raw_close(struct sock *sk, int timeout)
271 {
272   sk->inuse = 1;
273   sk->state = TCP_CLOSE;
274 
275   DPRINTF((DBG_RAW, "raw_close: deleting protocol %d\n",
276            ((struct inet_protocol *)sk->pair)->protocol));
277 
278   if (inet_del_protocol((struct inet_protocol *)sk->pair) < 0)
279                 DPRINTF((DBG_RAW, "raw_close: del_protocol failed.\n"));
280   kfree_s((void *)sk->pair, sizeof (struct inet_protocol));
281   sk->pair = NULL;
282   release_sock(sk);
283 }
284 
285 
286 static int
287 raw_init(struct sock *sk)
288 {
289   struct inet_protocol *p;
290 
291   p = (struct inet_protocol *) kmalloc(sizeof (*p), GFP_KERNEL);
292   if (p == NULL) return(-ENOMEM);
293 
294   p->handler = raw_rcv;
295   p->protocol = sk->protocol;
296   p->data = (void *)sk;
297   p->err_handler = raw_err;
298   p->name="USER";
299   p->frag_handler = NULL;       /* For now */
300   inet_add_protocol(p);
301    
302   /* We need to remember this somewhere. */
303   sk->pair = (struct sock *)p;
304 
305   DPRINTF((DBG_RAW, "raw init added protocol %d\n", sk->protocol));
306 
307   return(0);
308 }
309 
310 
311 /*
312  * This should be easy, if there is something there
313  * we return it, otherwise we block.
314  */
315 int
316 raw_recvfrom(struct sock *sk, unsigned char *to, int len,
317              int noblock, unsigned flags, struct sockaddr_in *sin,
318              int *addr_len)
319 {
320   int copied=0;
321   struct sk_buff *skb;
322   int err;
323 
324   DPRINTF((DBG_RAW, "raw_recvfrom (sk=%X, to=%X, len=%d, noblock=%d, flags=%X,\n"
325            "              sin=%X, addr_len=%X)\n",
326                 sk, to, len, noblock, flags, sin, addr_len));
327 
328   if (len == 0) return(0);
329   if (len < 0) return(-EINVAL);
330 
331   if (sk->shutdown & RCV_SHUTDOWN) return(0);
332   if (addr_len) {
333         err=verify_area(VERIFY_WRITE, addr_len, sizeof(*addr_len));
334         if(err)
335                 return err;
336         put_fs_long(sizeof(*sin), addr_len);
337   }
338   if(sin)
339   {
340         err=verify_area(VERIFY_WRITE, sin, sizeof(*sin));
341         if(err)
342                 return err;
343   }
344   
345   err=verify_area(VERIFY_WRITE,to,len);
346   if(err)
347         return err;
348 
349   skb=skb_recv_datagram(sk,flags,noblock,&err);
350   if(skb==NULL)
351         return err;
352 
353   copied = min(len, skb->len);
354   
355   skb_copy_datagram(skb, 0, to, copied);
356 
357   /* Copy the address. */
358   if (sin) {
359         struct sockaddr_in addr;
360 
361         addr.sin_family = AF_INET;
362         addr.sin_addr.s_addr = skb->daddr;
363         memcpy_tofs(sin, &addr, sizeof(*sin));
364   }
365 
366   skb_free_datagram(skb);
367   release_sock(sk);
368   return (copied);
369 }
370 
371 
372 int
373 raw_read (struct sock *sk, unsigned char *buff, int len, int noblock,
374           unsigned flags)
375 {
376   return(raw_recvfrom(sk, buff, len, noblock, flags, NULL, NULL));
377 }
378 
379 
380 struct proto raw_prot = {
381   sock_wmalloc,
382   sock_rmalloc,
383   sock_wfree,
384   sock_rfree,
385   sock_rspace,
386   sock_wspace,
387   raw_close,
388   raw_read,
389   raw_write,
390   raw_sendto,
391   raw_recvfrom,
392   ip_build_header,
393   udp_connect,
394   NULL,
395   ip_queue_xmit,
396   ip_retransmit,
397   NULL,
398   NULL,
399   raw_rcv,
400   datagram_select,
401   NULL,
402   raw_init,
403   NULL,
404   ip_setsockopt,
405   ip_getsockopt,
406   128,
407   0,
408   {NULL,},
409   "RAW"
410 };
411 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧洲精品在线观看| 经典三级一区二区| 色狠狠桃花综合| 亚洲乱码国产乱码精品精98午夜| 国产成人免费视频网站高清观看视频| 久久精品欧美一区二区三区麻豆 | 国产精品国产馆在线真实露脸| 国产在线乱码一区二区三区| 2021国产精品久久精品| 国产·精品毛片| 亚洲欧美韩国综合色| 欧美日韩免费在线视频| 久久国产精品色| 国产精品伦理一区二区| 日本精品裸体写真集在线观看 | 亚洲免费av在线| 欧美日韩亚洲高清一区二区| 蜜桃在线一区二区三区| 国产午夜亚洲精品不卡| 色呦呦国产精品| 免费成人在线观看视频| 国产精品女同一区二区三区| 日本高清不卡aⅴ免费网站| 日本欧美在线看| 中文字幕免费观看一区| 欧美三级日韩三级国产三级| 久久成人免费日本黄色| 国产精品久久久久一区二区三区| 精品视频一区三区九区| 国产精品自拍网站| 一区二区三区中文字幕电影| 欧美一区二区三区播放老司机| 国产丶欧美丶日本不卡视频| 亚洲欧美成人一区二区三区| 日韩欧美国产wwwww| 91一区二区在线观看| 精品亚洲欧美一区| 亚洲综合色丁香婷婷六月图片| 精品久久久久久无| 91国在线观看| 福利91精品一区二区三区| 亚洲主播在线播放| 欧美国产1区2区| 日韩欧美在线不卡| 欧美熟乱第一页| 在线精品视频一区二区| 精品国产成人在线影院| 欧美三片在线视频观看| 成人免费观看男女羞羞视频| 日韩av成人高清| 亚洲精品写真福利| 中文字幕巨乱亚洲| 精品日韩一区二区三区| 欧美电影在线免费观看| 色哟哟日韩精品| 成人18视频日本| 国产麻豆日韩欧美久久| 日本不卡视频在线| 午夜婷婷国产麻豆精品| 亚洲四区在线观看| 国产精品麻豆视频| 国产午夜亚洲精品理论片色戒| 欧美一区二区福利在线| 欧美色欧美亚洲另类二区| 99国产精品一区| 99久久er热在这里只有精品15| 激情综合色播激情啊| 蜜臀av性久久久久蜜臀aⅴ | 国产综合久久久久久久久久久久| 夜夜精品视频一区二区| 亚洲欧洲日韩女同| 国产精品久久久久久亚洲伦 | 国产亚洲一区二区三区四区| 欧美一级片在线看| 日韩欧美中文字幕一区| 亚洲精品久久嫩草网站秘色| 国产精品热久久久久夜色精品三区 | 欧美激情中文字幕| 精品福利二区三区| 久久午夜电影网| 久久伊人蜜桃av一区二区| 精品成人在线观看| 国产日韩亚洲欧美综合| 欧美激情一区二区在线| 国产精品理论片在线观看| 国产精品乱码人人做人人爱| 亚洲国产精品高清| 亚洲欧洲日产国码二区| 亚洲老妇xxxxxx| 一区二区三区在线免费播放 | 欧美色国产精品| 欧美老人xxxx18| 欧美成人精品1314www| 26uuu国产电影一区二区| 国产女人水真多18毛片18精品视频 | 久久久久久免费网| 国产精品免费观看视频| 亚洲色图视频网站| 偷拍与自拍一区| 狠狠色综合日日| 99re这里只有精品6| 欧美色偷偷大香| 日韩三级免费观看| 欧美激情综合网| 亚洲午夜三级在线| 久久9热精品视频| www.欧美日韩| 欧美日韩一级片网站| 欧美v日韩v国产v| 国产精品国产三级国产普通话三级 | 亚洲三级在线看| 日韩不卡一区二区三区| 国产69精品久久久久777| 欧美午夜精品久久久久久超碰| 91精品国产麻豆| 国产精品国产三级国产有无不卡| 亚洲第一主播视频| 国产乱码精品一区二区三区av| 91在线视频播放| 精品欧美一区二区久久| 中文字幕一区在线| 蜜桃91丨九色丨蝌蚪91桃色| 成人激情开心网| 欧美一卡在线观看| 亚洲日穴在线视频| 精品一区二区三区香蕉蜜桃| 91在线免费播放| 久久精品一区二区三区不卡| 亚洲国产精品视频| 成人精品视频一区二区三区| 欧美一区二区视频在线观看| 国产精品另类一区| 乱中年女人伦av一区二区| 91麻豆福利精品推荐| 欧美精品一区二区久久久| 亚洲大片免费看| 成人av午夜影院| 久久久久久久久久久久电影| 亚洲福中文字幕伊人影院| 大陆成人av片| 精品国产91亚洲一区二区三区婷婷 | 精品国产凹凸成av人网站| 亚洲电影第三页| 91免费在线看| 中文字幕成人网| 国产福利精品导航| 日韩视频免费观看高清完整版在线观看 | 色婷婷精品大在线视频| 中文字幕巨乱亚洲| 国产麻豆视频精品| 日韩免费一区二区| 人妖欧美一区二区| 欧美三级三级三级爽爽爽| 亚洲三级在线看| 欧美一级理论性理论a| 亚洲成人中文在线| 欧美熟乱第一页| 亚洲一区二区在线免费观看视频| 成人成人成人在线视频| 国产欧美日产一区| 国产v日产∨综合v精品视频| 精品国产乱码久久久久久蜜臀| 欧美aaaaaa午夜精品| 欧美日韩不卡一区二区| 亚洲va韩国va欧美va精品| 日本久久电影网| 一区二区三区欧美| 欧美亚洲动漫精品| 一区二区三区资源| 欧美唯美清纯偷拍| 午夜婷婷国产麻豆精品| 欧美伦理电影网| 日本不卡一二三| 日韩天堂在线观看| 韩国精品久久久| 久久久久久久久久久久久夜| 国产在线一区观看| 欧美国产乱子伦| 色综合久久中文综合久久牛| 亚洲免费观看高清| 欧美日韩国产电影| 蜜臀av亚洲一区中文字幕| 精品精品国产高清一毛片一天堂| 青草国产精品久久久久久| 精品少妇一区二区| 高清国产一区二区| 亚洲欧洲中文日韩久久av乱码| 91麻豆国产在线观看| 亚洲国产精品久久久久秋霞影院| 欧美日韩的一区二区| 青青草原综合久久大伊人精品优势| 4hu四虎永久在线影院成人| 精品在线免费视频| 国产精品国产三级国产aⅴ原创| 91麻豆精品一区二区三区| 日一区二区三区| 久久久综合网站| 色呦呦网站一区| 青青青爽久久午夜综合久久午夜| 久久久久久亚洲综合|