{"id":598,"date":"2010-06-28T15:43:46","date_gmt":"2010-06-28T07:43:46","guid":{"rendered":"http:\/\/www.kumouse.com\/?p=598"},"modified":"2010-06-28T15:43:46","modified_gmt":"2010-06-28T07:43:46","slug":"ip-%e9%80%89%e8%b7%af%e8%a1%a8-%e5%92%8c-%e9%80%89%e8%b7%af%e7%ae%97%e6%b3%95","status":"publish","type":"post","link":"https:\/\/www.kumouse.com\/?p=598","title":{"rendered":"IP \u9009\u8def\u8868 \u548c \u9009\u8def\u7b97\u6cd5"},"content":{"rendered":"<p>1 \u5f15\u8a00<br \/>\n\u8ba8\u8bba\u9009\u62e9\u8def\u7531\u7684\u7ec6\u8282\uff0c\u9009\u8def\u8868\u7684\u7ed3\u6784\uff0c\u4ee5\u53ca\u5b9e\u73b0\u7b97\u6cd5\uff0c\u8def\u7531\u5982\u4f55\u4f7f\u7528\u5b50\u7f51\u63a9\u7801\uff0c\u5982\u4f55\u533a\u5206\u7f51\u7edc\u8def\u7531\u5b50\u7f51\u8def\u7531\u4ee5\u53ca\u4e3b\u673a\u8def\u7531<\/p>\n<p>2 \u8def\u7531\u7ef4\u62a4\u548c\u67e5\u627e<br \/>\n\u5e94\u5f53\u9009\u62e9\u80fd\u4f7f\u67e5\u627e\u8def\u7531\u82b1\u8d39\u6700\u5c0f\u7684IP\u6570\u636e\u7ed3\u6784\u548c\u7b97\u6cd5\uff0c\u7ef4\u62a4\u8def\u7531\u7684\u82b1\u8d39\u5219\u5e76\u4e0d\u90a3\u4e48\u91cd\u8981<br \/>\n\u5229\u7528\u6876\u6563\u5217\uff08bucket hashing\uff09\u8fc5\u901f\u627e\u5230\u6b63\u786e\u7684\u6563\u5217\u8868\u5143<\/p>\n<p>3 \u9009\u8def\u8868\u7ed3\u6784<br \/>\n\u4fdd\u5b58\u8def\u7531\u7684\u4e3b\u8981\u6570\u636e\u7ed3\u6784\u662f\u6570\u7ec4\u3002\u6570\u7ec4\u7684\u6bcf\u4e2a\u5143\u7d20\u5bf9\u5e94\u4e00\u4e2a\u6563\u5217\u8868\u5143\uff0c\u5e76\u5305\u542b\u4e00\u4e2a\u6307\u9488\uff0c\u6307\u5411\u88ab\u88c5\u5165\u8fd9\u4e2a\u6563\u5217\u8868\u5143\u4e2d\u7684\u901a\u4e3b\u76ee\u7684\u7ad9\u7684\u8def\u7531\u8bb0\u5f55\u94fe\u8868\u3002\u8868\u4e2d\u6bcf\u4e2a\u8bb0\u5f55\u5305\u542b\u4e00\u4e2aIP\u76ee\u7684\u5730\u5740\uff0c\u5b50\u7f51\u63a9\u7801\uff0c\u4e0b\u4e00\u8df3\u5730\u5740\uff0c\u7528\u4e8e\u5411\u4e0b\u4e00\u8df3\u5730\u5740\u53d1\u9001\u6570\u636e\u7684\u7f51\u7edc\u63a5\u53e3\uff0c\u4ee5\u53ca\u5176\u4ed6\u7684\u8def\u7531\u7ba1\u7406\u4e2d\u4f7f\u7528\u7684\u4fe1\u606f\u3002\u7531\u4e8eIP\u9884\u5148\u5e76\u4e0d\u77e5\u9053\u5b50\u7f51\u63a9\u7801\uff0c\u5b83\u516c\u4f7f\u7528IP\u76ee\u7684\u5730\u5740\u7684\u7f51\u7edc\u90e8\u5206\u8ba1\u7b97\u6563\u5217\u51fd\u6570\uff0c\u5728\u4e00\u4e2a\u94fe\u8868\u4e2d\u67e5\u627e\u8868\u9879\u65f6\uff0c\u4f7f\u7528\u7684\u662f\u5b8c\u6574\u7684\u76ee\u7684\u5730\u5740\u6765\u8fdb\u884c\u6bd4\u8f83\u3002<\/p>\n<p>4 \u9009\u8def\u8868\u6570\u636e\u7ed3\u6784<\/p>\n<p>\/* route.h &#8211; RTFREE *\/<\/p>\n<p>\/* \u8def\u7531\u8868\u9879 *\/<br \/>\nstruct route {<br \/>\n\tIPaddr\trt_net;\t\t\/* \u8def\u7531\u7684\u76ee\u7684\u5730\u5740\t*\/<br \/>\n\tIPaddr\trt_mask;\t\/* \u8def\u7531\u7684\u63a9\u7801\t\t\t*\/<br \/>\n\tIPaddr\trt_gw;\t\t\/* \u4e0b\u4e00\u8df3\u7684IP\t\t*\/<br \/>\n\tu_short\trt_metric;\t\/* \u8ddd\u79bb\u5ea6\u91cf\t\t*\/<br \/>\n\tu_short\trt_ifnum;\t\/* \u63a5\u53e3\u7684\u5e8f\u53f7\t\t*\/<br \/>\n\tshort\trt_key;\t\t\/* \u6392\u5e8f\u5173\u952e\u5b57\t\t*\/<br \/>\n\tshort\trt_ttl;\t\t\/* \u751f\u5b58\u65f6\u95f4\uff08\u79d2\uff09\t*\/<br \/>\n\tstruct\troute *rt_next;\t\/* \u54c8\u5e0c\u503c\u6307\u5411\u4e0b\u4e00\u4e2a\u6761\u76ee\t*\/<br \/>\n\/* stats *\/<br \/>\n\tint\trt_refcnt;\t\/* \u5f15\u7528\u8ba1\u6570\t\t*\/<br \/>\n\tint\trt_usecnt;\t\/* \u8bb0\u5f55\u8be5\u8def\u7531\u4f7f\u7528\u7684\u6b21\u6570\t*\/<br \/>\n};<\/p>\n<p>\/* \u8def\u7531\u8868\u7684\u5168\u5c40\u6570\u636e *\/<br \/>\nstruct rtinfo {<br \/>\n\tstruct\troute\t*ri_default;\t\/* \u5305\u542b\u9ed8\u8ba4\u8def\u7531\u7684\u4e0b\u4e00\u8df3\u5730\u5740 *\/<br \/>\n\tint\t\tri_bpool;\t\/* \u7ed3\u70b9\u7684\u5730\u5740??? Route.ri_bpool = mkpool(sizeof(struct route), RT_BPSIZE) \u73b0\u5728\u8fd8\u4e0d\u592a\u660e\u767d *\/<br \/>\n\tBool\t\tri_valid;\t\/* \u6b64\u8def\u7531\u7684\u6570\u636e\u7ed3\u6784\u662f\u5426\u88ab\u521d\u59cb\u5316 *\/<br \/>\n\tint\t\tri_mutex;\t\/* \u4e92\u65a5\u4fe1\u53f7 *\/<br \/>\n};<\/p>\n<p>#define\tRT_DEFAULT ip_anyaddr\t\/* \u9ed8\u8ba4\u7684\u7f51\u7edc\u5730\u5740 \u51680\t\t*\/<br \/>\n#define\tRT_LOOPBACK ip_loopback\t\/* \u56de\u73af\u5730\u5740\t\t\t*\/<br \/>\n#define\tRT_TSIZE\t512\t\/* \u6563\u5217\u8868\u957f\u5ea6??-these are pointers; it&#8217;s cheap\t*\/<br \/>\n#define\tRT_INF\t\t999\t\/* \u8def\u7531\u6c38\u4e0d\u8d85\u65f6\t\t*\/<\/p>\n<p>#define\tRTM_INF\t\t16\t\/* \u4e00\u4e2a\u6700\u5927\u8ddd\u79bb\u5ea6\u91cf &#8211; an infinite metric\t*\/<\/p>\n<p>\/* rtget\uff08\uff09\u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570&#8230; *\/<\/p>\n<p>#define\tRTF_REMOTE\t0\t\/* \u8fdc\u7a0b\u4e3b\u673a\u4ea7\u751f\u7684\u901a\u4fe1\t*\/<br \/>\n#define\tRTF_LOCAL\t1\t\/* \u672c\u5730\u4ea7\u751f\u7684\u901a\u4fe1\t\t*\/<\/p>\n<p>#define\tRT_BPSIZE\t100\t\/* \u8def\u7531\u7684\u6700\u5927\u6570\u91cf\t\t\t*\/<\/p>\n<p>\/*  RTFREE &#8211; \u5220\u9664\u4e00\u4e2a\u8def\u7531\u5f15\u7528\uff08\u5047\u5b9a\u6301\u6709ri_mutex\uff09\t\t*\/<\/p>\n<p>#define\tRTFREE(prt)<br \/>\n\tif (&#8211;prt->rt_refcnt <= 0) {\t\t\t\n\t\tfreebuf(prt);\t\t\t\t\n\t}\n\nextern\tstruct\trtinfo\tRoute;\nextern\tstruct\troute\t*rttable[];\n\nint rtadd(IPaddr, IPaddr, IPaddr, unsigned, unsigned, unsigned);\nint rtdel(IPaddr, IPaddr), rthash(IPaddr), rtfree(struct route *);\nstruct route *rtget(IPaddr, Bool);\nvoid rtinit(void);\nvoid ipredirect(struct ep *, unsigned, struct route *);\nvoid ipdbc(unsigned, struct ep *, struct route *);\n\n\n5 \u8def\u7531\u7684\u751f\u6210\u6e90\u53ca\u4fdd\u6301\u65f6\u95f4\n\u9009\u8def\u8868\u9879\u7684\u6613\u5931\u6027\u4e0e\u5b83\u7684\u6765\u6e90\u6709\u5173(\u4ece\u5907\u4efd\u5b58\u50a8\u5668\u4e2d\u5f97\u5230,ICMP\u6216\u9009\u8def\u534f\u8bae,\u7f51\u7edc\u7ba1\u7406\u5458\u624b\u52a8\u64cd\u4f5c),\u4f46\u4e3a\u4e86\u6392\u9664\u7f51\u7edc\u4e2d\u7684\u8def\u7531\u95ee\u9898,\u7ba1\u7406\u5458\u53ef\u4ee5\u63a8\u7ffb\u4efb\u4f55\u8def\u7531\u5e76\u5efa\u7acb\u4e0d\u53ef\u6539\u53d8\u7684\u6c38\u4e45\u7684\u8def\u7531\n\n6 \u4e3a\u6570\u636e\u62a5\u9009\u62e9\u8def\u7531\n6.1 \u5b9e\u7528\u8fc7\u7a0b\n\/* netnum.c - netnum *\/\n\n#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  netnum  &#8211;  \u8ba1\u7b97\u4e00\u4e2a\u7ed9\u5b9aIP \u5730\u5740\u7684\u7f51\u7edc\u90e8\u5206<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nIPaddr<br \/>\nnetnum(IPaddr ipa)<br \/>\n{<br \/>\n\tIPaddr\tmask = ~0;<\/p>\n<p>\tif (IP_CLASSA(ipa)) mask = hl2net(0xff000000);<br \/>\n\tif (IP_CLASSB(ipa)) mask = hl2net(0xffff0000);<br \/>\n\tif (IP_CLASSC(ipa)) mask = hl2net(0xffffff00);<br \/>\n\treturn ipa &#038; mask;\t\t\t\/* \u8fd4\u56de\u4e00\u4e2a\u4e3b\u673a\u5730\u5740\u5b57\u8282\u4e3a\u51680\u7684\u5730\u5740*\/<br \/>\n}<\/p>\n<p>\/* netmatch.c &#8211; netmatch *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  netmatch  &#8211;  \u662f\u5426\u662f\u8fd9\u4e2a\u7f51\u7edc\u4e0a\u7684\u5730\u5740?<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nBool<br \/>\nnetmatch(IPaddr dst, IPaddr net, IPaddr mask, Bool islocal)<br \/>\n{<br \/>\n\tif ((dst &#038; mask) != (net &#038; mask))\t\t\/* \u76ee\u7684\u5730\u5740\u4e0e\u9009\u8def\u8868\u4e2d\u5730\u5740\u6bd4\u8f83*\/<br \/>\n\t\treturn FALSE;<br \/>\n\t\/*<br \/>\n\t * \u6e90\u5730\u5740\u4e3a\u672c\u5730\u53ef\u4ee5\u53ea\u5339\u914d\u5355\u64ad\u5730\u5740 (\u4e3b\u673a\u4e3a\u8def\u7531)<br \/>\n\t *\/<br \/>\n\tif (islocal)\t\t\t\t\t\/* \u5982\u679c\u662f\u672c\u5730*\/<br \/>\n\t\tif (isbrc(dst) || IP_CLASSD(dst))\t\/* \u5982\u679c\u76ee\u7684\u5730\u5740\u4e0d\u662f\u5e7f\u64ad\u5730\u5740,\u6216\u4e0d\u662fD\u7c7b*\/<br \/>\n\t\t\treturn mask != ip_maskall;\t\/* \u5e76\u4e14\u63a9\u7801\u4e0d\u4e3a\u51681,\u5219\u8fd4\u56de\u771f,\u5426\u5219\u4e3a\u5047*\/<br \/>\n\treturn TRUE;<br \/>\n}<\/p>\n<p>\/* netmask.c &#8211; netmask *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>IPaddr netnum(IPaddr);<\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  netmask  &#8211;  \u4e3a\u7ed9\u5b9a\u7f51\u7edc\u8bbe\u5b9a\u9ed8\u8ba4\u63a9\u7801<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nIPaddr<br \/>\nnetmask(IPaddr net)<br \/>\n{<br \/>\n\tIPaddr\tnetpart;<br \/>\n\tint\ti;<\/p>\n<p>\tif (net == 0)\t\t\t\t\t\/* \u76ee\u7684\u5730\u5740\u4e3a\u51680,\u5219\u4f7f\u7528\u9ed8\u8ba4\u8def\u7531,\u8fd4\u56de\u51680\u63a9\u7801*\/<br \/>\n\t\treturn net;<br \/>\n\t\/* \u7f51\u7edc\u5339\u914d\u68c0\u67e5 (\u5b50\u7f51) *\/<\/p>\n<p>\tnetpart = netnum(net);\t\t\t\t\/* \u63d0\u53d6\u51fa\u7f51\u7edc\u90e8\u5206*\/<br \/>\n\tfor (i=0; i<Net.nif; ++i)\t\t\t\t\/* \u5982\u6709\u4e0e\u76ee\u7684\u5730\u5740\u76f8\u540c\u7684\u7f51\u7edc\u63a5\u53e3\u5730\u5740,\u5219\u8fd4\u56de\u8be5\u63a5\u53e3\u7684\u63a9\u7801*\/\n\t\tif (nif[i].ni_svalid &#038;&#038; nif[i].ni_ivalid &#038;&#038;\n\t\t    nif[i].ni_net == netpart)\n\t\t\treturn nif[i].ni_mask;\n\tif (IP_CLASSA(net)) return hl2net(0xff000000);\t\/* \u5982\u679c\u6ca1\u6709\u5408\u9002\u7684\u63a5\u53e3\u5219\u7528\u5730\u5740\u7684\u7c7b\u522b\u6765\u8bbe\u7f6e\u63a9\u7801*\/\n\tif (IP_CLASSB(net)) return hl2net(0xffff0000);\n\tif (IP_CLASSC(net)) return hl2net(0xffffff00);\n\treturn ~0;\n}\n\n\n\n\/* rthash.c - rthash *\/\n\n#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rthash  &#8211;  \u8ba1\u7b97\u7f51\u7edc\u7684\u54c8\u5e0c\u503c<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nrthash(IPaddr net)<br \/>\n{<br \/>\n\tint\t\tbc = IP_ALEN;\t\/* # \u5b57\u8282\u6570\t*\/<br \/>\n\tunsigned int\thv = 0;\t\t\/* \u54c8\u5e0c\u503c\t\t*\/<\/p>\n<p>\tif (IP_CLASSA(net)) bc = 1;<br \/>\n\telse if (IP_CLASSB(net)) bc = 2;<br \/>\n\telse if (IP_CLASSC(net)) bc = 3;<br \/>\n\telse if (IP_CLASSD(net))<br \/>\n\t\treturn ((net>>24) &#038; 0xf0) % RT_TSIZE;\t\/* D\u7c7b\u524d4\u6bd4\u7279\u4e5816\u518d\u4e0e\u6563\u5217\u8868\u957f\u5ea6\u53d6\u4f59\u6570*\/<br \/>\n\twhile (bc&#8211;)<br \/>\n\t\thv += ((char *)&#038;net)[bc] &#038; 0xff;\t\t\/* \u6bcf8\u4f4d\u76f8\u52a0*\/<br \/>\n\treturn hv % RT_TSIZE;\t\t\t\t\/* \u8fd4\u56de\u9664\u4ee5\u6563\u5217\u957f\u5ea6\u540e\u7684\u4f59\u6570*\/<br \/>\n}<\/p>\n<p>6.2 \u83b7\u5f97\u4e00\u4e2a\u8def\u7531<\/p>\n<p>\/* rtget.c &#8211; rtget *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtget  &#8211;  \u83b7\u5f97\u4e00\u4e2a\u7ed9\u5b9a\u7684IP\u5730\u5740\u7684\u8def\u7531<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nstruct route *<br \/>\nrtget(IPaddr dest, Bool local)<br \/>\n{<br \/>\n\tstruct\troute\t*prt;<br \/>\n\tint\t\thv;<\/p>\n<p>\tif (!Route.ri_valid)\t\t\t\/* \u5982\u679c\u8def\u7531\u7684\u6570\u636e\u7ed3\u6784\u6ca1\u88ab\u521d\u59cb\u5316\u5219\u5e94\u8be5\u5148\u521d\u59cb\u5316*\/<br \/>\n\t\trtinit();<br \/>\n\twait(Route.ri_mutex);\t\t\t\/* \u7b49\u5f85\u4fe1\u53f7\u4e92\u65a5\u91cf*\/<br \/>\n\thv = rthash(dest);\t\t\t\/* \u8ba1\u7b97\u54c8\u5e0c\u503c*\/<br \/>\n\tfor (prt=rttable[hv]; prt; prt=prt->rt_next) {<br \/>\n\t\tif (prt->rt_ttl <= 0)\n\t\t\tcontinue;\t\t\/* \u8def\u7531\u8fc7\u671f *\/\n\t\tif (netmatch(dest, prt->rt_net, prt->rt_mask, local))\t\/* \u5982\u679c\u7f51\u7edc\u5730\u5740\u5339\u914d*\/<br \/>\n\t\t\tif (prt->rt_metric < RTM_INF)\t\t\/* \u5e76\u4e14\u8ddd\u79bb\u91cf\u5ea6\u5c0f\u4e8e\u6700\u5927\u7684\u91cf\u5ea6*\/\n\t\t\t\tbreak;\t\t\/* \u5219\u9000\u51fafor\u5faa\u73af*\/\n\t}\n\tif (prt == 0)\t\t\t\t\/* \u5982\u679c\u6ca1\u6709\u627e\u5230\u5339\u914d\u7684\u7f51\u7edc\u5730\u5740*\/\n\t\tprt = Route.ri_default;\t\/* \u4f7f\u7528\u9ed8\u8ba4\u8def\u7531 *\/\n\tif (prt != 0 &#038;&#038; prt->rt_metric >= RTM_INF)\t\/*\u5982\u679c\u627e\u5230\u5339\u914d\u4e14\u8def\u79bb\u91cf\u5ea6\u5927\u4e8e\u6700\u5927\u7684\u91cf\u5ea6*\/<br \/>\n\t\tprt = 0;\t\t\t\t\t\/* prt\u6307\u54110*\/<br \/>\n\tif (prt) {<br \/>\n\t\tprt->rt_refcnt++;\t\t\t\/* \u5f15\u7528\u8ba1\u6570\u52a01*\/<br \/>\n\t\tprt->rt_usecnt++;\t\t\t\/* \u7edf\u8ba1\u8ba1\u6570\u52a01*\/<br \/>\n\t}<br \/>\n\tsignal(Route.ri_mutex);\t\t\t\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n\treturn prt;<br \/>\n}<\/p>\n<p>6.3 \u6570\u636e\u7ed3\u6784\u521d\u59cb\u5316<\/p>\n<p>\/* rtinit.c &#8211; rtinit *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <sleep.h><br \/>\n#include <network.h><\/p>\n<p>struct\trtinfo\tRoute;<br \/>\nstruct\troute\t*rttable[RT_TSIZE];<\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtinit  &#8211;  \u521d\u59cb\u5316\u8def\u7531\u8868<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nvoid<br \/>\nrtinit(void)<br \/>\n{<br \/>\n\tint i;<\/p>\n<p>\tfor (i=0; i<RT_TSIZE; ++i)\n\t\trttable[i] = 0;\n\tRoute.ri_bpool = mkpool(sizeof(struct route), RT_BPSIZE);\n\tRoute.ri_valid = TRUE;\n\tRoute.ri_mutex = screate(1);\n\tRoute.ri_default = NULL;\n}\n\n\n7. \u9009\u8def\u8868\u7684\u5b9a\u671f\u7ef4\u62a4\n\n\/* rttimer.c - rttimer *\/\n\n#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <proc.h>\n#include <network.h><\/p>\n<p>extern\tBool\tdorip;\t\t\/* TRUE \u5982\u679c\u6211\u4eec\u6b63\u5728\u8fd0\u884c\u7684RIP\u8f93\u51fa\t*\/<br \/>\nextern\tint\trippid;\t\t\/* \u8f93\u51fa\u7684RIP\u7684pid\uff0c\u5982\u679c\u8fd0\u884c\t*\/<\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n * rttimer &#8211;  \u66f4\u65b0TTLS\u53ca\u5220\u9664\u8fc7\u671f\u8def\u7531<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nvoid<br \/>\nrttimer(unsigned int delta)<br \/>\n{<br \/>\n\tstruct\troute\t*prt, *prev;<br \/>\n\tBool\t\tripnotify;<br \/>\n\tint\t\ti;<\/p>\n<p>\tif (!Route.ri_valid)\t\t\/* \u8def\u7531\u672a\u88ab\u521d\u59cb\u5316\u5219\u8fd4\u56de*\/<br \/>\n\t\treturn;<br \/>\n\twait(Route.ri_mutex);\t\t\/* \u7b49\u5f85\u4e92\u65a5\u91cf*\/<\/p>\n<p>\tripnotify = FALSE;\t\t\/* RIP\u901a\u77e5\u5173\u95ed*\/<br \/>\n\tfor (i=0; i<RT_TSIZE; ++i) {\t\/* \u904d\u5217\u6bcf\u4e00\u6761\u8def\u7531*\/\n\t\tif (rttable[i] == 0)\t\/* \u4e3a0\u5219\u7ee7\u7eed*\/\n\t\t\tcontinue;\n\t\tfor (prev = NULL, prt = rttable[i]; prt != NULL;) {\t\/*\u9000\u51fa\u6761\u4ef6\u4e3arttable[i]=prt=NULL*\/\n\t\t\tif (prt->rt_ttl != RT_INF)\t\/* \u5982\u679c\u751f\u5b58\u65f6\u95f4\u4e0d\u7b49\u4e8e\u6c38\u4e45*\/<br \/>\n\t\t\t\tprt->rt_ttl -= delta;\t\/* \u751f\u5b58\u65f6\u95f4\u51cf\u53bb\u76f8\u5e94\u7684\u65f6\u95f4*\/<br \/>\n\t\t\tif (prt->rt_ttl <= 0) {\t\t\/* \u5982\u679c\u751f\u5b58\u65f6\u95f4\u5c0f\u4e8e\u7b49\u4e8e0*\/\n#ifdef\tRIP\t\t\/* \u6761\u4ef6\u7f16\u8bd1,\u5f53\u6253\u5f00RIP\u65f6*\/\n\t\t\t\tif (dorip &#038;&#038; prt->rt_metric < RTM_INF) {\t\/*RIP\u6253\u5f00\u4e14\u8ddd\u79bb\u5c0f\u4e8e\u6700\u5927\u8ddd\u79bb*\/\n\t\t\t\t\tprt->rt_metric = RTM_INF;\t\/* \u8bbe\u7f6e\u8ddd\u79bb\u4e3a\u6700\u5927\u8ddd\u79bb*\/<br \/>\n\t\t\t\t\tprt->rt_ttl = RIPZTIME;\t\t\/* \u751f\u5b58\u65f6\u95f4\u4e3a\u65e0\u7a77*\/<br \/>\n\t\t\t\t\tripnotify = TRUE;\t\t\/* \u6253\u5f00RIP\u901a\u77e5*\/<br \/>\n\t\t\t\t\tcontinue;<br \/>\n\t\t\t\t}<br \/>\n#endif\t\/* RIP *\/<br \/>\n\t\t\t\tif (prev) {\t\t\/*\u5982\u679cprev\u4e0d\u4e3a\u7a7a,\u5220\u9664prt\u6307\u5411\u7684\u8868\u9879*\/<br \/>\n\t\t\t\t\tprev->rt_next = prt->rt_next;<br \/>\n\t\t\t\t\tRTFREE(prt);<br \/>\n\t\t\t\t\tprt = prev->rt_next;<br \/>\n\t\t\t\t} else {\t\t\/*\u5426\u5219\u8bf4\u660eprt\u5c31\u662f\u7b2c\u4e00\u4e2a\u8868\u9879*\/<br \/>\n\t\t\t\t\trttable[i] = prt->rt_next;\t\/*\u5220\u9664\u7b2c\u4e00\u4e2a\u8868\u9879*\/<br \/>\n\t\t\t\t\tRTFREE(prt);<br \/>\n\t\t\t\t\tprt = rttable[i];<br \/>\n\t\t\t\t}<br \/>\n\t\t\t\tcontinue;<br \/>\n\t\t\t}<br \/>\n\t\t\tprev = prt;\t\t\/* \u6307\u5411\u4e0b\u4e00\u4e2a*\/<br \/>\n\t\t\tprt = prt->rt_next;\t\/* \u6307\u5411\u4e0b\u4e00\u4e2a*\/<br \/>\n\t\t}<br \/>\n\t}<br \/>\n\tprt = Route.ri_default;\t\t\/* \u4f7f\u7528\u9ed8\u8ba4\u8def\u7531*\/<br \/>\n\tif (prt &#038;&#038; (prt->rt_ttl<RT_INF) &#038;&#038; (prt->rt_ttl -= delta) <= 0) { \/* \u9ed8\u8ba4\u8def\u7531\u4e0d\u5408\u9002*\/\n#ifdef\tRIP\n\t\tif (dorip &#038;&#038; prt->rt_metric < RTM_INF) {\t\/* RIP\u6253\u5f00\u4e14\u8ddd\u79bb\u5c0f\u4e8e\u6700\u5927\u8ddd\u79bb *\/\n\t\t\tprt->rt_metric = RTM_INF;\t\/* \u8ddd\u79bb\u4e3a\u6700\u5927\u8ddd\u79bb\u91cf\u5ea6 *\/<br \/>\n\t\t\tprt->rt_ttl = RIPZTIME;\t\t\/* \u751f\u5b58\u65f6\u95f4\u4e3a\u65e0\u7a77*\/<br \/>\n\t\t} else<br \/>\n#endif\t\/* RIP *\/<br \/>\n\t\t{<br \/>\n\t\t\tRTFREE(Route.ri_default);\t\t\/* \u91ca\u653e\u9ed8\u8ba4\u8def\u7531 *\/<br \/>\n\t\t\tRoute.ri_default = 0;\t\t\/* \u6e05\u9664\u9ed8\u8ba4\u8def\u7531\u6307\u9488*\/<br \/>\n\t\t}<br \/>\n\t}<br \/>\n\tsignal(Route.ri_mutex);\t\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n#ifdef\tRIP<br \/>\n\tif (dorip &#038;&#038; ripnotify)\t\t\/* RIP\u6253\u5f00\u5e76\u4e14RIP\u901a\u77e5\u6253\u5f00*\/<br \/>\n\t\tsend(rippid, 0);\t\/* \u53d1\u9001\u4efb\u4f55\u4e1c\u897f\uff0c\u4f46\u8d85\u65f6\t*\/<br \/>\n#endif\t\/* RIP *\/<br \/>\n\treturn;<br \/>\n}<\/p>\n<p>7.1 \u589e\u52a0\u8def\u7531<\/p>\n<p>\/* rtadd.c &#8211; rtadd *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <proc.h>\n#include <network.h><\/p>\n<p>struct\troute *rtnew(IPaddr, IPaddr, IPaddr, unsigned,unsigned,unsigned);<br \/>\nvoid rtinit(void);<br \/>\nint rthash(IPaddr);<\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtadd  &#8211; \u6dfb\u52a0\u4e00\u4e2a\u8def\u7531\u5230\u8def\u7531\u8868<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nrtadd(IPaddr net, IPaddr mask, IPaddr gw, unsigned metric,<br \/>\n\tunsigned intf, unsigned ttl)<br \/>\n{<br \/>\n\tstruct\troute\t*prt, *srt, *prev;<br \/>\n\tBool\t\tisdup;<br \/>\n\tint\t\thv, i;<\/p>\n<p>\tif (!Route.ri_valid)\t\t\/* \u521d\u59cb\u5316*\/<br \/>\n\t\trtinit();<\/p>\n<p>\tprt = rtnew(net, mask, gw, metric, intf, ttl);\t\t\/* \u5efa\u7acb\u65b0\u7684\u7ed3\u70b9*\/<br \/>\n\tif (prt == (struct route *)SYSERR)\t\t\t\/* \u5206\u914d\u5931\u8d25\u5219\u8fd4\u56de\u9519\u8bef*\/<br \/>\n\t\treturn SYSERR;<\/p>\n<p>\t\/* \u8ba1\u7b97\uff0c\u8def\u7531\u5728\u961f\u5217\u4e2d\u7684\u952e *\/<br \/>\n\tprt->rt_key = 0;<br \/>\n\tfor (i=0; i<32; ++i)\n\t\tprt->rt_key += (mask >> i) &#038; 1;<br \/>\n\twait(Route.ri_mutex);\t\t\/* \u7b49\u5f85\u4e92\u65a5\u91cf*\/<\/p>\n<p>\t\/* \u9ed8\u8ba4\u8def\u7531\u7684\u7279\u6b8a\u60c5\u51b5 *\/<br \/>\n\tif (net == RT_DEFAULT) {\t\t\/* \u5982\u679c\u7f51\u7edc\u5730\u5740\u4e3a\u4efb\u610f,\u51680*\/<br \/>\n\t\tif (Route.ri_default)\t\/* \u9ed8\u8ba4\u8def\u7531\u4e0d\u4e3a\u7a7a*\/<br \/>\n\t\t\tRTFREE(Route.ri_default);\t\/* \u91ca\u653e\u9ed8\u8ba4\u8def\u7531*\/<br \/>\n\t\tRoute.ri_default = prt;\t\t\/* \u7528\u65b0\u7684\u8def\u7531\u4ee3\u66ff*\/<br \/>\n\t\tsignal(Route.ri_mutex);\t\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n\t\treturn OK;<br \/>\n\t}<br \/>\n\tprev = NULL;<br \/>\n\thv = rthash(net);\t\/* \u8ba1\u7b97\u54c8\u5e0c\u503c*\/<br \/>\n\tisdup = FALSE;\t\t\/* \u662f\u5426\u6709\u76f8\u540c\u5730\u5740\u7684\u8def\u7531\u8868\u9879*\/<br \/>\n\t \/* \u67e5\u627e\u662f\u5426\u6709\u76f8\u540c\u7684\u8def\u7531*\/<br \/>\n\tfor (srt=rttable[hv]; srt; srt = srt->rt_next) {\t\/*srt \u4e3a\u7a7a\u5219\u9000\u51fafor*\/<br \/>\n\t\tif (prt->rt_key > srt->rt_key)\t\t\/* *\/<br \/>\n\t\t\tbreak;<br \/>\n\t\tif (srt->rt_net == prt->rt_net &#038;&#038;\t\/* \u7f51\u7edc\u5730\u5740\u548c\u63a9\u7801\u5747\u76f8\u540c,\u627e\u5230\u76f8\u540c\u7684\u5730\u5740\u7684\u8def\u7531*\/<br \/>\n\t    \t    srt->rt_mask == prt->rt_mask) {<br \/>\n\t\t\tisdup = TRUE;\t\t\t\/* isdup\u4e3a\u771f*\/<br \/>\n\t\t\tbreak;<br \/>\n\t\t}<br \/>\n\t\tprev = srt;<br \/>\n\t}<br \/>\n\tif (isdup) {\t\t\/* isdup\u4e3a\u771f,\u8bf4\u660e\u6709\u76f8\u540c\u7684\u8def\u7531\u8868\u9879*\/<br \/>\n\t\tstruct\troute\t*tmprt;<\/p>\n<p>\t\tif (srt->rt_gw == prt->rt_gw) {\t\t\/* \u6e90\u8def\u7531\u8868\u4e0e\u65b0\u8def\u7531\u8868\u7684\u4e0b\u4e00\u8df3\u76f8\u540c *\/<br \/>\n\t\t\t\/* \u66f4\u65b0\u65b0\u7531\u8868  *\/<br \/>\n#ifdef\tRIP\t\t\/* RIP\u6253\u5f00\u7684\u60c5\u51b5,\u4e0a\u8fb9\u8bf4\u8fc7\u5f88\u591a\u56de\u4e86,\u4e0b\u8fb9\u4e0d\u518d\u591a\u8bf4*\/<br \/>\n\t\t\tif (dorip) {<br \/>\n\t\t\t\tsrt->rt_ttl = ttl;<br \/>\n\t\t\t\tif (srt->rt_metric != metric) {<br \/>\n\t\t\t\t\tif (metric == RTM_INF)<br \/>\n\t\t\t\t\t\tsrt->rt_ttl = RIPZTIME;<br \/>\n\t\t\t\t\tsend(rippid, 0);<br \/>\n\t\t\t\t}<br \/>\n\t\t\t}<br \/>\n#endif\t\/* RIP *\/<br \/>\n\t\t\tsrt->rt_metric = metric;\t\t\/* \u66f4\u65b0\u8ddd\u79bb\u91cf\u5ea6*\/<br \/>\n\t\t\tRTFREE(prt);\t\t\t\/* \u91ca\u653eprt*\/<br \/>\n\t\t\tsignal(Route.ri_mutex);\t\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n\t\t\treturn OK;<br \/>\n\t\t}<br \/>\n\t\t\/* else, someone else has a route there&#8230; *\/<br \/>\n\t\tif (srt->rt_metric <= prt->rt_metric) {\t\/* \u6e90\u8def\u7531\u6bd4\u65b0\u8def\u7531\u5177\u6709\u66f4\u5c0f\u7684\u8ddd\u79bb\u5e76\u4e14\u4e0b\u4e00\u8df3\u5730\u5740\u4e0d\u540c*\/<br \/>\n\t\t\t\/* \u6ca1\u6709\u66f4\u597d\u7684\u8def\u7531\u7ebf\u8def,\u653e\u5f03\u65b0\u7684\u8def\u7531 *\/<\/p>\n<p>\t\t\tRTFREE(prt);<br \/>\n\t\t\tsignal(Route.ri_mutex);\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n\t\t\treturn OK;<br \/>\n\t\t}<br \/>\n#ifdef\tRIP<br \/>\n\t\telse if (dorip)<br \/>\n\t\t\tsend(rippid, 0);<br \/>\n#endif\t\/* RIP *\/<br \/>\n\t\ttmprt = srt;\t\t\/* \u6267\u884c\u5230\u8fd9\u91cc\u8bf4\u660e\u65b0\u8def\u7531\u66f4\u4f18,\u91ca\u653e\u65e7\u7684\u8def\u7531*\/<br \/>\n\t\tsrt = srt->rt_next;<br \/>\n\t\tRTFREE(tmprt);<br \/>\n\t}<br \/>\n#ifdef\tRIP<br \/>\n\telse if (dorip)<br \/>\n\t\tsend(rippid, 0);<br \/>\n#endif\t\/* RIP *\/<br \/>\n\tprt->rt_next = srt;\t\t\/* \u63d2\u5165\u65b0\u7684\u8def\u7531*\/<br \/>\n\tif (prev)\t\t\t\/* \u63d2\u5165\u5230\u94fe\u8868\u7684\u4e2d\u95f4*\/<br \/>\n\t\tprev->rt_next = prt;<br \/>\n\telse\t\t\t\t\/* \u63d2\u5165\u5230\u94fe\u8868\u7684\u5f00\u59cb*\/<br \/>\n\t\trttable[hv] = prt;<br \/>\n\tsignal(Route.ri_mutex);<br \/>\n\treturn OK;<br \/>\n}<\/p>\n<p>\u5efa\u7acb\u65b0\u7684\u7ed3\u70b9,\u5f88\u7b80\u5355\u4e0d\u591a\u8bf4\u4e86<\/p>\n<p>\/* rtnew.c &#8211; rtnew *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtnew  &#8211;  \u521b\u5efa\u4e00\u4e2a\u8def\u7531\u7ed3\u6784<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nstruct route *<br \/>\nrtnew(IPaddr net, IPaddr mask, IPaddr gw, unsigned metric,<br \/>\n\tunsigned ifnum, unsigned ttl)<br \/>\n{<br \/>\n\tstruct\troute *prt;<\/p>\n<p>\tprt = (struct route *)getbuf(Route.ri_bpool);<br \/>\n\tif (prt == (struct route *)SYSERR) {<br \/>\n\t\tIpRoutingDiscards++;<br \/>\n\t\treturn (struct route *)SYSERR;<br \/>\n\t}<\/p>\n<p>\tprt->rt_net = net;<br \/>\n\tprt->rt_mask = mask;<br \/>\n\tprt->rt_gw = gw;<br \/>\n\tprt->rt_metric = metric;<br \/>\n\tprt->rt_ifnum = ifnum;<br \/>\n\tprt->rt_ttl = ttl;<br \/>\n\tprt->rt_refcnt = 1;\t\/* our caller *\/<br \/>\n\tprt->rt_usecnt = 0;<br \/>\n\tprt->rt_next = NULL;<br \/>\n\treturn prt;<br \/>\n}<\/p>\n<p>7.2 \u5220\u9664\u8def\u7531<\/p>\n<p>\/* rtdel.c &#8211; rtdel *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtdel  &#8211;  \u5220\u9664\u7ed9\u5b9a\u7f51\u7edc\u7684\u8def\u7531\u548c\u63a9\u7801<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nrtdel(IPaddr net, IPaddr mask)<br \/>\n{<br \/>\n\tstruct\troute\t*prt, *prev;<br \/>\n\tint\t\thv, i;<\/p>\n<p>\tif (!Route.ri_valid)\t\t\/* \u672a\u88ab\u521d\u59cb\u5316\u5219\u8fd4\u56de\u51fa\u9519*\/<br \/>\n\t\treturn SYSERR;<br \/>\n\twait(Route.ri_mutex);\t\t\/* \u7b49\u5f85\u4e92\u65a5\u91cf*\/<br \/>\n\tif (Route.ri_default &#038;&#038;\t\t\/* \u9ed8\u8ba4\u8def\u7531\u5b58\u5728\u5e76\u4e14net\u53c2\u6570\u4e0e\u4e4b\u76f8\u540c,\u5219\u5220\u9664\u9ed8\u8ba4\u8def\u7531*\/<br \/>\n\t    net == Route.ri_default->rt_net) {<br \/>\n\t\tRTFREE(Route.ri_default);<br \/>\n\t\tRoute.ri_default = 0;<br \/>\n\t\tsignal(Route.ri_mutex);<br \/>\n\t\treturn OK;<br \/>\n\t}<br \/>\n\thv = rthash(net);\t\t\/* \u8ba1\u7b97\u54c8\u5e0c\u503c*\/<\/p>\n<p>\tprev = NULL;<br \/>\n\t\/* \u67e5\u627e\u5339\u914d\u7684\u8def\u7531*\/<br \/>\n\tfor (prt = rttable[hv]; prt; prt = prt->rt_next) {<br \/>\n\t\tif (net == prt->rt_net &#038;&#038;<br \/>\n\t\t    mask == prt->rt_mask)<br \/>\n\t\t\tbreak;<br \/>\n\t\tprev = prt;<br \/>\n\t}<br \/>\n\tif (prt == NULL) {\t\t\/* \u6ca1\u6709\u627e\u5230\u5339\u914d\u7684\u8def\u7531*\/<br \/>\n\t\tsignal(Route.ri_mutex);<br \/>\n\t\treturn SYSERR;<br \/>\n\t}<br \/>\n\tif (prev)\t\t\t\/* prev\u4e0d\u4e3a\u7a7a,\u8bf4\u660e\u5339\u914d\u7684\u8def\u7531\u5728\u94fe\u8868\u4e2d\u95f4,\u5e76\u5220\u9664\u7ed3\u70b9*\/<br \/>\n\t\tprev->rt_next = prt->rt_next;<br \/>\n\telse\t\t\t\t\/* \u8def\u7531\u5728\u94fe\u8868\u5f00\u5934*\/<br \/>\n\t\trttable[hv] = prt->rt_next;<br \/>\n\tRTFREE(prt);\t\t\t\/* \u91ca\u653e\u7ed3\u70b9*\/<br \/>\n\tsignal(Route.ri_mutex);\t\t\/* \u91ca\u653e\u4e92\u65a5\u91cf*\/<br \/>\n\treturn OK;<br \/>\n}<\/p>\n<p>\u91ca\u653e\u7ed3\u70b9\u7528\u7684,\u6ca1\u4ec0\u4e48\u53ef\u8bf4\u7684,\u5c31\u662f\u4f7f\u7528\u4e92\u65a5\u91cf,\u8c03\u7528\u4e00\u4e2a\u5b8f<br \/>\n\/* rtfree.c &#8211; rtfree *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  rtfree  &#8211;  remove one reference to a route<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nrtfree(struct route *prt)<br \/>\n{<br \/>\n\tif (!Route.ri_valid)<br \/>\n\t\treturn SYSERR;<br \/>\n\twait(Route.ri_mutex);<br \/>\n\tRTFREE(prt);<br \/>\n\tsignal(Route.ri_mutex);<br \/>\n\treturn OK;<br \/>\n}<\/p>\n<p>8. IP\u9009\u9879\u5904\u7406<br \/>\n\u6ca1\u505a\u4ec0\u4e48\u5de5\u505a,\u53ea\u662f\u5206\u6790\u4e86\u4e00\u4e0bIP\u9996\u90e8\u4e2d\u9009\u9762\u957f\u5ea6\u516b\u4f4d\u7ec4\u7684\u4fe1\u606f<br \/>\n\/* ipdoopts.c &#8211; ipdoopts *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  ipdoopts &#8211; do gateway handling of IP options<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nipdoopts(struct netif *pni, struct ep *pep)<br \/>\n{<br \/>\n\treturn OK;\t\/* not implemented yet *\/<br \/>\n}<\/p>\n<p>\/* ipdstopts.c &#8211; ipdstopts *\/<\/p>\n<p>#include <conf.h><br \/>\n#include <kernel.h><br \/>\n#include <network.h><\/p>\n<p>\/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *  ipdstopts &#8211; do host handling of IP options<br \/>\n *&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\n *\/<br \/>\nint<br \/>\nipdstopts(struct netif *pni, struct ep *pep)<br \/>\n{<br \/>\n\tstruct\tip\t*pip = (struct ip *)pep->ep_data;<br \/>\n\tu_char\t\t*popt, *popend;<br \/>\n\tint\t\tlen;<\/p>\n<p>\tif (IP_HLEN(pip) == IPMHLEN)<br \/>\n\t\treturn OK;<br \/>\n\tpopt = pip->ip_data;<br \/>\n\tpopend = (u_char *)&#038;pep->ep_data[IP_HLEN(pip)];<\/p>\n<p>\t\/* NOTE: options not implemented yet *\/<\/p>\n<p>\t\/* delete the options *\/<br \/>\n\tlen = pip->ip_len-IP_HLEN(pip);\t\/* data length\t*\/<br \/>\n\tif (len)<br \/>\n\t\tmemcpy(pip->ip_data, &#038;pep->ep_data[IP_HLEN(pip)], len);<br \/>\n\tpip->ip_len = IPMHLEN + len;<br \/>\n\tpip->ip_verlen = (pip->ip_verlen&#038;0xf0) | IP_MINHLEN;<br \/>\n\treturn OK;<br \/>\n}<\/p>\n<p>\u95ee\u9898:rtdel\u8c03\u7528rtfree\u800c\u4e0d\u662f\u4f7f\u7528\u5b8f RTFREE,\u7ed3\u679c\u4f1a\u600e\u4e48\u6837? \u4f1a\u53d1\u751f\u6b7b\u9501<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1 \u5f15\u8a00 \u8ba8\u8bba\u9009\u62e9\u8def\u7531\u7684\u7ec6\u8282\uff0c\u9009\u8def\u8868\u7684\u7ed3\u6784\uff0c\u4ee5\u53ca\u5b9e\u73b0\u7b97\u6cd5\uff0c\u8def\u7531\u5982\u4f55\u4f7f\u7528\u5b50\u7f51\u63a9\u7801\uff0c\u5982\u4f55\u533a\u5206\u7f51\u7edc\u8def\u7531\u5b50\u7f51\u8def\u7531\u4ee5\u53ca\u4e3b [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,14],"tags":[],"class_list":["post-598","post","type-post","status-publish","format-standard","hentry","category-linux","category-linux-c","category-14"],"_links":{"self":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=598"}],"version-history":[{"count":0,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=\/wp\/v2\/posts\/598\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kumouse.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}