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

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

?? route.c

?? An implementation of the TCP/IP protocol suite for the LINUX operating system. INET is implemented u
?? C
字號(hào):
  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  *              ROUTE - implementation of the IP router.
  7  *
  8  * Version:     @(#)route.c     1.0.14  05/31/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 fixes.
 15  *              Alan Cox        :       cli() protects routing changes
 16  *              Rui Oliveira    :       ICMP routing table updates
 17  *              (rco@di.uminho.pt)      Routing table insertion and update
 18  *              Linus Torvalds  :       Rewrote bits to be sensible
 19  *
 20  *              This program is free software; you can redistribute it and/or
 21  *              modify it under the terms of the GNU General Public License
 22  *              as published by the Free Software Foundation; either version
 23  *              2 of the License, or (at your option) any later version.
 24  */
 25 #include <asm/segment.h>
 26 #include <asm/system.h>
 27 #include <linux/types.h>
 28 #include <linux/kernel.h>
 29 #include <linux/sched.h>
 30 #include <linux/string.h>
 31 #include <linux/socket.h>
 32 #include <linux/sockios.h>
 33 #include <linux/errno.h>
 34 #include <linux/in.h>
 35 #include "inet.h"
 36 #include "dev.h"
 37 #include "ip.h"
 38 #include "protocol.h"
 39 #include "route.h"
 40 #include "tcp.h"
 41 #include "skbuff.h"
 42 #include "sock.h"
 43 #include "arp.h"
 44 #include "icmp.h"
 45 
 46 
 47 static struct rtable *rt_base = NULL;
 48 static struct rtable *rt_loopback = NULL;
 49 
 50 /* Dump the contents of a routing table entry. */
 51 static void
 52 rt_print(struct rtable *rt)
 53 {
 54   if (rt == NULL || inet_debug != DBG_RT) return;
 55 
 56   printk("RT: %06lx NXT=%06lx FLAGS=0x%02x\n",
 57                 (long) rt, (long) rt->rt_next, rt->rt_flags);
 58   printk("    TARGET=%s ", in_ntoa(rt->rt_dst));
 59   printk("GW=%s ", in_ntoa(rt->rt_gateway));
 60   printk("    DEV=%s USE=%ld REF=%d\n",
 61         (rt->rt_dev == NULL) ? "NONE" : rt->rt_dev->name,
 62         rt->rt_use, rt->rt_refcnt);
 63 }
 64 
 65 
 66 /*
 67  * Remove a routing table entry.
 68  */
 69 static void rt_del(unsigned long dst)
 70 {
 71         struct rtable *r, **rp;
 72         unsigned long flags;
 73 
 74         DPRINTF((DBG_RT, "RT: flushing for dst %s\n", in_ntoa(dst)));
 75         rp = &rt_base;
 76         save_flags(flags);
 77         cli();
 78         while((r = *rp) != NULL) {
 79                 if (r->rt_dst != dst) {
 80                         rp = &r->rt_next;
 81                         continue;
 82                 }
 83                 *rp = r->rt_next;
 84                 if (rt_loopback == r)
 85                         rt_loopback = NULL;
 86                 kfree_s(r, sizeof(struct rtable));
 87         } 
 88         restore_flags(flags);
 89 }
 90 
 91 
 92 /*
 93  * Remove all routing table entries for a device.
 94  */
 95 void rt_flush(struct device *dev)
 96 {
 97         struct rtable *r;
 98         struct rtable **rp;
 99         unsigned long flags;
100 
101         DPRINTF((DBG_RT, "RT: flushing for dev 0x%08lx (%s)\n", (long)dev, dev->name));
102         rp = &rt_base;
103         cli();
104         save_flags(flags);
105         while ((r = *rp) != NULL) {
106                 if (r->rt_dev != dev) {
107                         rp = &r->rt_next;
108                         continue;
109                 }
110                 *rp = r->rt_next;
111                 if (rt_loopback == r)
112                         rt_loopback = NULL;
113                 kfree_s(r, sizeof(struct rtable));
114         } 
115         restore_flags(flags);
116 }
117 
118 /*
119  * Used by 'rt_add()' when we can't get the netmask any other way..
120  *
121  * If the lower byte or two are zero, we guess the mask based on the
122  * number of zero 8-bit net numbers, otherwise we use the "default"
123  * masks judging by the destination address and our device netmask.
124  */
125 static inline unsigned long default_mask(unsigned long dst)
126 {
127         dst = ntohl(dst);
128         if (IN_CLASSA(dst))
129                 return htonl(IN_CLASSA_NET);
130         if (IN_CLASSB(dst))
131                 return htonl(IN_CLASSB_NET);
132         return htonl(IN_CLASSC_NET);
133 }
134 
135 static unsigned long guess_mask(unsigned long dst, struct device * dev)
136 {
137         unsigned long mask;
138 
139         if (!dst)
140                 return 0;
141         mask = default_mask(dst);
142         if ((dst ^ dev->pa_addr) & mask)
143                 return mask;
144         return dev->pa_mask;
145 }
146 
147 static inline struct device * get_gw_dev(unsigned long gw)
148 {
149         struct rtable * rt;
150 
151         for (rt = rt_base ; ; rt = rt->rt_next) {
152                 if (!rt)
153                         return NULL;
154                 if ((gw ^ rt->rt_dst) & rt->rt_mask)
155                         continue;
156                 /* gateways behind gateways are a no-no */
157                 if (rt->rt_flags & RTF_GATEWAY)
158                         return NULL;
159                 return rt->rt_dev;
160         }
161 }
162 
163 /*
164  * rewrote rt_add(), as the old one was weird. Linus
165  */
166 void rt_add(short flags, unsigned long dst, unsigned long mask,
167         unsigned long gw, struct device *dev)
168 {
169         struct rtable *r, *rt;
170         struct rtable **rp;
171         unsigned long cpuflags;
172 
173         if (flags & RTF_HOST) {
174                 mask = 0xffffffff;
175         } else if (!mask) {
176                 if (!((dst ^ dev->pa_addr) & dev->pa_mask)) {
177                         mask = dev->pa_mask;
178                         flags &= ~RTF_GATEWAY;
179                         if (flags & RTF_DYNAMIC) {
180                                 /*printk("Dynamic route to my own net rejected\n");*/
181                                 return;
182                         }
183                 } else
184                         mask = guess_mask(dst, dev);
185                 dst &= mask;
186         }
187         if (gw == dev->pa_addr)
188                 flags &= ~RTF_GATEWAY;
189         if (flags & RTF_GATEWAY) {
190                 /* don't try to add a gateway we can't reach.. */
191                 if (dev != get_gw_dev(gw))
192                         return;
193                 flags |= RTF_GATEWAY;
194         } else
195                 gw = 0;
196         /* Allocate an entry. */
197         rt = (struct rtable *) kmalloc(sizeof(struct rtable), GFP_ATOMIC);
198         if (rt == NULL) {
199                 DPRINTF((DBG_RT, "RT: no memory for new route!\n"));
200                 return;
201         }
202         memset(rt, 0, sizeof(struct rtable));
203         rt->rt_flags = flags | RTF_UP;
204         rt->rt_dst = dst;
205         rt->rt_dev = dev;
206         rt->rt_gateway = gw;
207         rt->rt_mask = mask;
208         rt->rt_mtu = dev->mtu;
209         rt_print(rt);
210         /*
211          * What we have to do is loop though this until we have
212          * found the first address which has a higher generality than
213          * the one in rt.  Then we can put rt in right before it.
214          */
215         save_flags(cpuflags);
216         cli();
217         /* remove old route if we are getting a duplicate. */
218         rp = &rt_base;
219         while ((r = *rp) != NULL) {
220                 if (r->rt_dst != dst) {
221                         rp = &r->rt_next;
222                         continue;
223                 }
224                 *rp = r->rt_next;
225                 if (rt_loopback == r)
226                         rt_loopback = NULL;
227                 kfree_s(r, sizeof(struct rtable));
228         }
229         /* add the new route */
230         rp = &rt_base;
231         while ((r = *rp) != NULL) {
232                 if ((r->rt_mask & mask) != mask)
233                         break;
234                 rp = &r->rt_next;
235         }
236         rt->rt_next = r;
237         *rp = rt;
238         if (rt->rt_dev->flags & IFF_LOOPBACK)
239                 rt_loopback = rt;
240         restore_flags(cpuflags);
241         return;
242 }
243 
244 static inline int bad_mask(unsigned long mask, unsigned long addr)
245 {
246         if (addr & (mask = ~mask))
247                 return 1;
248         mask = ntohl(mask);
249         if (mask & (mask+1))
250                 return 1;
251         return 0;
252 }
253 
254 static int rt_new(struct rtentry *r)
255 {
256         int err;
257         char * devname;
258         struct device * dev = NULL;
259         unsigned long flags, daddr, mask, gw;
260 
261         if ((devname = r->rt_dev) != NULL) {
262                 err = getname(devname, &devname);
263                 if (err)
264                         return err;
265                 dev = dev_get(devname);
266                 putname(devname);
267                 if (!dev)
268                         return -EINVAL;
269         }
270 
271         if (r->rt_dst.sa_family != AF_INET)
272                 return -EAFNOSUPPORT;
273 
274         flags = r->rt_flags;
275         daddr = ((struct sockaddr_in *) &r->rt_dst)->sin_addr.s_addr;
276         mask = ((struct sockaddr_in *) &r->rt_genmask)->sin_addr.s_addr;
277         gw = ((struct sockaddr_in *) &r->rt_gateway)->sin_addr.s_addr;
278 
279 /* BSD emulation: Permits route add someroute gw one-of-my-addresses
280    to indicate which iface. Not as clean as the nice Linux dev technique
281    but people keep using it... */
282         if (!dev && (flags & RTF_GATEWAY)) {
283                 struct device *dev2;
284                 for (dev2 = dev_base ; dev2 != NULL ; dev2 = dev2->next) {
285                         if ((dev2->flags & IFF_UP) && dev2->pa_addr == gw) {
286                                 flags &= ~RTF_GATEWAY;
287                                 dev = dev2;
288                                 break;
289                         }
290                 }
291         }
292 
293         if (bad_mask(mask, daddr))
294                 mask = 0;
295 
296         if (flags & RTF_HOST)
297                 mask = 0xffffffff;
298         else if (mask && r->rt_genmask.sa_family != AF_INET)
299                 return -EAFNOSUPPORT;
300 
301         if (flags & RTF_GATEWAY) {
302                 if (r->rt_gateway.sa_family != AF_INET)
303                         return -EAFNOSUPPORT;
304                 if (!dev)
305                         dev = get_gw_dev(gw);
306         } else if (!dev)
307                 dev = dev_check(daddr);
308 
309         if (dev == NULL)
310                 return -ENETUNREACH;
311 
312         rt_add(flags, daddr, mask, gw, dev);
313         return 0;
314 }
315 
316 
317 static int rt_kill(struct rtentry *r)
318 {
319         struct sockaddr_in *trg;
320 
321         trg = (struct sockaddr_in *) &r->rt_dst;
322         rt_del(trg->sin_addr.s_addr);
323         return 0;
324 }
325 
326 
327 /* Called from the PROCfs module. */
328 int
329 rt_get_info(char *buffer)
330 {
331   struct rtable *r;
332   char *pos;
333 
334   pos = buffer;
335 
336   pos += sprintf(pos,
337                  "Iface\tDestination\tGateway \tFlags\tRefCnt\tUse\tMetric\tMask\n");
338   
339   /* This isn't quite right -- r->rt_dst is a struct! */
340   for (r = rt_base; r != NULL; r = r->rt_next) {
341         pos += sprintf(pos, "%s\t%08lX\t%08lX\t%02X\t%d\t%lu\t%d\t%08lX\n",
342                 r->rt_dev->name, r->rt_dst, r->rt_gateway,
343                 r->rt_flags, r->rt_refcnt, r->rt_use, r->rt_metric,
344                 r->rt_mask);
345   }
346   return(pos - buffer);
347 }
348 
349 /*
350  * This is hackish, but results in better code. Use "-S" to see why.
351  */
352 #define early_out ({ goto no_route; 1; })
353 
354 struct rtable * rt_route(unsigned long daddr, struct options *opt)
355 {
356         struct rtable *rt;
357 
358         for (rt = rt_base; rt != NULL || early_out ; rt = rt->rt_next) {
359                 if (!((rt->rt_dst ^ daddr) & rt->rt_mask))
360                         break;
361                 /* broadcast addresses can be special cases.. */
362                 if ((rt->rt_dev->flags & IFF_BROADCAST) &&
363                      rt->rt_dev->pa_brdaddr == daddr)
364                         break;
365         }
366         if (daddr == rt->rt_dev->pa_addr) {
367                 if ((rt = rt_loopback) == NULL)
368                         goto no_route;
369         }
370         rt->rt_use++;
371         return rt;
372 no_route:
373         return NULL;
374 }
375 
376 static int get_old_rtent(struct old_rtentry * src, struct rtentry * rt)
377 {
378         int err;
379         struct old_rtentry tmp;
380 
381         err=verify_area(VERIFY_READ, src, sizeof(*src));
382         if (err)
383                 return err;
384         memcpy_fromfs(&tmp, src, sizeof(*src));
385         memset(rt, 0, sizeof(*rt));
386         rt->rt_dst = tmp.rt_dst;
387         rt->rt_gateway = tmp.rt_gateway;
388         rt->rt_genmask.sa_family = AF_INET;
389         ((struct sockaddr_in *) &rt->rt_genmask)->sin_addr.s_addr = tmp.rt_genmask;
390         rt->rt_flags = tmp.rt_flags;
391         rt->rt_dev = tmp.rt_dev;
392         return 0;
393 }
394 
395 int rt_ioctl(unsigned int cmd, void *arg)
396 {
397         int err;
398         struct rtentry rt;
399 
400         switch(cmd) {
401         case DDIOCSDBG:
402                 return dbg_ioctl(arg, DBG_RT);
403         case SIOCADDRTOLD:
404         case SIOCDELRTOLD:
405                 if (!suser())
406                         return -EPERM;
407                 err = get_old_rtent((struct old_rtentry *) arg, &rt);
408                 if (err)
409                         return err;
410                 return (cmd == SIOCDELRTOLD) ? rt_kill(&rt) : rt_new(&rt);
411         case SIOCADDRT:
412         case SIOCDELRT:
413                 if (!suser())
414                         return -EPERM;
415                 err=verify_area(VERIFY_READ, arg, sizeof(struct rtentry));
416                 if (err)
417                         return err;
418                 memcpy_fromfs(&rt, arg, sizeof(struct rtentry));
419                 return (cmd == SIOCDELRT) ? rt_kill(&rt) : rt_new(&rt);
420         }
421 
422         return -EINVAL;
423 }
424 

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久一区二区三区四区| 国产精品少妇自拍| av男人天堂一区| 天天操天天干天天综合网| 国产精品美日韩| 欧美va在线播放| 欧美在线免费视屏| 成人午夜精品在线| 伦理电影国产精品| 天堂一区二区在线| 亚洲欧美电影一区二区| 国产日韩欧美一区二区三区综合 | 国产91精品在线观看| 日本大胆欧美人术艺术动态| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲成人一区二区在线观看| 日本一区二区久久| 久久久99精品免费观看| 日韩一级片网址| 欧美高清性hdvideosex| 欧洲国产伦久久久久久久| 成人av网址在线| 国产成a人亚洲| 国产在线播放一区三区四| 免费成人在线观看| 午夜精品久久一牛影视| 亚洲地区一二三色| 亚洲国产日韩一级| 亚洲国产精品久久久久秋霞影院 | 色综合亚洲欧洲| 成人av网址在线| 不卡一卡二卡三乱码免费网站| 国产在线乱码一区二区三区| 经典三级一区二区| 精品在线观看视频| 精品中文字幕一区二区| 激情国产一区二区| 国内精品视频666| 国产一区二区成人久久免费影院| 久久99精品国产麻豆不卡| 久久电影网站中文字幕| 韩国女主播成人在线| 国内精品在线播放| 国产精品综合av一区二区国产馆| 国产精品综合av一区二区国产馆| 国产麻豆视频一区| 国产河南妇女毛片精品久久久| 国产盗摄视频一区二区三区| 国产成人精品综合在线观看 | 亚洲综合激情网| 亚洲一区二区在线免费看| 亚洲成人免费av| 免费观看91视频大全| 老鸭窝一区二区久久精品| 久久99精品一区二区三区| 国内精品视频一区二区三区八戒| 国产成人精品一区二| 成人小视频在线观看| 91丨porny丨首页| 欧美性色综合网| 日韩精品中文字幕在线不卡尤物| 久久九九影视网| 亚洲欧美另类在线| 日韩经典一区二区| 国产伦精一区二区三区| 99久久伊人精品| 欧美美女一区二区在线观看| 精品日韩在线观看| 国产精品福利影院| 亚洲成人第一页| 国产大陆精品国产| 欧美午夜电影一区| 婷婷中文字幕综合| 精品写真视频在线观看| 波多野结衣中文字幕一区二区三区 | 久久九九久精品国产免费直播| 中文字幕一区二区三区不卡在线 | 天天影视网天天综合色在线播放| 国内偷窥港台综合视频在线播放| 91免费在线视频观看| 欧美一区二区三区四区五区| 久久精品一区二区三区四区| 一区二区三区中文字幕精品精品 | 亚洲一区二区成人在线观看| 久久激情综合网| 97久久超碰精品国产| 日韩一级片在线观看| 自拍偷在线精品自拍偷无码专区| 奇米影视在线99精品| 99久久99久久久精品齐齐| 91精品国产综合久久福利软件| 国产精品五月天| 免费看欧美女人艹b| 99久久精品免费看国产免费软件| 日韩一区二区三区在线| 伊人夜夜躁av伊人久久| 国产一区不卡视频| 7777女厕盗摄久久久| 中文字幕色av一区二区三区| 看片网站欧美日韩| 欧美午夜精品一区二区三区| 欧美激情中文字幕一区二区| 日本成人在线一区| 欧洲av在线精品| 综合中文字幕亚洲| 国产精品一级黄| 欧美一区日韩一区| 亚洲最大成人网4388xx| 成人福利电影精品一区二区在线观看 | 国产成人精品亚洲日本在线桃色| 欧美三级视频在线播放| 亚洲欧洲日韩女同| 国产精品99精品久久免费| 91精品久久久久久久91蜜桃| 亚洲在线视频网站| 97久久精品人人澡人人爽| 欧美经典一区二区三区| 精品一区二区三区在线播放视频 | 亚洲欧美日韩中文字幕一区二区三区| 久草热8精品视频在线观看| 7777精品伊人久久久大香线蕉| 亚洲激情图片一区| 91美女片黄在线观看91美女| 日本一区二区免费在线观看视频 | 欧美日韩精品一区二区在线播放| 国产精品国产自产拍高清av王其| 国产乱国产乱300精品| 精品国产sm最大网站免费看| 青青草国产精品97视觉盛宴| 在线91免费看| 午夜精品影院在线观看| 欧美日本一区二区三区四区| 亚洲图片有声小说| 欧美日韩国产高清一区| 亚洲成人av福利| 91.麻豆视频| 久久精品免费看| 久久色视频免费观看| 国产精品一区二区久激情瑜伽| 久久久亚洲精品石原莉奈| 国产精品系列在线播放| 日本一区二区三区电影| av电影一区二区| 亚洲美女屁股眼交| 欧美视频完全免费看| 五月婷婷综合激情| 日韩欧美国产一区二区在线播放| 久国产精品韩国三级视频| 国产喂奶挤奶一区二区三区| 成人久久视频在线观看| 亚洲精品乱码久久久久| 欧美日韩国产免费一区二区 | 亚洲一区影音先锋| 欧美人与z0zoxxxx视频| 另类小说欧美激情| 国产日韩欧美a| 日本伦理一区二区| 天天亚洲美女在线视频| xf在线a精品一区二区视频网站| 国产v综合v亚洲欧| 亚洲欧美偷拍三级| 91麻豆精品国产自产在线观看一区| 麻豆国产精品一区二区三区| 久久精品一区蜜桃臀影院| 91亚洲精华国产精华精华液| 亚洲地区一二三色| 久久久久久免费| 91香蕉视频污在线| 免费看欧美女人艹b| 国产午夜精品美女毛片视频| 97se亚洲国产综合自在线| 午夜精品久久久久久久久| 久久久久国产精品麻豆| 色综合天天综合网国产成人综合天| 亚洲成a人v欧美综合天堂| 久久久久久免费毛片精品| 91精品福利视频| 精油按摩中文字幕久久| 亚洲三级免费观看| 精品精品国产高清a毛片牛牛 | 欧美电影一区二区| 国产成人av电影在线| 亚洲成人精品影院| 国产欧美日韩综合精品一区二区| 欧美在线不卡视频| 国产乱子伦一区二区三区国色天香| 亚洲另类春色国产| 久久人人97超碰com| 欧美日韩国产经典色站一区二区三区| 国产福利精品一区| 天堂久久久久va久久久久| 国产精品三级av在线播放| 欧美一区二区三区色| 91在线视频播放地址| 狠狠狠色丁香婷婷综合久久五月| 亚洲最新视频在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 宅男噜噜噜66一区二区66| 99久久精品一区| 国产成人av影院|