{"id":67703,"date":"2026-01-29T03:41:22","date_gmt":"2026-01-28T19:41:22","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/67703.html"},"modified":"2026-01-29T03:41:22","modified_gmt":"2026-01-28T19:41:22","slug":"linux-%e7%94%a8%e6%88%b7%e7%a9%ba%e9%97%b4%e4%b8%8e%e5%86%85%e6%a0%b8%e7%a9%ba%e9%97%b4%e7%9a%84-netlink-%e9%80%9a%e4%bf%a1%e6%9c%ba%e5%88%b6%e5%8f%8a%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/67703.html","title":{"rendered":"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0"},"content":{"rendered":"<p>\u6ce8&#xff1a;\u672c\u6587\u4e3a \u201cLinux Netlink \u901a\u4fe1\u673a\u5236\u201d \u76f8\u5173\u5408\u8f91\u3002 \u7565\u4f5c\u91cd\u6392&#xff0c;\u672a\u6574\u7406\u53bb\u91cd\u3002 \u5982\u6709\u5185\u5bb9\u5f02\u5e38&#xff0c;\u8bf7\u770b\u539f\u6587\u3002<\/p>\n<hr \/>\n<h2>\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e0a&#xff09;<\/h2>\n<p>wjlkoorey258 2012-11-07 22:00:24<\/p>\n<h3>\u5f15\u8a00<\/h3>\n<p>Alan Cox \u5728\u5185\u6838 1.3 \u7248\u672c\u7684\u5f00\u53d1\u9636\u6bb5\u9996\u6b21\u5f15\u5165\u4e86 Netlink \u673a\u5236&#xff0c;\u6700\u521d\u8be5\u673a\u5236\u4ee5\u5b57\u7b26\u9a71\u52a8\u63a5\u53e3\u7684\u5f62\u5f0f&#xff0c;\u63d0\u4f9b\u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u7684\u53cc\u5411\u6570\u636e\u901a\u4fe1\u80fd\u529b&#xff1b;\u968f\u540e&#xff0c;\u5728 2.1 \u5185\u6838\u7248\u672c\u7684\u5f00\u53d1\u8fc7\u7a0b\u4e2d&#xff0c;Alexey Kuznetsov \u5c06 Netlink \u91cd\u6784\u4e3a\u4e00\u5957\u66f4\u4e3a\u7075\u6d3b\u3001\u4e14\u6613\u4e8e\u6269\u5c55\u7684\u57fa\u4e8e\u6d88\u606f\u7684\u901a\u4fe1\u63a5\u53e3&#xff0c;\u5e76\u5c06\u5176\u5e94\u7528\u4e8e\u9ad8\u7ea7\u8def\u7531\u5b50\u7cfb\u7edf\u7684\u57fa\u7840\u6846\u67b6\u5b9e\u73b0\u4e2d\u3002\u81ea\u8be5\u9636\u6bb5\u8d77&#xff0c;Netlink \u4fbf\u6210\u4e3a Linux \u5185\u6838\u5b50\u7cfb\u7edf\u4e0e\u7528\u6237\u6001\u5e94\u7528\u7a0b\u5e8f\u4e4b\u95f4\u8fdb\u884c\u6570\u636e\u901a\u4fe1\u7684\u4e3b\u8981\u624b\u6bb5\u4e4b\u4e00\u3002<\/p>\n<p>2001 \u5e74&#xff0c;ForCES IETF \u59d4\u5458\u4f1a\u6b63\u5f0f\u542f\u52a8\u4e86 Netlink \u673a\u5236\u7684\u6807\u51c6\u5316\u5de5\u4f5c\u3002Jamal Hadi Salim \u63d0\u8bae\u5c06 Netlink \u5b9a\u4e49\u4e3a\u4e00\u79cd\u7528\u4e8e\u7f51\u7edc\u8bbe\u5907\u8def\u7531\u5f15\u64ce\u7ec4\u4ef6\u4e0e\u63a7\u5236\u7ba1\u7406\u7ec4\u4ef6\u4e4b\u95f4\u901a\u4fe1\u7684\u4e13\u7528\u534f\u8bae&#xff0c;\u4f46\u8be5\u63d0\u8bae\u6700\u7ec8\u672a\u88ab\u91c7\u7eb3\u3002\u53d6\u800c\u4ee3\u4e4b\u7684\u662f\u5f53\u524d\u7684\u5b9e\u73b0\u683c\u5c40&#xff1a;Netlink \u88ab\u8bbe\u8ba1\u4e3a\u4e00\u4e2a\u5168\u65b0\u7684\u534f\u8bae\u57df&#xff08;domain&#xff09;\u3002<\/p>\n<p>Linux \u521b\u59cb\u4eba Linus Torvalds \u66fe\u63d0\u51fa&#xff1a;\u201cLinux is evolution, not intelligent design\u201d\u3002\u8fd9\u4e00\u7406\u5ff5\u540c\u6837\u9002\u7528\u4e8e Netlink \u673a\u5236\u2014\u2014\u8be5\u673a\u5236\u4e0d\u5b58\u5728\u5b8c\u6574\u7684\u89c4\u8303\u6587\u6863\u4e0e\u8bbe\u8ba1\u6587\u6863&#xff0c;\u5176\u5e95\u5c42\u7ec6\u8282\u7684\u83b7\u53d6\u4ec5\u80fd\u901a\u8fc7\u201cRead the f**king source code\u201d\u7684\u65b9\u5f0f\u5b9e\u73b0\u3002<\/p>\n<p>\u672c\u6587\u4e0d\u6d89\u53ca Netlink \u5728 Linux \u7cfb\u7edf\u4e2d\u7684\u5b9e\u73b0\u673a\u5236\u5256\u6790&#xff0c;\u4ec5\u56f4\u7ed5\u201c\u4ec0\u4e48\u662f Netlink\u201d\u4e0e\u201c\u5982\u4f55\u6b63\u786e\u4f7f\u7528 Netlink\u201d\u4e24\u4e2a\u4e3b\u9898\u5c55\u5f00\u9610\u8ff0&#xff0c;\u4ec5\u5f53\u5b9e\u9645\u5e94\u7528\u4e2d\u9047\u5230\u95ee\u9898\u65f6&#xff0c;\u624d\u9700\u8981\u67e5\u9605\u5185\u6838\u6e90\u7801\u4ee5\u660e\u786e\u5176\u5e95\u5c42\u539f\u7406\u3002<\/p>\n<h3>\u4ec0\u4e48\u662f Netlink<\/h3>\n<p>\u5bf9 Netlink \u673a\u5236\u7684\u7406\u89e3&#xff0c;\u9700\u628a\u63e1\u4ee5\u4e0b\u4e24\u4e2a\u5173\u952e\u8981\u70b9&#xff1a;<\/p>\n<li>\u9762\u5411\u6570\u636e\u62a5\u7684\u65e0\u8fde\u63a5\u6d88\u606f\u5b50\u7cfb\u7edf<\/li>\n<li>\u57fa\u4e8e\u901a\u7528 BSD Socket \u67b6\u6784\u5b9e\u73b0<\/li>\n<p>\u5173\u4e8e\u7b2c\u4e00\u70b9&#xff0c;\u5176\u7279\u6027\u4e0e UDP \u534f\u8bae\u5177\u6709\u8f83\u9ad8\u7684\u76f8\u4f3c\u6027&#xff0c;\u4ee5 UDP \u534f\u8bae\u4e3a\u53c2\u8003\u7406\u89e3 Netlink \u673a\u5236\u5177\u6709\u5408\u7406\u6027\u3002\u901a\u8fc7\u77e5\u8bc6\u7684\u8fc1\u79fb\u3001\u5f52\u7eb3\u4e0e\u603b\u7ed3&#xff0c;\u53ef\u5b9e\u73b0\u5bf9\u8be5\u673a\u5236\u7684\u6df1\u5165\u638c\u63e1\u3002Netlink \u652f\u6301\u5185\u6838\u7a7a\u95f4\u5230\u7528\u6237\u7a7a\u95f4\u3001\u7528\u6237\u7a7a\u95f4\u5230\u5185\u6838\u7a7a\u95f4\u7684\u53cc\u5411\u5f02\u6b65\u6570\u636e\u901a\u4fe1&#xff0c;\u540c\u65f6\u4e5f\u652f\u6301\u4e24\u4e2a\u7528\u6237\u8fdb\u7a0b\u4e4b\u95f4\u3001\u4e24\u4e2a\u5185\u6838\u5b50\u7cfb\u7edf\u4e4b\u95f4\u7684\u6570\u636e\u901a\u4fe1\u3002\u672c\u6587\u4e0d\u6d89\u53ca\u540e\u4e24\u79cd\u901a\u4fe1\u573a\u666f&#xff0c;\u4ec5\u805a\u7126\u4e8e\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u4e4b\u95f4\u7684\u6570\u636e\u901a\u4fe1\u5b9e\u73b0\u3002<\/p>\n<p>\u63d0\u53ca\u7b2c\u4e8c\u70b9&#xff0c;\u901a\u5e38\u4f1a\u8054\u60f3\u5230\u5bf9\u5e94\u7684 BSD Socket \u67b6\u6784\u793a\u610f\u56fe&#xff08;\u5982\u4e0b\u6240\u793a&#xff09;\u3002<\/p>\n<p>\u5728\u540e\u7eed Netlink \u5957\u63a5\u5b57\u7f16\u7a0b\u7684\u5b9e\u6218\u73af\u8282\u4e2d&#xff0c;\u4e3b\u8981\u5c06\u4f7f\u7528 socket()\u3001bind()\u3001sendmsg() \u4e0e recvmsg() \u7b49\u7cfb\u7edf\u8c03\u7528&#xff0c;\u540c\u65f6\u8fd8\u4f1a\u7528\u5230 Socket \u63d0\u4f9b\u7684\u8f6e\u8be2&#xff08;polling&#xff09;\u673a\u5236\u3002<\/p>\n<h3>Netlink \u901a\u4fe1\u7c7b\u578b<\/h3>\n<p>Netlink \u652f\u6301\u4e24\u79cd\u901a\u4fe1\u7c7b\u578b&#xff1a;\u5355\u64ad&#xff08;Unicast&#xff09;\u4e0e\u591a\u64ad&#xff08;Multicast&#xff09;\u3002<\/p>\n<h4>\u5355\u64ad<\/h4>\n<p>\u5355\u64ad\u5e38\u7528\u4e8e\u5355\u4e2a\u7528\u6237\u8fdb\u7a0b\u4e0e\u5355\u4e2a\u5185\u6838\u5b50\u7cfb\u7edf\u4e4b\u95f4\u7684 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         1 <\/p>\n<p>         : <\/p>\n<p>         1 <\/p>\n<p>        1:1 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><span class=\"mspace\" style=\"margin-right: 0.2778em\"><\/span><span class=\"mrel\">:<\/span><span class=\"mspace\" style=\"margin-right: 0.2778em\"><\/span><\/span><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span> \u6570\u636e\u901a\u4fe1&#xff0c;\u7528\u6237\u7a7a\u95f4\u5411\u5185\u6838\u53d1\u9001\u547d\u4ee4&#xff0c;\u5e76\u63a5\u6536\u5185\u6838\u8fd4\u56de\u7684\u547d\u4ee4\u6267\u884c\u7ed3\u679c\u3002<\/p>\n<h4>\u591a\u64ad<\/h4>\n<p>\u591a\u64ad\u5e38\u7528\u4e8e\u5355\u4e2a\u5185\u6838\u8fdb\u7a0b\u4e0e\u591a\u4e2a\u7528\u6237\u8fdb\u7a0b\u4e4b\u95f4\u7684 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         1 <\/p>\n<p>         : <\/p>\n<p>         N <\/p>\n<p>        1:N <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><span class=\"mspace\" style=\"margin-right: 0.2778em\"><\/span><span class=\"mrel\">:<\/span><span class=\"mspace\" style=\"margin-right: 0.2778em\"><\/span><\/span><span class=\"base\"><span class=\"strut\" style=\"height: 0.6833em\"><\/span><span style=\"margin-right: 0.109em\" class=\"mord mathnormal\">N<\/span><\/span><\/span><\/span><\/span> \u6570\u636e\u901a\u4fe1&#xff0c;\u5185\u6838\u4f5c\u4e3a\u4f1a\u8bdd\u53d1\u8d77\u65b9&#xff0c;\u7528\u6237\u7a7a\u95f4\u5e94\u7528\u7a0b\u5e8f\u4f5c\u4e3a\u6d88\u606f\u63a5\u6536\u65b9\u3002\u5b9e\u73b0\u8be5\u529f\u80fd\u7684\u6d41\u7a0b\u4e3a&#xff1a;\u5185\u6838\u7a7a\u95f4\u7a0b\u5e8f\u521b\u5efa\u4e00\u4e2a\u591a\u64ad\u7ec4&#xff0c;\u6240\u6709\u5bf9\u8be5\u5185\u6838\u8fdb\u7a0b\u53d1\u9001\u7684\u6d88\u606f\u611f\u5174\u8da3\u7684\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b&#xff0c;\u5747\u53ef\u901a\u8fc7\u52a0\u5165\u8be5\u591a\u64ad\u7ec4\u7684\u65b9\u5f0f\u63a5\u6536\u5bf9\u5e94\u6d88\u606f\u3002<\/p>\n<p>\u5176\u4e2d&#xff0c;\u8fdb\u7a0b A \u4e0e\u5b50\u7cfb\u7edf 1 \u4e4b\u95f4\u4e3a\u5355\u64ad\u901a\u4fe1&#xff0c;\u8fdb\u7a0b B\u3001C \u4e0e\u5b50\u7cfb\u7edf 2 \u4e4b\u95f4\u4e3a\u591a\u64ad\u901a\u4fe1\u3002\u4e0a\u8ff0\u793a\u610f\u56fe\u8fd8\u63ed\u793a\u4e86\u4e00\u4e2a\u91cd\u8981\u7279\u6027&#xff1a;\u4ece\u7528\u6237\u7a7a\u95f4\u4f20\u9012\u81f3\u5185\u6838\u7a7a\u95f4\u7684\u6570\u636e\u65e0\u9700\u6392\u961f&#xff0c;\u5bf9\u5e94\u7684\u64cd\u4f5c\u4ee5\u540c\u6b65\u65b9\u5f0f\u5b8c\u6210&#xff1b;\u800c\u4ece\u5185\u6838\u7a7a\u95f4\u4f20\u9012\u81f3\u7528\u6237\u7a7a\u95f4\u7684\u6570\u636e\u9700\u8981\u6392\u961f&#xff0c;\u5bf9\u5e94\u7684\u64cd\u4f5c\u4ee5\u5f02\u6b65\u65b9\u5f0f\u5b8c\u6210\u3002\u638c\u63e1\u8be5\u7279\u6027\u80fd\u591f\u5728\u57fa\u4e8e Netlink \u5f00\u53d1\u5e94\u7528\u6a21\u5757\u65f6\u89c4\u907f\u8bf8\u591a\u6f5c\u5728\u95ee\u9898\u3002\u4f8b\u5982&#xff0c;\u5f53\u7528\u6237\u7a7a\u95f4\u5411\u5185\u6838\u53d1\u9001\u6d88\u606f\u4ee5\u83b7\u53d6\u8def\u7531\u8868\u7b49\u5927\u89c4\u6a21\u6570\u636e\u65f6&#xff0c;\u5185\u6838\u901a\u8fc7 Netlink \u8fd4\u56de\u6570\u636e\u7684\u8fc7\u7a0b\u4e2d&#xff0c;\u5f00\u53d1\u4eba\u5458\u9700\u91cd\u70b9\u8003\u8651\u6570\u636e\u7684\u63a5\u6536\u7b56\u7565&#xff0c;\u5145\u5206\u91cd\u89c6\u5185\u6838\u7a7a\u95f4\u7684\u8f93\u51fa\u961f\u5217\u7279\u6027\u3002<\/p>\n<h3>Netlink \u7684\u6d88\u606f\u683c\u5f0f<\/h3>\n<p>Netlink \u6d88\u606f\u7531\u6d88\u606f\u5934&#xff08;Message Header&#xff09;\u4e0e\u6709\u6548\u6570\u636e\u8f7d\u8377&#xff08;Payload&#xff09;\u4e24\u90e8\u5206\u7ec4\u6210&#xff0c;\u6574\u4e2a Netlink \u6d88\u606f\u9700\u6ee1\u8db3 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         4 <\/p>\n<p>        4 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">4<\/span><\/span><\/span><\/span><\/span> \u5b57\u8282\u5bf9\u9f50\u8981\u6c42&#xff0c;\u901a\u5e38\u4ee5\u4e3b\u673a\u5b57\u8282\u5e8f\u8fdb\u884c\u4f20\u9012\u3002\u6d88\u606f\u5934\u4e3a\u56fa\u5b9a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         16 <\/p>\n<p>        16 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">16<\/span><\/span><\/span><\/span><\/span> \u5b57\u8282\u957f\u5ea6&#xff0c;\u6d88\u606f\u4f53\u957f\u5ea6\u4e3a\u53ef\u53d8\u503c\u3002<\/p>\n<h4>Netlink \u7684\u6d88\u606f\u5934<\/h4>\n<p>\u6d88\u606f\u5934\u5b9a\u4e49\u5728\u5bf9\u5e94\u5185\u6838\u5934\u6587\u4ef6\u4e2d&#xff0c;\u7531\u7ed3\u6784\u4f53 struct nlmsghdr \u8868\u793a&#xff0c;\u5176\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  __u32    nlmsg_len<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* Length of message including header *\/<\/span><br \/>\n  __u16    nlmsg_type<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* Message content *\/<\/span><br \/>\n  __u16    nlmsg_flags<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* Additional flags *\/<\/span><br \/>\n  __u32    nlmsg_seq<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* Sequence number *\/<\/span><br \/>\n  __u32    nlmsg_pid<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* Sending process PID *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u6d88\u606f\u5934\u4e2d\u5404\u6210\u5458\u7684\u5c5e\u6027\u89e3\u91ca\u5982\u4e0b&#xff1a;<\/p>\n<li>nlmsg_len&#xff1a;\u6574\u4e2a\u6d88\u606f\u7684\u5b57\u8282\u957f\u5ea6&#xff0c;\u5305\u542b Netlink \u6d88\u606f\u5934\u672c\u8eab\u7684\u957f\u5ea6\u3002<\/li>\n<li>nlmsg_type&#xff1a;\u6d88\u606f\u7c7b\u578b&#xff0c;\u7528\u4e8e\u533a\u5206\u6570\u636e\u6d88\u606f\u4e0e\u63a7\u5236\u6d88\u606f\u3002\u5728\u5185\u6838 2.6.21 \u7248\u672c\u4e2d&#xff0c;Netlink \u4ec5\u652f\u6301\u56db\u79cd\u63a7\u5236\u6d88\u606f&#xff0c;\u5177\u4f53\u5982\u4e0b&#xff1a;\n<ul>\n<li>NLMSG_NOOP&#xff1a;\u7a7a\u6d88\u606f&#xff0c;\u65e0\u4efb\u4f55\u5b9e\u9645\u64cd\u4f5c&#xff1b;<\/li>\n<li>NLMSG_ERROR&#xff1a;\u6807\u8bc6\u8be5\u6d88\u606f\u4e2d\u5305\u542b\u9519\u8bef\u4fe1\u606f&#xff1b;<\/li>\n<li>NLMSG_DONE&#xff1a;\u5f53\u5185\u6838\u901a\u8fc7 Netlink \u961f\u5217\u8fd4\u56de\u591a\u6761\u6d88\u606f\u65f6&#xff0c;\u961f\u5217\u7684\u6700\u540e\u4e00\u6761\u6d88\u606f\u7c7b\u578b\u4e3a\u6b64\u503c&#xff0c;\u5176\u4f59\u6240\u6709\u6d88\u606f\u7684 nlmsg_flags \u5c5e\u6027\u5747\u4f1a\u8bbe\u7f6e NLM_F_MULTI \u4f4d\u6709\u6548&#xff1b;<\/li>\n<li>NLMSG_OVERRUN&#xff1a;\u6682\u672a\u542f\u7528\u3002<\/li>\n<\/ul>\n<\/li>\n<li>nlmsg_flags&#xff1a;\u9644\u52a0\u5728\u6d88\u606f\u4e0a\u7684\u989d\u5916\u8bf4\u660e\u4fe1\u606f&#xff0c;\u4f8b\u5982\u524d\u6587\u63d0\u53ca\u7684 NLM_F_MULTI\u3002\u90e8\u5206\u5e38\u7528\u6807\u8bb0\u53ca\u5176\u4f5c\u7528\u5982\u4e0b\u8868\u6240\u793a&#xff1a;<\/li>\n<table>\n<tr>\u6807\u8bb0\u4f5c\u7528\u53ca\u8bf4\u660e<\/tr>\n<tbody>\n<tr>\n<td align=\"left\">NLM_F_REQUEST<\/td>\n<td align=\"left\">\u82e5\u6d88\u606f\u5305\u542b\u8be5\u6807\u8bb0\u4f4d&#xff0c;\u8868\u660e\u8be5\u6d88\u606f\u4e3a\u8bf7\u6c42\u6d88\u606f\u3002\u6240\u6709\u4ece\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u81f3\u5185\u6838\u7a7a\u95f4\u7684\u6d88\u606f\u5747\u9700\u8bbe\u7f6e\u8be5\u4f4d&#xff0c;\u5426\u5219\u5185\u6838\u5c06\u5411\u7528\u6237\u7a7a\u95f4\u8fd4\u56de EINVAL \u65e0\u6548\u53c2\u6570\u9519\u8bef<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">NLM_F_MULTI<\/td>\n<td align=\"left\">\u7528\u6237\u7a7a\u95f4\u81f3\u5185\u6838\u7a7a\u95f4\u7684\u6d88\u606f\u4f20\u8f93\u4e3a\u540c\u6b65\u5373\u65f6\u5b8c\u6210&#xff0c;\u800c\u5185\u6838\u7a7a\u95f4\u81f3\u7528\u6237\u7a7a\u95f4\u7684\u6d88\u606f\u4f20\u8f93\u9700\u8981\u6392\u961f\u3002\u82e5\u5185\u6838\u6536\u5230\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u7684\u5305\u542b NLM_F_DUMP \u4f4d\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>            1 <\/p>\n<p>           1 <\/p>\n<p>       <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span> \u7684\u6d88\u606f&#xff0c;\u5c06\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u4e00\u4e2a\u7531\u591a\u6761 Netlink \u6d88\u606f\u7ec4\u6210\u7684\u94fe\u8868\u3002\u9664\u6700\u540e\u4e00\u6761\u6d88\u606f\u5916&#xff0c;\u5176\u4f59\u6bcf\u6761\u6d88\u606f\u5747\u4f1a\u8bbe\u7f6e\u8be5\u4f4d\u6709\u6548<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">NLM_F_ACK<\/td>\n<td align=\"left\">\u8be5\u6d88\u606f\u662f\u5185\u6838\u5bf9\u6765\u81ea\u7528\u6237\u7a7a\u95f4\u7684 NLM_F_REQUEST \u6d88\u606f\u7684\u54cd\u5e94\u6d88\u606f<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">NLM_F_ECHO<\/td>\n<td align=\"left\">\u82e5\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u81f3\u5185\u6838\u7684\u6d88\u606f\u4e2d\u8be5\u6807\u8bb0\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>            1 <\/p>\n<p>           1 <\/p>\n<p>       <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u8868\u660e\u7528\u6237\u5e94\u7528\u8fdb\u7a0b\u8981\u6c42\u5185\u6838\u5c06\u8be5\u6d88\u606f\u901a\u8fc7\u5355\u64ad\u5f62\u5f0f\u56de\u4f20\u7ed9\u8be5\u7528\u6237\u8fdb\u7a0b&#xff0c;\u4e0e\u5e38\u89c4\u7684\u201c\u56de\u663e\u201d\u529f\u80fd\u7c7b\u4f3c<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u2026<\/td>\n<td align=\"left\">\u2026<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u5173\u4e8e nlmsg_flags \u7684\u5b8c\u6574\u53d6\u503c&#xff0c;\u53ef\u901a\u8fc7\u67e5\u9605\u5185\u6838\u6e90\u7801\u4e0e\u5b98\u65b9\u6280\u672f\u6587\u6863\u83b7\u53d6&#xff0c;\u6b64\u5904\u4e0d\u505a\u8fdb\u4e00\u6b65\u5c55\u5f00\u3002<\/p>\n<li>\n<p>nlmsg_seq&#xff1a;\u6d88\u606f\u5e8f\u5217\u53f7\u3002\u7531\u4e8e Netlink \u662f\u9762\u5411\u6570\u636e\u62a5\u7684\u901a\u4fe1\u673a\u5236&#xff0c;\u5b58\u5728\u6570\u636e\u4e22\u5931\u7684\u6f5c\u5728\u98ce\u9669&#xff0c;\u800c Netlink \u63d0\u4f9b\u4e86\u6d88\u606f\u53ef\u9760\u6027\u4fdd\u969c\u7684\u57fa\u7840\u673a\u5236&#xff0c;\u53ef\u4f9b\u7a0b\u5e8f\u5f00\u53d1\u4eba\u5458\u6839\u636e\u5b9e\u9645\u9700\u6c42\u8fdb\u884c\u5b9e\u73b0\u3002\u6d88\u606f\u5e8f\u5217\u53f7\u901a\u5e38\u4e0e NLMSG_ACK \u7c7b\u578b\u6d88\u606f\u8054\u5408\u4f7f\u7528&#xff0c;\u82e5\u7528\u6237\u5e94\u7528\u7a0b\u5e8f\u9700\u8981\u786e\u4fdd\u53d1\u9001\u7684\u6bcf\u6761\u6d88\u606f\u5747\u88ab\u5185\u6838\u6210\u529f\u63a5\u6536&#xff0c;\u53d1\u9001\u6d88\u606f\u65f6\u9700\u81ea\u884c\u8bbe\u7f6e\u8be5\u5e8f\u5217\u53f7&#xff0c;\u5185\u6838\u6536\u5230\u6d88\u606f\u540e\u63d0\u53d6\u8be5\u5e8f\u5217\u53f7&#xff0c;\u5e76\u5728\u54cd\u5e94\u6d88\u606f\u4e2d\u8bbe\u7f6e\u76f8\u540c\u7684\u5e8f\u5217\u53f7&#xff0c;\u8be5\u673a\u5236\u4e0e TCP \u534f\u8bae\u7684\u5e94\u7b54\u786e\u8ba4\u673a\u5236\u5177\u6709\u76f8\u4f3c\u6027\u3002<\/p>\n<p>\u6ce8\u610f&#xff1a;\u5f53\u5185\u6838\u4e3b\u52a8\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u5e7f\u64ad\u6d88\u606f\u65f6&#xff0c;\u8be5\u5b57\u6bb5\u7684\u503c\u6052\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           0 <\/p>\n<p>          0 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>\u3002<\/p>\n<\/li>\n<li>\n<p>nlmsg_pid&#xff1a;\u5f53\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u4e0e\u5185\u6838\u7a7a\u95f4\u5b50\u7cfb\u7edf\u901a\u8fc7 Netlink \u5efa\u7acb\u6570\u636e\u4ea4\u6362\u901a\u9053\u540e&#xff0c;Netlink \u4f1a\u4e3a\u6bcf\u4e2a\u901a\u9053\u5206\u914d\u552f\u4e00\u7684\u6570\u5b57\u6807\u8bc6&#xff0c;\u8be5\u5b57\u6bb5\u7684\u4f5c\u7528\u662f\u5c06\u7528\u6237\u7a7a\u95f4\u7684\u8bf7\u6c42\u6d88\u606f\u4e0e\u5185\u6838\u7684\u54cd\u5e94\u6d88\u606f\u8fdb\u884c\u5173\u8054&#xff0c;\u786e\u4fdd\u591a\u7ec4\u201c\u7528\u6237-\u5185\u6838\u201d\u901a\u4fe1\u8fdb\u7a0b\u4e4b\u95f4\u7684\u6570\u636e\u4ea4\u4e92\u4e0d\u4f1a\u51fa\u73b0\u7d0a\u4e71\u3002\u4f8b\u5982&#xff0c;\u5f53\u8fdb\u7a0b A\u3001B \u540c\u65f6\u901a\u8fc7 Netlink \u5411\u5b50\u7cfb\u7edf 1 \u83b7\u53d6\u4fe1\u606f\u65f6&#xff0c;\u5b50\u7cfb\u7edf 1 \u9700\u786e\u4fdd\u56de\u4f20\u7ed9\u8fdb\u7a0b A \u7684\u54cd\u5e94\u6570\u636e\u4e0d\u4f1a\u53d1\u9001\u81f3\u8fdb\u7a0b B\u3002\u8be5\u5b57\u6bb5\u901a\u5e38\u9002\u7528\u4e8e\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u4ece\u5185\u6838\u7a7a\u95f4\u83b7\u53d6\u6570\u636e\u7684\u573a\u666f&#xff0c;\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u5411\u5185\u6838\u53d1\u9001\u6d88\u606f\u65f6&#xff0c;\u4e00\u822c\u901a\u8fc7 getpid() \u7cfb\u7edf\u8c03\u7528\u5c06\u5f53\u524d\u8fdb\u7a0b\u7684\u8fdb\u7a0b\u53f7\u8d4b\u503c\u7ed9\u8be5\u5b57\u6bb5&#xff08;\u4ec5\u5f53\u9700\u8981\u83b7\u53d6\u5185\u6838\u54cd\u5e94\u65f6\u8fdb\u884c\u8be5\u64cd\u4f5c&#xff09;\u3002\u5185\u6838\u4e3b\u52a8\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u6d88\u606f\u65f6&#xff0c;\u8be5\u5b57\u6bb5\u7684\u503c\u6052\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           0 <\/p>\n<p>          0 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>\u3002<\/p>\n<\/li>\n<h4>Netlink \u7684\u6d88\u606f\u4f53<\/h4>\n<p>Netlink \u7684\u6d88\u606f\u4f53\u91c7\u7528 TLV&#xff08;Type-Length-Value&#xff09;\u683c\u5f0f\u8fdb\u884c\u7ec4\u7ec7&#xff0c;\u6bcf\u4e2a\u5c5e\u6027\u5747\u7531\u5934\u6587\u4ef6\u4e2d\u7684 struct nlattr{} \u7ed3\u6784\u4f53\u8868\u793a\u3002<\/p>\n<h4>Netlink \u63d0\u4f9b\u7684\u9519\u8bef\u6307\u793a\u6d88\u606f<\/h4>\n<p>\u5f53\u7528\u6237\u7a7a\u95f4\u5e94\u7528\u7a0b\u5e8f\u4e0e\u5185\u6838\u7a7a\u95f4\u8fdb\u7a0b\u901a\u8fc7 Netlink \u901a\u4fe1\u53d1\u751f\u9519\u8bef\u65f6&#xff0c;Netlink \u4f1a\u5411\u7528\u6237\u7a7a\u95f4\u901a\u62a5\u8be5\u9519\u8bef\u4fe1\u606f&#xff0c;\u9519\u8bef\u6d88\u606f\u91c7\u7528\u5355\u72ec\u5c01\u88c5\u7684\u5f62\u5f0f&#xff0c;\u5bf9\u5e94\u7684\u7ed3\u6784\u4f53 struct nlmsgerr \u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsgerr<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">int<\/span>    error<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6807\u51c6\u9519\u8bef\u7801&#xff0c;\u5b9a\u4e49\u5728 errno.h \u5934\u6587\u4ef6\u4e2d&#xff0c;\u53ef\u901a\u8fc7 perror() \u51fd\u6570\u89e3\u6790<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> msg<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6307\u660e\u89e6\u53d1\u8be5\u9519\u8bef\u7684\u539f\u59cb\u6d88\u606f<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>Netlink \u7f16\u7a0b\u9700\u8981\u6ce8\u610f\u7684\u95ee\u9898<\/h3>\n<p>\u57fa\u4e8e Netlink \u5b9e\u73b0\u7684\u7528\u6237-\u5185\u6838\u7a7a\u95f4\u901a\u4fe1&#xff0c;\u5b58\u5728\u4e24\u79cd\u53ef\u80fd\u5bfc\u81f4\u4e22\u5305\u7684\u573a\u666f&#xff1a;<\/p>\n<li>\u7cfb\u7edf\u5185\u5b58\u8017\u5c3d&#xff1b;<\/li>\n<li>\u7528\u6237\u7a7a\u95f4\u63a5\u6536\u8fdb\u7a0b\u7684\u7f13\u51b2\u533a\u6ea2\u51fa\u3002\u7f13\u51b2\u533a\u6ea2\u51fa\u7684\u4e3b\u8981\u8bf1\u56e0\u5305\u62ec&#xff1a;\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u8fd0\u884c\u6548\u7387\u8fc7\u4f4e&#xff0c;\u6216\u63a5\u6536\u961f\u5217\u957f\u5ea6\u8fc7\u77ed\u3002<\/li>\n<p>\u82e5 Netlink \u65e0\u6cd5\u5c06\u6d88\u606f\u6b63\u786e\u4f20\u9012\u81f3\u7528\u6237\u7a7a\u95f4\u63a5\u6536\u8fdb\u7a0b&#xff0c;\u7528\u6237\u7a7a\u95f4\u63a5\u6536\u8fdb\u7a0b\u8c03\u7528 recvmsg() \u7cfb\u7edf\u8c03\u7528\u65f6&#xff0c;\u5c06\u8fd4\u56de ENOBUFS&#xff08;\u5185\u5b58\u4e0d\u8db3&#xff09;\u9519\u8bef&#xff0c;\u8be5\u7279\u6027\u9700\u91cd\u70b9\u5173\u6ce8\u3002\u6362\u53e5\u8bdd\u8bf4&#xff0c;\u7f13\u51b2\u533a\u6ea2\u51fa\u95ee\u9898\u4e0d\u4f1a\u51fa\u73b0\u5728\u4ece\u7528\u6237\u7a7a\u95f4\u5230\u5185\u6838\u7a7a\u95f4\u7684 sendmsg() \u7cfb\u7edf\u8c03\u7528\u8fc7\u7a0b\u4e2d&#xff0c;\u5176\u539f\u56e0\u524d\u6587\u5df2\u8fdb\u884c\u9610\u8ff0&#xff0c;\u53ef\u81ea\u884c\u8fdb\u884c\u68b3\u7406\u603b\u7ed3\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u82e5\u4f7f\u7528\u963b\u585e\u578b Socket \u8fdb\u884c\u901a\u4fe1&#xff0c;\u5219\u4e0d\u5b58\u5728\u5185\u5b58\u8017\u5c3d\u7684\u6f5c\u5728\u98ce\u9669&#xff0c;\u76f8\u5173\u539f\u7406\u53ef\u901a\u8fc7\u67e5\u9605\u963b\u585e\u578b Socket \u7684\u5b98\u65b9\u6280\u672f\u6587\u6863\u8fdb\u884c\u6df1\u5165\u7406\u89e3\u3002<\/p>\n<h3>Netlink \u7684\u5730\u5740\u7ed3\u6784\u4f53<\/h3>\n<p>\u5728 TCP \u7f16\u7a0b\u76f8\u5173\u5185\u5bb9\u4e2d&#xff0c;\u66fe\u63d0\u53ca Internet \u7f16\u7a0b\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u7684\u5730\u5740\u7ed3\u6784\u4f53\u4e0e\u6807\u51c6\u5730\u5740\u7ed3\u6784\u4f53&#xff0c;\u8fd9\u4e9b\u7ed3\u6784\u4f53\u4e0e Netlink \u5730\u5740\u7ed3\u6784\u4f53\u5b58\u5728\u5bf9\u5e94\u5173\u8054\u3002<\/p>\n<p>Netlink \u5bf9\u5e94\u7684\u5730\u5740\u7ed3\u6784\u4f53 struct sockaddr_nl{} \u8be6\u7ec6\u5b9a\u4e49\u4e0e\u63cf\u8ff0\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token class-name\">sa_family_t<\/span>  nl_family<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u8be5\u5b57\u6bb5\u6052\u4e3a AF_NETLINK  *\/<\/span><br \/>\n  <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span>  nl_pad<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u76ee\u524d\u672a\u542f\u7528&#xff0c;\u586b\u5145\u4e3a 0 *\/<\/span><br \/>\n  __u32    nl_pid<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* process pid  *\/<\/span><br \/>\n  __u32    nl_groups<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* multicast groups mask *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<li>\n<p>nl_pid&#xff1a;\u8be5\u5c5e\u6027\u4e3a\u53d1\u9001\u6216\u63a5\u6536\u6d88\u606f\u7684\u8fdb\u7a0b ID\u3002\u524d\u6587\u63d0\u53ca&#xff0c;Netlink \u4e0d\u4ec5\u652f\u6301\u7528\u6237-\u5185\u6838\u7a7a\u95f4\u4e4b\u95f4\u7684\u901a\u4fe1&#xff0c;\u8fd8\u652f\u6301\u7528\u6237\u7a7a\u95f4\u4e24\u4e2a\u8fdb\u7a0b\u4e4b\u95f4\u3001\u5185\u6838\u7a7a\u95f4\u4e24\u4e2a\u8fdb\u7a0b\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u8be5\u5c5e\u6027\u503c\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           0 <\/p>\n<p>          0 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span> \u65f6&#xff0c;\u901a\u5e38\u9002\u7528\u4e8e\u4ee5\u4e0b\u4e24\u79cd\u573a\u666f&#xff1a;<\/p>\n<ul>\n<li>\u573a\u666f\u4e00&#xff1a;\u6d88\u606f\u7684\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4&#xff08;\u5373\u4ece\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u6d88\u606f\u81f3\u5185\u6838\u7a7a\u95f4&#xff09;&#xff0c;\u6b64\u65f6\u6784\u9020\u7684 Netlink \u5730\u5740\u7ed3\u6784\u4f53\u4e2d&#xff0c;nl_pid \u5b57\u6bb5\u901a\u5e38\u7f6e\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>            0 <\/p>\n<p>           0 <\/p>\n<p>       <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>\u3002\u9700\u8981\u8865\u5145\u8bf4\u660e\u7684\u662f&#xff0c;\u5728 Netlink \u89c4\u8303\u4e2d&#xff0c;PID \u7684\u5168\u79f0\u4e3a Port-ID&#xff08;<span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>            32 <\/p>\n<p>           32 <\/p>\n<p>       <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> bits&#xff09;&#xff0c;\u5176\u4f5c\u7528\u662f\u552f\u4e00\u6807\u8bc6\u4e00\u4e2a\u57fa\u4e8e Netlink \u7684 Socket \u901a\u9053\u3002\u901a\u5e38\u60c5\u51b5\u4e0b&#xff0c;nl_pid \u5b57\u6bb5\u4f1a\u88ab\u8bbe\u7f6e\u4e3a\u5f53\u524d\u8fdb\u7a0b\u7684\u8fdb\u7a0b\u53f7&#xff1b;\u4f46\u5f53\u4e00\u4e2a\u8fdb\u7a0b\u7684\u591a\u4e2a\u7ebf\u7a0b\u540c\u65f6\u4f7f\u7528 Netlink Socket \u65f6&#xff0c;nl_pid \u5b57\u6bb5\u901a\u5e38\u91c7\u7528\u5982\u4e0b\u65b9\u5f0f\u8fdb\u884c\u8bbe\u7f6e&#xff1a;<span class=\"token function\">pthread_self<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token number\">16<\/span> <span class=\"token operator\">|<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\n <\/li>\n<li>\u573a\u666f\u4e8c&#xff1a;\u5185\u6838\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u591a\u64ad\u62a5\u6587\u65f6&#xff0c;\u82e5\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u5df2\u52a0\u5165\u5bf9\u5e94\u591a\u64ad\u7ec4&#xff0c;\u5176\u5730\u5740\u7ed3\u6784\u4f53\u4e2d\u7684 nl_pid \u5b57\u6bb5\u540c\u6837\u7f6e\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>            0 <\/p>\n<p>           0 <\/p>\n<p>       <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u540c\u65f6\u9700\u7ed3\u5408\u4e0b\u8ff0 nl_groups \u5b57\u6bb5\u8fdb\u884c\u914d\u7f6e\u3002<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>nl_groups&#xff1a;\u82e5\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u5e0c\u671b\u52a0\u5165\u67d0\u4e2a\u591a\u64ad\u7ec4&#xff0c;\u5fc5\u987b\u6267\u884c bind() \u7cfb\u7edf\u8c03\u7528\u3002\u8be5\u5b57\u6bb5\u6307\u660e\u4e86\u8c03\u7528\u8005\u5e0c\u671b\u52a0\u5165\u7684\u591a\u64ad\u7ec4\u53f7\u7684\u63a9\u7801&#xff08;\u6ce8\u610f&#xff1a;\u5e76\u975e\u7ec4\u53f7&#xff0c;\u5176\u8be6\u7ec6\u7528\u6cd5\u5c06\u5728\u540e\u7eed\u5185\u5bb9\u4e2d\u9610\u8ff0&#xff09;\u3002\u82e5\u8be5\u5b57\u6bb5\u503c\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           0 <\/p>\n<p>          0 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u8868\u660e\u8c03\u7528\u8005\u4e0d\u5e0c\u671b\u52a0\u5165\u4efb\u4f55\u591a\u64ad\u7ec4\u3002\u5bf9\u4e8e\u6bcf\u4e2a\u96b6\u5c5e\u4e8e Netlink \u534f\u8bae\u57df\u7684\u534f\u8bae&#xff0c;\u6700\u591a\u652f\u6301 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           32 <\/p>\n<p>          32 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u4e2a\u591a\u64ad\u7ec4&#xff08;\u56e0 nl_groups \u5b57\u6bb5\u957f\u5ea6\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>           32 <\/p>\n<p>          32 <\/p>\n<p>      <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u6bd4\u7279&#xff09;&#xff0c;\u6bcf\u4e2a\u591a\u64ad\u7ec4\u7531\u4e00\u4e2a\u72ec\u7acb\u7684\u6bd4\u7279\u4f4d\u8868\u793a\u3002<\/p>\n<\/li>\n<p>\u5173\u4e8e Netlink \u7684\u5176\u4f59\u77e5\u8bc6\u70b9&#xff0c;\u5c06\u5728\u540e\u7eed\u5b9e\u6218\u73af\u8282\u4e2d\u7ed3\u5408\u5177\u4f53\u5e94\u7528\u573a\u666f\u8fdb\u884c\u9610\u8ff0\u3002<\/p>\n<hr \/>\n<h2>\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e2d&#xff09;<\/h2>\n<p>wjlkoorey258 2012-11-12 19:42:22<\/p>\n<p>\u672c\u8282\u5c06\u901a\u8fc7\u5b9e\u9645\u7f16\u7a0b\u6f14\u7ec3&#xff0c;\u5c55\u793a Netlink \u673a\u5236\u5982\u4f55\u5b9e\u73b0\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u4e4b\u95f4\u7684\u6570\u636e\u901a\u4fe1&#xff0c;\u6240\u6709\u5b9e\u9a8c\u5747\u57fa\u4e8e\u5185\u6838 2.6.21 \u7248\u672c\u73af\u5883\u5b8c\u6210\u3002<\/p>\n<p>\u5bf9\u5e94\u7684\u5185\u6838\u5934\u6587\u4ef6\u4e2d\u5305\u542b\u4e86 Netlink \u534f\u8bae\u7c07\u9884\u5b9a\u4e49\u7684\u5404\u7c7b\u534f\u8bae&#xff0c;\u5177\u4f53\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ROUTE<\/span>    <span class=\"token expression\"><span class=\"token number\">0<\/span>  <\/span><span class=\"token comment\">\/* Routing\/device hook        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_UNUSED<\/span>    <span class=\"token expression\"><span class=\"token number\">1<\/span>  <\/span><span class=\"token comment\">\/* Unused number        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_USERSOCK<\/span>  <span class=\"token expression\"><span class=\"token number\">2<\/span>  <\/span><span class=\"token comment\">\/* Reserved for user mode socket protocols   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIREWALL<\/span>  <span class=\"token expression\"><span class=\"token number\">3<\/span>  <\/span><span class=\"token comment\">\/* Firewalling hook        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_INET_DIAG<\/span>  <span class=\"token expression\"><span class=\"token number\">4<\/span>  <\/span><span class=\"token comment\">\/* INET socket monitoring      *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NFLOG<\/span>    <span class=\"token expression\"><span class=\"token number\">5<\/span>  <\/span><span class=\"token comment\">\/* netfilter\/iptables ULOG *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_XFRM<\/span>    <span class=\"token expression\"><span class=\"token number\">6<\/span>  <\/span><span class=\"token comment\">\/* ipsec *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SELINUX<\/span>    <span class=\"token expression\"><span class=\"token number\">7<\/span>  <\/span><span class=\"token comment\">\/* SELinux event notifications *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ISCSI<\/span>    <span class=\"token expression\"><span class=\"token number\">8<\/span>  <\/span><span class=\"token comment\">\/* Open-iSCSI *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_AUDIT<\/span>    <span class=\"token expression\"><span class=\"token number\">9<\/span>  <\/span><span class=\"token comment\">\/* auditing *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIB_LOOKUP<\/span>  <span class=\"token expression\"><span class=\"token number\">10<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CONNECTOR<\/span>  <span class=\"token expression\"><span class=\"token number\">11<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NETFILTER<\/span>  <span class=\"token expression\"><span class=\"token number\">12<\/span>  <\/span><span class=\"token comment\">\/* netfilter subsystem *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_IP6_FW<\/span>    <span class=\"token expression\"><span class=\"token number\">13<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_DNRTMSG<\/span>    <span class=\"token expression\"><span class=\"token number\">14<\/span>  <\/span><span class=\"token comment\">\/* DECnet routing messages *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_KOBJECT_UEVENT<\/span>  <span class=\"token expression\"><span class=\"token number\">15<\/span>  <\/span><span class=\"token comment\">\/* Kernel messages to userspace *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_GENERIC<\/span>    <span class=\"token expression\"><span class=\"token number\">16<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* leave room for NETLINK_DM (DM Events) *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SCSITRANSPORT<\/span>  <span class=\"token expression\"><span class=\"token number\">18<\/span>  <\/span><span class=\"token comment\">\/* SCSI Transports *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ECRYPTFS<\/span>  <span class=\"token expression\"><span class=\"token number\">19<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_TEST<\/span>   <span class=\"token expression\"><span class=\"token number\">20<\/span>  <\/span><span class=\"token comment\">\/* \u7528\u6237\u6dfb\u52a0\u7684\u81ea\u5b9a\u4e49\u534f\u8bae *\/<\/span><\/span><\/p>\n<p>\u82e5\u9700\u5728 Netlink \u534f\u8bae\u7c07\u4e2d\u5f00\u53d1\u81ea\u5b9a\u4e49\u534f\u8bae&#xff0c;\u4ec5\u9700\u5728\u8be5\u6587\u4ef6\u4e2d\u5b9a\u4e49\u5bf9\u5e94\u7684\u534f\u8bae\u53f7\u5373\u53ef&#xff0c;\u4f8b\u5982\u4e0a\u8ff0\u4ee3\u7801\u4e2d\u5b9a\u4e49\u7684\u534f\u8bae\u53f7\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         20 <\/p>\n<p>        20 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">20<\/span><\/span><\/span><\/span><\/span> \u7684\u81ea\u5b9a\u4e49\u534f\u8bae NETLINK_TEST\u3002\u540c\u65f6&#xff0c;\u9700\u8981\u5bf9\u5185\u6838\u5934\u6587\u4ef6\u76ee\u5f55\u4e2d\u7684 netlink.h \u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539&#xff0c;\u5728\u672c\u6b21\u5b9e\u9a8c\u73af\u5883\u4e2d&#xff0c;\u8be5\u6587\u4ef6\u7684\u8def\u5f84\u4e3a&#xff1a;\/usr\/src\/linux-2.6.21\/include\/linux\/netlink.h\u3002<\/p>\n<p>\u5b8c\u6210\u4e0a\u8ff0\u914d\u7f6e\u540e&#xff0c;\u5373\u53ef\u5728\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u6a21\u5757\u7684\u5f00\u53d1\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8be5\u81ea\u5b9a\u4e49\u534f\u8bae&#xff0c;\u6574\u4e2a\u5b9e\u9a8c\u5206\u4e3a\u4e09\u4e2a\u9636\u6bb5\u8fdb\u884c\u3002<\/p>\n<h3>Stage 1&#xff1a;\u7528\u6237-&gt;\u5185\u6838\u5355\u5411\u6570\u636e\u901a\u4fe1<\/h3>\n<p>\u672c\u9636\u6bb5\u5b9e\u73b0\u7684\u529f\u80fd\u4e3a\u7528\u6237\u7a7a\u95f4\u5230\u5185\u6838\u7a7a\u95f4\u7684\u5355\u5411\u6570\u636e\u901a\u4fe1&#xff0c;\u5373\u7528\u6237\u7a7a\u95f4\u5411\u5185\u6838\u53d1\u9001\u4e00\u6761\u6d88\u606f&#xff0c;\u5185\u6838\u63a5\u6536\u8be5\u6d88\u606f\u5e76\u5c06\u5176\u6253\u5370\u8f93\u51fa&#xff0c;\u5177\u4f53\u5b9e\u73b0\u5982\u4e0b\u3002<\/p>\n<h4>\u7528\u6237\u7a7a\u95f4\u793a\u4f8b\u4ee3\u7801\u3010mynlusr.c\u3011<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;asm\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/socket.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PAYLOAD<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/* \u6d88\u606f\u6700\u5927\u8d1f\u8f7d\u4e3a 1024 \u5b57\u8282 *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> dest_addr<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u521b\u5efa\u5957\u63a5\u5b57<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>PF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span>NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can&#039;t create netlink socket!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u6d88\u606f\u7684\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4 *\/<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u672c\u793a\u4f8b\u4e2d\u65e0\u9700\u4f7f\u7528\u8be5\u5b57\u6bb5 *\/<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u5c06\u5957\u63a5\u5b57\u548c Netlink \u5730\u5740\u7ed3\u6784\u4f53\u8fdb\u884c\u7ed1\u5b9a<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can&#039;t bind sockfd with sockaddr_nl!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>nlh<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;alloc mem failed!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/* \u586b\u5145 Netlink \u6d88\u606f\u5934\u90e8 *\/<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;<\/span> NLMSG_NOOP<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6807\u8bc6\u8be5 Netlink \u6d88\u606f\u8d1f\u8f7d\u4e3a\u4e00\u6761\u7a7a\u6d88\u606f<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u8bbe\u7f6e Netlink \u7684\u6d88\u606f\u5185\u5bb9&#xff0c;\u6570\u636e\u6765\u81ea\u547d\u4ee4\u884c\u8f93\u5165\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570 *\/<\/span><br \/>\n  <span class=\"token function\">strcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u6b64\u4e3a\u56fa\u5b9a\u4f7f\u7528\u6a21\u677f&#xff0c;\u5176\u8be6\u7ec6\u539f\u7406\u5c06\u5728\u540e\u7eed Socket \u6df1\u5165\u8bb2\u89e3\u4e2d\u9610\u8ff0 *\/<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>iov<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_base <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_len <span class=\"token operator\">&#061;<\/span> nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u901a\u8fc7 Netlink socket \u5411\u5185\u6838\u53d1\u9001\u6d88\u606f<\/span><br \/>\n  <span class=\"token function\">sendmsg<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u5173\u95ed netlink \u5957\u63a5\u5b57 *\/<\/span><br \/>\n  <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u4e0a\u8ff0\u4ee3\u7801\u7684\u903b\u8f91\u57fa\u4e8e\u6807\u51c6 Socket \u7f16\u7a0b API \u5b9e\u73b0&#xff0c;\u552f\u4e00\u7684\u5dee\u5f02\u5728\u4e8e\u672c\u6b21\u7f16\u7a0b\u9488\u5bf9 Netlink \u534f\u8bae\u7c07\u8fdb\u884c\u3002\u6b64\u5904\u63d0\u524d\u5f15\u5165\u4e86 BSD \u5c42\u7684\u6d88\u606f\u7ed3\u6784\u4f53 struct msghdr{}&#xff08;\u5b9a\u4e49\u5728\u5bf9\u5e94\u5934\u6587\u4ef6\u4e2d&#xff09;\u4e0e\u6570\u636e\u5757\u7ed3\u6784\u4f53 struct iovec{}&#xff08;\u5b9a\u4e49\u5728\u5bf9\u5e94\u5934\u6587\u4ef6\u4e2d&#xff09;&#xff0c;\u5176\u8be6\u7ec6\u539f\u7406\u5c06\u5728\u540e\u7eed Socket \u6df1\u5165\u8bb2\u89e3\u4e2d\u9610\u8ff0&#xff0c;\u5f53\u524d\u4ec5\u9700\u638c\u63e1\u5176\u56fa\u5b9a\u4f7f\u7528\u65b9\u5f0f\u3002<\/p>\n<p>\u6b64\u5916&#xff0c;\u9700\u8981\u91cd\u70b9\u5173\u6ce8 Netlink \u5730\u5740\u7ed3\u6784\u4f53\u4e0e\u6d88\u606f\u5934\u7ed3\u6784\u4f53\u4e2d pid \u5b57\u6bb5\u503c\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         0 <\/p>\n<p>        0 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span> \u7684\u573a\u666f&#xff0c;\u907f\u514d\u51fa\u73b0\u6982\u5ff5\u6df7\u6dc6&#xff0c;\u76f8\u5173\u603b\u7ed3\u5982\u4e0b\u8868\u6240\u793a&#xff1a;<\/p>\n<table>\n<tr>\u5b57\u6bb5\u503c\u4e3a 0 \u7684\u9002\u7528\u573a\u666f<\/tr>\n<tbody>\n<tr>\n<td align=\"left\">netlink \u5730\u5740\u7ed3\u6784\u4f53.nl_pid<\/td>\n<td align=\"left\">1\u3001\u5185\u6838\u53d1\u51fa\u7684\u591a\u64ad\u62a5\u6587&#xff1b;2\u3001\u6d88\u606f\u7684\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4&#xff08;\u5373\u4ece\u7528\u6237\u7a7a\u95f4\u53d1\u5f80\u5185\u6838\u7a7a\u95f4\u7684\u6d88\u606f&#xff09;<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">netlink \u6d88\u606f\u5934\u7ed3\u6784\u4f53.nlmsg_pid<\/td>\n<td align=\"left\">\u5185\u6838\u4e3b\u52a8\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u7684\u6d88\u606f<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u672c\u793a\u4f8b\u5b9e\u73b0\u7684\u662f\u4ece\u7528\u6237\u7a7a\u95f4\u5230\u5185\u6838\u7a7a\u95f4\u7684\u5355\u5411\u6570\u636e\u901a\u4fe1&#xff0c;\u56e0\u6b64\u5728 Netlink \u5730\u5740\u7ed3\u6784\u4f53\u4e2d\u8bbe\u7f6e dest_addr.nl_pid &#061; 0&#xff08;\u6807\u8bc6\u6d88\u606f\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4&#xff09;&#xff0c;\u5728\u586b\u5145 Netlink \u6d88\u606f\u5934\u90e8\u65f6\u8bbe\u7f6e nlh-&gt;nlmsg_pid &#061; 0\u3002<\/p>\n<p>\u540c\u65f6&#xff0c;\u9700\u8981\u638c\u63e1\u4ee5\u4e0b\u4e24\u4e2a\u5b8f\u7684\u4f7f\u7528\u65b9\u6cd5&#xff1a;<\/p>\n<li>NLMSG_SPACE(MAX_PAYLOAD)&#xff1a;\u8be5\u5b8f\u7528\u4e8e\u8fd4\u56de\u4e0d\u5c0f\u4e8e MAX_PAYLOAD \u4e14\u6ee1\u8db3 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>          4 <\/p>\n<p>         4 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">4<\/span><\/span><\/span><\/span><\/span> \u5b57\u8282\u5bf9\u9f50\u7684\u6700\u5c0f\u957f\u5ea6\u503c&#xff0c;\u901a\u5e38\u7528\u4e8e\u5185\u5b58\u7533\u8bf7\u65f6\u6307\u5b9a\u6240\u9700\u7684\u5185\u5b58\u5b57\u8282\u6570\u3002\u4e0e NLMSG_LENGTH(len) \u7684\u5dee\u5f02\u5728\u4e8e&#xff1a;\u524d\u8005\u7533\u8bf7\u7684\u7a7a\u95f4\u4e0d\u5305\u542b Netlink \u6d88\u606f\u5934\u90e8\u6240\u5360\u5b57\u8282\u6570&#xff0c;\u540e\u8005\u4e3a\u6d88\u606f\u8d1f\u8f7d\u4e0e\u6d88\u606f\u5934\u7684\u603b\u957f\u5ea6\u3002<\/li>\n<li>NLMSG_DATA(nlh)&#xff1a;\u8be5\u5b8f\u7528\u4e8e\u8fd4\u56de Netlink \u6d88\u606f\u4e2d\u6570\u636e\u90e8\u5206\u7684\u9996\u5730\u5740&#xff0c;\u5728\u5199\u5165\u4e0e\u8bfb\u53d6\u6d88\u606f\u6570\u636e\u90e8\u5206\u65f6\u4f1a\u9891\u7e41\u4f7f\u7528\u3002<\/li>\n<h4>\u5185\u6838\u7a7a\u95f4\u793a\u4f8b\u4ee3\u7801\u3010mynlkern.c\u3011<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/kernel.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/module.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/skbuff.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/init.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/ip.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/sched.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/sock.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token function\">MODULE_LICENSE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;GPL&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">MODULE_AUTHOR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Koorey King&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">nl_data_ready<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">skb_dequeue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>sk<span class=\"token operator\">-&gt;<\/span>sk_receive_queue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><br \/>\n  <span class=\"token punctuation\">{<\/span><br \/>\n nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>skb<span class=\"token operator\">-&gt;<\/span>data<span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s: received netlink message payload: %s \\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> __FUNCTION__<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">kfree_skb<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recvied finished!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> __init <span class=\"token function\">myinit_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink in\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span>NETLINK_TEST<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>nl_data_ready<span class=\"token punctuation\">,<\/span>THIS_MODULE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> __exit <span class=\"token function\">mycleanup_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink out!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">sock_release<\/span><span class=\"token punctuation\">(<\/span>nl_sk<span class=\"token operator\">-&gt;<\/span>sk_socket<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">module_init<\/span><span class=\"token punctuation\">(<\/span>myinit_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">module_exit<\/span><span class=\"token punctuation\">(<\/span>mycleanup_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5728\u5185\u6838\u6a21\u5757\u7684\u521d\u59cb\u5316\u51fd\u6570\u4e2d&#xff0c;\u901a\u8fc7 netlink_kernel_create(NETLINK_TEST,0,nl_data_ready,THIS_MODULE) \u51fd\u6570\u521b\u5efa\u4e86\u4e00\u4e2a\u5185\u6838\u6001 Socket&#xff0c;\u8be5\u51fd\u6570\u5404\u53c2\u6570\u7684\u542b\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<li>\u7b2c\u4e00\u4e2a\u53c2\u6570&#xff1a;\u81ea\u5b9a\u4e49\u534f\u8bae\u7684\u534f\u8bae\u53f7&#xff08;\u672c\u6b21\u5b9e\u9a8c\u4e3a NETLINK_TEST&#xff09;&#xff1b;<\/li>\n<li>\u7b2c\u4e8c\u4e2a\u53c2\u6570&#xff1a;\u591a\u64ad\u7ec4\u53f7&#xff0c;\u672c\u9636\u6bb5\u5b9e\u9a8c\u65e0\u9700\u4f7f\u7528&#xff0c;\u7f6e\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>          0 <\/p>\n<p>         0 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>&#xff1b;<\/li>\n<li>\u7b2c\u4e09\u4e2a\u53c2\u6570&#xff1a;\u56de\u8c03\u51fd\u6570&#xff0c;\u5f53\u5185\u6838\u7684 Netlink Socket \u63a5\u6536\u5230\u6570\u636e\u65f6&#xff0c;\u5c06\u89e6\u53d1\u8be5\u51fd\u6570\u8fdb\u884c\u6570\u636e\u5904\u7406&#xff1b;<\/li>\n<li>\u7b2c\u56db\u4e2a\u53c2\u6570&#xff1a;\u5185\u6838\u6a21\u5757\u6807\u8bc6&#xff0c;\u4f7f\u7528 THIS_MODULE \u5373\u53ef\u3002<\/li>\n<p>\u5728\u56de\u8c03\u51fd\u6570 nl_data_ready() \u4e2d&#xff0c;\u901a\u8fc7\u5faa\u73af\u4ece Socket \u7684\u63a5\u6536\u961f\u5217\u4e2d\u83b7\u53d6\u6570\u636e&#xff0c;\u83b7\u53d6\u5230\u6570\u636e\u540e\u5c06\u5176\u6253\u5370\u8f93\u51fa&#xff0c;\u5e76\u91ca\u653e\u5bf9\u5e94\u7684\u7f13\u51b2\u533a\u8d44\u6e90\u3002\u5728\u534f\u8bae\u6808\u7684 INET \u5c42\u4e2d&#xff0c;\u6570\u636e\u7684\u5b58\u50a8\u4f9d\u8d56 sk_buff \u7ed3\u6784\u4f53\u5b9e\u73b0&#xff0c;\u56e0\u6b64\u53ef\u901a\u8fc7 nlh &#061; (struct nlmsghdr *)skb-&gt;data \u83b7\u53d6 Netlink \u6d88\u606f\u4f53&#xff0c;\u518d\u901a\u8fc7 NLMSG_DATA(nlh) \u5b9a\u4f4d\u5230 Netlink \u6d88\u606f\u7684\u8d1f\u8f7d\u6570\u636e\u3002<\/p>\n<p>\u5c06\u4e0a\u8ff0\u4ee3\u7801\u7f16\u8bd1\u540e&#xff0c;\u5373\u53ef\u8fdb\u884c\u6d4b\u8bd5\u9a8c\u8bc1&#xff0c;\u83b7\u53d6\u5bf9\u5e94\u7684\u8fd0\u884c\u7ed3\u679c\u3002<\/p>\n<h3>Stage 2&#xff1a;\u7528\u6237&lt;-&gt;\u5185\u6838\u53cc\u5411\u6570\u636e\u901a\u4fe1<\/h3>\n<p>\u5bf9 Stage 1 \u4e2d\u7684\u4ee3\u7801\u8fdb\u884c\u5c0f\u5e45\u4fee\u6539&#xff0c;\u5373\u53ef\u5b9e\u73b0\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u4e4b\u95f4\u7684\u53cc\u5411\u6570\u636e\u901a\u4fe1&#xff0c;\u5177\u4f53\u4fee\u6539\u5982\u4e0b\u3002<\/p>\n<h4>\u7528\u6237\u7a7a\u95f4\u4ee3\u7801\u4fee\u6539<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;asm\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/socket.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PAYLOAD<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/* \u6d88\u606f\u6700\u5927\u8d1f\u8f7d\u4e3a 1024 \u5b57\u8282 *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> dest_addr<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>PF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span>NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can&#039;t create netlink socket!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u6d88\u606f\u7684\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4 *\/<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u672c\u793a\u4f8b\u4e2d\u65e0\u9700\u4f7f\u7528\u8be5\u5b57\u6bb5 *\/<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can&#039;t bind sockfd with sockaddr_nl!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>nlh<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;alloc mem failed!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/* \u586b\u5145 Netlink \u6d88\u606f\u5934\u90e8 *\/<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5e0c\u671b\u83b7\u53d6\u5185\u6838\u54cd\u5e94&#xff0c;\u56e0\u6b64\u8bbe\u7f6e\u5f53\u524d\u8fdb\u7a0b ID \u4f9b\u5185\u6838\u8bc6\u522b<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;<\/span> NLMSG_NOOP<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6807\u8bc6\u8be5 Netlink \u6d88\u606f\u8d1f\u8f7d\u4e3a\u4e00\u6761\u7a7a\u6d88\u606f<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u8bbe\u7f6e Netlink \u7684\u6d88\u606f\u5185\u5bb9&#xff0c;\u6570\u636e\u6765\u81ea\u547d\u4ee4\u884c\u8f93\u5165\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570 *\/<\/span><br \/>\n  <span class=\"token function\">strcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u6b64\u4e3a\u56fa\u5b9a\u4f7f\u7528\u6a21\u677f&#xff0c;\u5176\u8be6\u7ec6\u539f\u7406\u5c06\u5728\u540e\u7eed Socket \u6df1\u5165\u8bb2\u89e3\u4e2d\u9610\u8ff0 *\/<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>iov<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_base <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_len <span class=\"token operator\">&#061;<\/span> nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u901a\u8fc7 Netlink socket \u5411\u5185\u6838\u53d1\u9001\u6d88\u606f<\/span><br \/>\n  <span class=\"token function\">sendmsg<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u63a5\u6536\u5185\u6838\u8fd4\u56de\u7684\u54cd\u5e94\u6d88\u606f<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;waiting message from kernel!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">1024<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">recvmsg<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Got response: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u5173\u95ed netlink \u5957\u63a5\u5b57 *\/<\/span><br \/>\n  <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u5185\u6838\u7a7a\u95f4\u4ee3\u7801\u4fee\u6539<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/kernel.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/module.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/skbuff.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/init.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/ip.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/sched.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/sock.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/netlink.h&gt;<\/span> <span class=\"token comment\">\/* \u8be5\u5934\u6587\u4ef6\u5305\u542b\u4e86 linux\/netlink.h&#xff0c;\u540c\u65f6\u63d0\u4f9b nlmsg_put() \u7b49 API \u51fd\u6570 *\/<\/span><\/span><\/p>\n<p><span class=\"token function\">MODULE_LICENSE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;GPL&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">MODULE_AUTHOR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Koorey King&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_MSGSIZE<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/* \u6d88\u606f\u6700\u5927\u957f\u5ea6\u4e3a 1024 \u5b57\u8282 *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u6d88\u606f\u7684\u63a5\u53e3\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">sendnlmsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>message<span class=\"token punctuation\">,<\/span><span class=\"token keyword\">int<\/span> dstPID<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_MSGSIZE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> slen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>message <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>nl_sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4e3a\u65b0\u7684 sk_buffer \u7533\u8bf7\u7a7a\u95f4<\/span><br \/>\n  skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">alloc_skb<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">,<\/span> GFP_KERNEL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span>KERN_ERR <span class=\"token string\">&#034;my_net_link: alloc_skb Error.\/n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  slen <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u7528 nlmsg_put() \u6765\u8bbe\u7f6e netlink \u6d88\u606f\u5934\u90e8<\/span><br \/>\n  nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_put<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> MAX_MSGSIZE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u8bbe\u7f6e Netlink \u7684\u63a7\u5236\u5757<\/span><br \/>\n  <span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6d88\u606f\u53d1\u9001\u8005\u4e3a\u5185\u6838\u7a7a\u95f4&#xff0c;\u7f6e\u4e3a 0<\/span><br \/>\n  <span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>dst_group <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u76ee\u7684\u4e3a\u5355\u4e2a\u8fdb\u7a0b&#xff0c;\u8be5\u5b57\u6bb5\u7f6e\u4e3a 0<\/span><\/p>\n<p>  message<span class=\"token punctuation\">[<\/span>slen<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">,<\/span> slen<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u901a\u8fc7 netlink_unicast() \u5c06\u6d88\u606f\u53d1\u9001\u81f3\u7528\u6237\u7a7a\u95f4\u6307\u5b9a PID \u7684\u8fdb\u7a0b<\/span><br \/>\n  <span class=\"token function\">netlink_unicast<\/span><span class=\"token punctuation\">(<\/span>nl_sk<span class=\"token punctuation\">,<\/span>skb<span class=\"token punctuation\">,<\/span>dstPID<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send OK!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">nl_data_ready<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">skb_dequeue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>sk<span class=\"token operator\">-&gt;<\/span>sk_receive_queue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><br \/>\n  <span class=\"token punctuation\">{<\/span><br \/>\n nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>skb<span class=\"token operator\">-&gt;<\/span>data<span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s: received netlink message payload: %s \\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> __FUNCTION__<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">kfree_skb<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token comment\">\/\/ \u63d0\u53d6\u7528\u6237\u8fdb\u7a0b PID&#xff0c;\u5411\u5176\u53d1\u9001\u54cd\u5e94\u6d88\u606f<\/span><br \/>\n <span class=\"token function\">sendnlmsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;I see you&#034;<\/span><span class=\"token punctuation\">,<\/span>nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_pid<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recvied finished!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> __init <span class=\"token function\">myinit_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink in\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span>NETLINK_TEST<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>nl_data_ready<span class=\"token punctuation\">,<\/span>THIS_MODULE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> __exit <span class=\"token function\">mycleanup_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink out!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">sock_release<\/span><span class=\"token punctuation\">(<\/span>nl_sk<span class=\"token operator\">-&gt;<\/span>sk_socket<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">module_init<\/span><span class=\"token punctuation\">(<\/span>myinit_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">module_exit<\/span><span class=\"token punctuation\">(<\/span>mycleanup_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5c06\u4fee\u6539\u540e\u7684\u4ee3\u7801\u91cd\u65b0\u7f16\u8bd1\u540e&#xff0c;\u5373\u53ef\u8fdb\u884c\u6d4b\u8bd5\u9a8c\u8bc1&#xff0c;\u83b7\u53d6\u5bf9\u5e94\u7684\u53cc\u5411\u901a\u4fe1\u8fd0\u884c\u7ed3\u679c\u3002<\/p>\n<h3>Stage 3&#xff1a;\u65e0 bind() \u8c03\u7528\u7684\u53cc\u5411\u6570\u636e\u901a\u4fe1<\/h3>\n<p>\u524d\u6587\u63d0\u53ca&#xff0c;\u7528\u6237\u8fdb\u7a0b\u4ec5\u5728\u9700\u8981\u52a0\u5165\u591a\u64ad\u7ec4\u65f6\u624d\u9700\u8981\u8c03\u7528 bind() \u51fd\u6570\u3002Stage 2 \u4e2d\u65e0\u591a\u64ad\u7ec4\u76f8\u5173\u9700\u6c42&#xff0c;\u5374\u8c03\u7528\u4e86 bind() \u51fd\u6570&#xff0c;\u672c\u6b21\u5c06\u5bf9\u4ee3\u7801\u8fdb\u884c\u4fee\u6539&#xff0c;\u79fb\u9664 bind() \u8c03\u7528&#xff0c;\u6539\u7528 sendto() \u4e0e recvfrom() \u51fd\u6570\u5b9e\u73b0\u6570\u636e\u7684\u6536\u53d1\u3002<\/p>\n<h4>\u7528\u6237\u7a7a\u95f4\u4ee3\u7801\u4fee\u6539<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;asm\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/socket.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PAYLOAD<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/* \u6d88\u606f\u6700\u5927\u8d1f\u8f7d\u4e3a 1024 \u5b57\u8282 *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> dest_addr<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/\/ struct iovec iov; \/\/ \u65e0\u9700\u4f7f\u7528\u8be5\u7ed3\u6784\u4f53<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/\/ struct msghdr msg; \/\/ \u65e0\u9700\u4f7f\u7528\u8be5\u7ed3\u6784\u4f53<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token operator\">&#061;<\/span><span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>PF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span>NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can&#039;t create netlink socket!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u6d88\u606f\u7684\u63a5\u6536\u65b9\u4e3a\u5185\u6838\u7a7a\u95f4 *\/<\/span><br \/>\n  dest_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u672c\u793a\u4f8b\u4e2d\u65e0\u9700\u4f7f\u7528\u8be5\u5b57\u6bb5 *\/<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u79fb\u9664 bind() \u51fd\u6570\u8c03\u7528 *\/<\/span><br \/>\n  <span class=\"token comment\">\/*<br \/>\n  if(-1 &#061;&#061; bind(sock_fd, (struct sockaddr*)&amp;dest_addr, sizeof(dest_addr))){<br \/>\n perror(&#034;can&#039;t bind sockfd with sockaddr_nl!&#034;);<br \/>\n return 1;<br \/>\n  }<br \/>\n  *\/<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token constant\">NULL<\/span> <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token punctuation\">(<\/span>nlh<span class=\"token operator\">&#061;<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;alloc mem failed!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token comment\">\/* \u586b\u5145 Netlink \u6d88\u606f\u5934\u90e8 *\/<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><span class=\"token comment\">\/\/ \u5e0c\u671b\u83b7\u53d6\u5185\u6838\u54cd\u5e94&#xff0c;\u56e0\u6b64\u8bbe\u7f6e\u5f53\u524d\u8fdb\u7a0b ID \u4f9b\u5185\u6838\u8bc6\u522b<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;<\/span> NLMSG_NOOP<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6807\u8bc6\u8be5 Netlink \u6d88\u606f\u8d1f\u8f7d\u4e3a\u4e00\u6761\u7a7a\u6d88\u606f<\/span><br \/>\n  nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u8bbe\u7f6e Netlink \u7684\u6d88\u606f\u5185\u5bb9&#xff0c;\u6570\u636e\u6765\u81ea\u547d\u4ee4\u884c\u8f93\u5165\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570 *\/<\/span><br \/>\n  <span class=\"token function\">strcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u8be5\u6a21\u677f\u65e0\u9700\u4f7f\u7528 *\/<\/span><br \/>\n  <span class=\"token comment\">\/*<br \/>\n  memset(&amp;iov, 0, sizeof(iov));<br \/>\n  iov.iov_base &#061; (void *)nlh;<br \/>\n  iov.iov_len &#061; nlh-&gt;nlmsg_len;<br \/>\n  memset(&amp;msg, 0, sizeof(msg));<br \/>\n  msg.msg_iov &#061; &amp;iov;<br \/>\n  msg.msg_iovlen &#061; 1;<br \/>\n  *\/<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u6539\u7528 sendto() \u51fd\u6570\u5411\u5185\u6838\u53d1\u9001\u6d88\u606f<\/span><br \/>\n  <span class=\"token comment\">\/\/ sendmsg(sock_fd, &amp;msg, 0);<\/span><br \/>\n  <span class=\"token function\">sendto<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token function\">NLMSG_LENGTH<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u63a5\u6536\u5185\u6838\u8fd4\u56de\u7684\u54cd\u5e94\u6d88\u606f&#xff0c;\u6539\u7528 recvfrom() \u51fd\u6570<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;waiting message from kernel!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6e05\u7a7a\u6574\u4e2a Netlink \u6d88\u606f&#xff08;\u5305\u542b\u6d88\u606f\u5934\u4e0e\u8d1f\u8f7d&#xff09;<\/span><br \/>\n  <span class=\"token comment\">\/\/ recvmsg(sock_fd,&amp;msg,0);<\/span><br \/>\n  <span class=\"token function\">recvfrom<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span>nlh<span class=\"token punctuation\">,<\/span><span class=\"token function\">NLMSG_LENGTH<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Got response: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/* \u5173\u95ed netlink \u5957\u63a5\u5b57 *\/<\/span><br \/>\n  <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u8bf4\u660e<\/h4>\n<p>\u5185\u6838\u7a7a\u95f4\u7684\u4ee3\u7801\u65e0\u9700\u8fdb\u884c\u4efb\u4f55\u4fee\u6539&#xff0c;\u4ecd\u901a\u8fc7 netlink_unicast() \u51fd\u6570\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u54cd\u5e94\u6d88\u606f\u3002\u5c06\u4fee\u6539\u540e\u7684\u4ee3\u7801\u91cd\u65b0\u7f16\u8bd1\u540e&#xff0c;\u5176\u8fd0\u884c\u6548\u679c\u4e0e Stage 2 \u5b8c\u5168\u4e00\u81f4\u3002<\/p>\n<p>\u7531\u6b64\u53ef\u5f97\u7ed3\u8bba&#xff1a;\u5728 Netlink \u7a0b\u5e8f\u5f00\u53d1\u8fc7\u7a0b\u4e2d&#xff0c;\u82e5\u4e0d\u6d89\u53ca\u591a\u64ad\u673a\u5236&#xff0c;\u7528\u6237\u7a7a\u95f4\u7684 Socket \u4ee3\u7801\u65e0\u9700\u6267\u884c bind() \u7cfb\u7edf\u8c03\u7528&#xff0c;\u6b64\u65f6\u9700\u4f7f\u7528 sendto() \u4e0e recvfrom() \u51fd\u6570\u5b8c\u6210\u6570\u636e\u7684\u6536\u53d1&#xff1b;\u82e5\u6267\u884c\u4e86 bind() \u7cfb\u7edf\u8c03\u7528&#xff0c;\u540c\u6837\u53ef\u4ee5\u4f7f\u7528 sendto() \u4e0e recvfrom() \u51fd\u6570&#xff0c;\u4f46\u9700\u8c03\u6574\u5bf9\u5e94\u7684\u53c2\u6570\u4f20\u9012&#xff0c;\u6b64\u65f6\u66f4\u63a8\u8350\u4f7f\u7528 sendmsg() \u4e0e recvmsg() \u51fd\u6570\u5b8c\u6210\u6570\u636e\u6536\u53d1\u3002\u5f00\u53d1\u4eba\u5458\u53ef\u6839\u636e\u5b9e\u9645\u5e94\u7528\u573a\u666f\u7075\u6d3b\u9009\u62e9\u5bf9\u5e94\u7684\u5b9e\u73b0\u65b9\u5f0f\u3002<\/p>\n<hr \/>\n<h2>\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e0b&#xff09;<\/h2>\n<p>wjlkoorey258 2012-11-15 19:50:53<\/p>\n<h3>Netlink \u591a\u64ad\u673a\u5236\u7684\u7528\u6cd5<\/h3>\n<p>\u5728\u4e0a\u4e00\u8282\u7684\u5185\u5bb9\u4e2d&#xff0c;\u6240\u6709\u5b9e\u9a8c\u573a\u666f\u5747\u4ee5\u7528\u6237\u7a7a\u95f4\u4f5c\u4e3a\u6d88\u606f\u53d1\u8d77\u65b9&#xff0c;\u800c Netlink \u673a\u5236\u540c\u6837\u652f\u6301\u5185\u6838\u7a7a\u95f4\u4f5c\u4e3a\u4e3b\u52a8\u6d88\u606f\u53d1\u9001\u65b9&#xff0c;\u8be5\u573a\u666f\u901a\u5e38\u7528\u4e8e\u5185\u6838\u5411\u7528\u6237\u7a7a\u95f4\u4e3b\u52a8\u62a5\u544a\u81ea\u8eab\u72b6\u6001\u53d8\u5316&#xff0c;\u4f8b\u5982\u7528\u6237\u7a7a\u95f4\u611f\u77e5\u5230\u7684 USB \u70ed\u63d2\u62d4\u4e8b\u4ef6\u901a\u544a&#xff0c;\u4fbf\u662f\u57fa\u4e8e\u8be5\u673a\u5236\u5b9e\u73b0\u7684\u3002<\/p>\n<p>\u672c\u6b21\u5b9e\u9a8c\u7684\u76ee\u6807\u4e3a&#xff1a;\u5b9e\u73b0\u4e00\u4e2a\u5185\u6838\u7ebf\u7a0b&#xff0c;\u8be5\u7ebf\u7a0b\u6bcf\u9694 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         1 <\/p>\n<p>        1 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span> \u79d2\u5411\u4e00\u4e2a\u6307\u5b9a\u591a\u64ad\u7ec4\u53d1\u9001\u4e00\u6761\u6d88\u606f&#xff0c;\u6240\u6709\u52a0\u5165\u8be5\u591a\u64ad\u7ec4\u7684\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u5747\u53ef\u63a5\u6536\u5e76\u6253\u5370\u8be5\u6d88\u606f\u5185\u5bb9\u3002<\/p>\n<p>Netlink \u5730\u5740\u7ed3\u6784\u4f53\u4e2d\u7684 nl_groups \u5b57\u6bb5\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         32 <\/p>\n<p>        32 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u4f4d&#xff0c;\u8fd9\u610f\u5473\u7740\u6bcf\u79cd Netlink \u534f\u8bae\u6700\u591a\u652f\u6301 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         32 <\/p>\n<p>        32 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u4e2a\u591a\u64ad\u7ec4\u3002\u6b64\u5904\u7684\u201c\u6bcf\u79cd Netlink \u534f\u8bae\u201d\u6307\u7684\u662f Netlink \u534f\u8bae\u7c07\u4e2d\u7684\u5404\u7c7b\u9884\u5b9a\u4e49\u534f\u8bae&#xff08;\u5982\u4e0b\u6240\u793a&#xff09;&#xff0c;\u4ee5\u53ca\u672c\u6b21\u5b9e\u9a8c\u4e2d\u81ea\u5b9a\u4e49\u7684 NETLINK_TEST \u534f\u8bae\u3002<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ROUTE<\/span>    <span class=\"token expression\"><span class=\"token number\">0<\/span>  <\/span><span class=\"token comment\">\/* Routing\/device hook        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_UNUSED<\/span>    <span class=\"token expression\"><span class=\"token number\">1<\/span>  <\/span><span class=\"token comment\">\/* Unused number        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_USERSOCK<\/span>  <span class=\"token expression\"><span class=\"token number\">2<\/span>  <\/span><span class=\"token comment\">\/* Reserved for user mode socket protocols   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIREWALL<\/span>  <span class=\"token expression\"><span class=\"token number\">3<\/span>  <\/span><span class=\"token comment\">\/* Firewalling hook        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_INET_DIAG<\/span>  <span class=\"token expression\"><span class=\"token number\">4<\/span>  <\/span><span class=\"token comment\">\/* INET socket monitoring      *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NFLOG<\/span>    <span class=\"token expression\"><span class=\"token number\">5<\/span>  <\/span><span class=\"token comment\">\/* netfilter\/iptables ULOG *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_XFRM<\/span>    <span class=\"token expression\"><span class=\"token number\">6<\/span>  <\/span><span class=\"token comment\">\/* ipsec *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SELINUX<\/span>    <span class=\"token expression\"><span class=\"token number\">7<\/span>  <\/span><span class=\"token comment\">\/* SELinux event notifications *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ISCSI<\/span>    <span class=\"token expression\"><span class=\"token number\">8<\/span>  <\/span><span class=\"token comment\">\/* Open-iSCSI *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_AUDIT<\/span>    <span class=\"token expression\"><span class=\"token number\">9<\/span>  <\/span><span class=\"token comment\">\/* auditing *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIB_LOOKUP<\/span>  <span class=\"token expression\"><span class=\"token number\">10<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CONNECTOR<\/span>  <span class=\"token expression\"><span class=\"token number\">11<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NETFILTER<\/span>  <span class=\"token expression\"><span class=\"token number\">12<\/span>  <\/span><span class=\"token comment\">\/* netfilter subsystem *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_IP6_FW<\/span>    <span class=\"token expression\"><span class=\"token number\">13<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_DNRTMSG<\/span>    <span class=\"token expression\"><span class=\"token number\">14<\/span>  <\/span><span class=\"token comment\">\/* DECnet routing messages *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_KOBJECT_UEVENT<\/span>  <span class=\"token expression\"><span class=\"token number\">15<\/span>  <\/span><span class=\"token comment\">\/* Kernel messages to userspace *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_GENERIC<\/span>    <span class=\"token expression\"><span class=\"token number\">16<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* leave room for NETLINK_DM (DM Events) *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SCSITRANSPORT<\/span>  <span class=\"token expression\"><span class=\"token number\">18<\/span>  <\/span><span class=\"token comment\">\/* SCSI Transports *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ECRYPTFS<\/span>  <span class=\"token expression\"><span class=\"token number\">19<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_TEST<\/span> <span class=\"token expression\"><span class=\"token number\">20<\/span> <\/span><span class=\"token comment\">\/* \u7528\u6237\u6dfb\u52a0\u7684\u81ea\u5b9a\u4e49\u534f\u8bae *\/<\/span><\/span><\/p>\n<p>\u5728\u81ea\u5b9a\u4e49\u7684 NETLINK_TEST \u534f\u8bae\u4e2d&#xff0c;\u6700\u591a\u5141\u8bb8\u8bbe\u7f6e <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         32 <\/p>\n<p>        32 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u4e2a\u591a\u64ad\u7ec4&#xff0c;\u6bcf\u4e2a\u591a\u64ad\u7ec4\u7531\u4e00\u4e2a\u72ec\u7acb\u7684\u6bd4\u7279\u4f4d\u8868\u793a&#xff0c;\u4e0d\u5b58\u5728\u591a\u64ad\u7ec4\u91cd\u590d\u7684\u60c5\u51b5\u3002\u5f00\u53d1\u4eba\u5458\u53ef\u6839\u636e\u5b9e\u9645\u9700\u6c42\u4e3a\u6bcf\u4e2a\u591a\u64ad\u7ec4\u5206\u914d\u5bf9\u5e94\u7684\u529f\u80fd&#xff0c;\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u82e5\u5bf9\u67d0\u4e2a\u591a\u64ad\u7ec4\u7684\u6d88\u606f\u611f\u5174\u8da3&#xff0c;\u53ef\u901a\u8fc7\u52a0\u5165\u8be5\u591a\u64ad\u7ec4\u7684\u65b9\u5f0f&#xff0c;\u63a5\u6536\u5185\u6838\u7a7a\u95f4\u5411\u8be5\u7ec4\u53d1\u9001\u7684\u591a\u64ad\u6d88\u606f\u3002<\/p>\n<p>\u56de\u5230 Netlink \u5730\u5740\u7ed3\u6784\u4f53\u7684 nl_groups \u5b57\u6bb5&#xff0c;\u8be5\u5b57\u6bb5\u5b58\u50a8\u7684\u662f\u591a\u64ad\u7ec4\u7684\u5730\u5740\u63a9\u7801&#xff08;\u5e76\u975e\u591a\u64ad\u7ec4\u53f7&#xff09;\u3002\u5728 af_netlink.c \u6587\u4ef6\u4e2d&#xff0c;\u63d0\u4f9b\u4e86\u4ece\u591a\u64ad\u7ec4\u53f7\u8f6c\u6362\u4e3a\u591a\u64ad\u7ec4\u63a9\u7801\u7684\u51fd\u6570&#xff0c;\u5177\u4f53\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> u32 <span class=\"token function\">netlink_group_mask<\/span><span class=\"token punctuation\">(<\/span>u32 group<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> group <span class=\"token operator\">?<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>group <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u7531\u6b64\u53ef\u77e5&#xff0c;\u5728\u7528\u6237\u7a7a\u95f4\u4ee3\u7801\u4e2d&#xff0c;\u82e5\u9700\u52a0\u5165\u591a\u64ad\u7ec4 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         1 <\/p>\n<p>        1 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u9700\u5c06 nl_groups \u5b57\u6bb5\u8bbe\u7f6e\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         1 <\/p>\n<p>        1 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">1<\/span><\/span><\/span><\/span><\/span>&#xff1b;\u591a\u64ad\u7ec4 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         2 <\/p>\n<p>        2 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">2<\/span><\/span><\/span><\/span><\/span> \u5bf9\u5e94\u7684\u63a9\u7801\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         2 <\/p>\n<p>        2 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">2<\/span><\/span><\/span><\/span><\/span>&#xff1b;\u591a\u64ad\u7ec4 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         3 <\/p>\n<p>        3 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">3<\/span><\/span><\/span><\/span><\/span> \u5bf9\u5e94\u7684\u63a9\u7801\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         4 <\/p>\n<p>        4 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">4<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u4ee5\u6b64\u7c7b\u63a8\u3002\u82e5\u8be5\u5b57\u6bb5\u503c\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>         0 <\/p>\n<p>        0 <\/p>\n<p>    <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u8868\u660e\u4e0d\u52a0\u5165\u4efb\u4f55\u591a\u64ad\u7ec4\u3002\u638c\u63e1\u8be5\u8f6c\u6362\u5173\u7cfb\u5177\u6709\u91cd\u8981\u610f\u4e49&#xff0c;\u56e0\u6b64\u53ef\u5728\u7528\u6237\u7a7a\u95f4\u4ee3\u7801\u4e2d\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7c7b\u4f3c netlink_group_mask() \u7684\u51fd\u6570&#xff0c;\u5b8c\u6210\u591a\u64ad\u7ec4\u53f7\u5230\u591a\u64ad\u7ec4\u63a9\u7801\u7684\u8f6c\u6362\u3002<\/p>\n<h3>\u5b9e\u73b0\u4ee3\u7801<\/h3>\n<h4>\u7528\u6237\u7a7a\u95f4\u4ee3\u7801<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/stat.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;unistd.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;asm\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;errno.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PAYLOAD<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/\/ Netlink \u6d88\u606f\u7684\u6700\u5927\u8f7d\u8377\u7684\u957f\u5ea6<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u53f7\u8f6c\u591a\u64ad\u7ec4\u63a9\u7801\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">netlink_group_mask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span> group<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> group <span class=\"token operator\">?<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>group <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> src_addr<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> sock_fd<span class=\"token punctuation\">,<\/span> retval<span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u521b\u5efa Socket<\/span><br \/>\n  sock_fd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>PF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span> NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>sock_fd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;error getting socket: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>src_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>src_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  src_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> PF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n  src_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6807\u8bc6\u4ece\u5185\u6838\u63a5\u6536\u591a\u64ad\u6d88\u606f&#xff08;\u53e6\u4e00\u4e2a\u542b\u4e49\u4e3a\u6d88\u606f\u53d1\u9001\u65b9\u4e3a\u5185\u6838&#xff09;<\/span><br \/>\n  src_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">netlink_group_mask<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">atoi<\/span><span class=\"token punctuation\">(<\/span>argv<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u63a9\u7801&#xff0c;\u7ec4\u53f7\u6765\u81ea\u547d\u4ee4\u884c\u8f93\u5165\u7684\u7b2c\u4e00\u4e2a\u53c2\u6570<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u52a0\u5165\u591a\u64ad\u7ec4\u5fc5\u987b\u8c03\u7528 bind() \u51fd\u6570<\/span><br \/>\n  retval <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>src_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>src_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>retval <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;bind failed: %s&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">strerror<\/span><span class=\"token punctuation\">(<\/span>errno<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4e3a\u63a5\u6536 Netlink \u6d88\u606f\u7533\u8bf7\u5b58\u50a8\u7a7a\u95f4<\/span><br \/>\n  nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;malloc nlmsghdr error!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_base <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n  iov<span class=\"token punctuation\">.<\/span>iov_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PAYLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\n  msg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4ece\u5185\u6838\u63a5\u6536\u6d88\u606f<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;waiting for&#8230;\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">recvmsg<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Received message: %s \\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>sock_fd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>\u8bf4\u660e<\/h4>\n<p>\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f\u7684\u6574\u4f53\u903b\u8f91\u4e0e\u524d\u6587\u4fdd\u6301\u4e00\u81f4&#xff0c;\u5dee\u5f02\u5728\u4e8e nl_groups \u5b57\u6bb5\u7684\u8bbe\u7f6e&#xff0c;\u8be5\u5b57\u6bb5\u7684\u76f8\u5173\u6587\u6863\u8f83\u4e3a\u7a00\u7f3a&#xff0c;\u5176\u8be6\u7ec6\u7528\u6cd5\u53ef\u901a\u8fc7\u67e5\u9605\u5185\u6838\u6e90\u7801\u4e0e\u76f8\u5173\u6280\u672f\u8d44\u6599\u8fdb\u4e00\u6b65\u83b7\u53d6\u3002<\/p>\n<h4>\u5185\u6838\u7a7a\u95f4\u4ee3\u7801<\/h4>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/kernel.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/module.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/skbuff.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/init.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/ip.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/sched.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/sock.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/netlink.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token function\">MODULE_LICENSE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;GPL&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">MODULE_AUTHOR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Koorey King&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_MSGSIZE<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span> <\/span><span class=\"token comment\">\/* \u6d88\u606f\u6700\u5927\u957f\u5ea6\u4e3a 1024 \u5b57\u8282 *\/<\/span><\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">task_struct<\/span> <span class=\"token operator\">*<\/span>mythread <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u5185\u6838\u7ebf\u7a0b\u5bf9\u8c61<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u6d88\u606f\u7684\u63a5\u53e3\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">sendnlmsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>message<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_MSGSIZE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">int<\/span> slen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>message <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>nl_sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u4e3a\u65b0\u7684 sk_buffer \u7533\u8bf7\u7a7a\u95f4<\/span><br \/>\n  skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">alloc_skb<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">,<\/span> GFP_KERNEL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span>KERN_ERR <span class=\"token string\">&#034;my_net_link: alloc_skb Error.\/n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  slen <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u7528 nlmsg_put() \u6765\u8bbe\u7f6e netlink \u6d88\u606f\u5934\u90e8<\/span><br \/>\n  nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_put<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> MAX_MSGSIZE<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u8bbe\u7f6e Netlink \u7684\u63a7\u5236\u5757\u91cc\u7684\u76f8\u5173\u4fe1\u606f<\/span><br \/>\n  <span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6d88\u606f\u53d1\u9001\u8005\u4e3a\u5185\u6838\u7a7a\u95f4&#xff0c;\u7f6e\u4e3a 0<\/span><br \/>\n  <span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>dst_group <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u53f7\u4e3a 5<\/span><\/p>\n<p>  message<span class=\"token punctuation\">[<\/span>slen<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">,<\/span> slen<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token comment\">\/\/ \u53d1\u9001\u591a\u64ad\u6d88\u606f\u5230\u591a\u64ad\u7ec4 5<\/span><br \/>\n  <span class=\"token function\">netlink_broadcast<\/span><span class=\"token punctuation\">(<\/span>nl_sk<span class=\"token punctuation\">,<\/span> skb<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">,<\/span> GFP_KERNEL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send OK!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5185\u6838\u7ebf\u7a0b\u51fd\u6570&#xff1a;\u6bcf\u9694 1 \u79d2\u949f\u53d1\u9001\u4e00\u6761\u201cI am from kernel!\u201d\u6d88\u606f&#xff0c;\u5171\u53d1\u9001 10 \u6761<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">sending_thread<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n   <span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">completion<\/span> cmpl<span class=\"token punctuation\">;<\/span><\/p>\n<p>   <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token operator\">&#8212;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">init_completion<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>cmpl<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">wait_for_completion_timeout<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>cmpl<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">*<\/span> HZ<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token function\">sendnlmsg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;I am from kernel!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token punctuation\">}<\/span><br \/>\n   <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;sending thread exited!&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n   <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> __init <span class=\"token function\">myinit_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink in\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  nl_sk <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span>NETLINK_TEST<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span>THIS_MODULE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>nl_sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span>KERN_ERR <span class=\"token string\">&#034;my_net_link: create netlink socket error.\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><\/p>\n<p>  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink: create netlink socket ok.\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  mythread <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">kthread_run<\/span><span class=\"token punctuation\">(<\/span>sending_thread<span class=\"token punctuation\">,<\/span><span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><span class=\"token string\">&#034;thread_sender&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> __exit <span class=\"token function\">mycleanup_module<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n  <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>nl_sk <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n <span class=\"token function\">sock_release<\/span><span class=\"token punctuation\">(<\/span>nl_sk<span class=\"token operator\">-&gt;<\/span>sk_socket<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n  <span class=\"token punctuation\">}<\/span><br \/>\n  <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;my netlink out!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">module_init<\/span><span class=\"token punctuation\">(<\/span>myinit_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">module_exit<\/span><span class=\"token punctuation\">(<\/span>mycleanup_module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h3>\u8865\u5145\u8bf4\u660e<\/h3>\n<li>\u5185\u6838\u51fd\u6570 netlink_kernel_create(int unit, unsigned int groups,\u2026) \u7684\u7b2c\u4e8c\u4e2a\u53c2\u6570&#xff0c;\u8868\u793a\u5185\u6838\u8fdb\u7a0b\u6700\u591a\u80fd\u5904\u7406\u7684\u591a\u64ad\u7ec4\u4e2a\u6570&#xff0c;\u82e5\u8be5\u503c\u5c0f\u4e8e <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>          32 <\/p>\n<p>         32 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u5219\u9ed8\u8ba4\u6309 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>          32 <\/p>\n<p>         32 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">32<\/span><\/span><\/span><\/span><\/span> \u5904\u7406\u3002\u56e0\u6b64&#xff0c;\u8c03\u7528\u8be5\u51fd\u6570\u65f6&#xff0c;\u901a\u5e38\u53ef\u5c06\u7b2c\u4e8c\u4e2a\u53c2\u6570\u7f6e\u4e3a <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\"> <\/p>\n<p>          0 <\/p>\n<p>         0 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>\u3002<\/li>\n<li>struct sk_buff \u7ed3\u6784\u4f53\u4e2d\u7684 cb[48] \u5b57\u6bb5\u4e3a\u63a7\u5236\u7f13\u51b2\u533a&#xff0c;\u53ef\u4f9b\u5404\u5c42\u534f\u8bae\u5b58\u50a8\u79c1\u6709\u53d8\u91cf&#xff0c;Netlink \u673a\u5236\u901a\u8fc7\u5c06\u8be5\u5b57\u6bb5\u5f3a\u5236\u8f6c\u6362\u4e3a struct netlink_skb_parms{} \u7ed3\u6784\u4f53&#xff0c;\u586b\u5145 Netlink \u901a\u4fe1\u6240\u9700\u7684\u79c1\u6709\u4fe1\u606f&#xff0c;\u5176\u56fa\u5b9a\u586b\u5145\u6a21\u677f\u5982\u4e0b&#xff1a;<span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>pid<span class=\"token operator\">&#061;<\/span>xx<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>dst_group<span class=\"token operator\">&#061;<\/span>xx<span class=\"token punctuation\">;<\/span>\n <\/li>\n<li>\u672c\u6b21\u5b9e\u9a8c\u4e2d&#xff0c;\u5c06 NETLINK_CB(skb).dst_group \u8bbe\u7f6e\u4e3a\u5bf9\u5e94\u591a\u64ad\u7ec4\u53f7\u6216 <span class=\"katex--inline\"><span class=\"katex\"><span class=\"katex-mathml\">\n<p>          0 <\/p>\n<p>         0 <\/p>\n<p>     <\/span><span class=\"katex-html\"><span class=\"base\"><span class=\"strut\" style=\"height: 0.6444em\"><\/span><span class=\"mord\">0<\/span><\/span><\/span><\/span><\/span>&#xff0c;\u7528\u6237\u7a7a\u95f4\u5747\u80fd\u6536\u5230\u591a\u64ad\u6d88\u606f&#xff0c;\u5176\u5e95\u5c42\u539f\u56e0\u9700\u8fdb\u4e00\u6b65\u67e5\u9605\u5185\u6838\u6e90\u7801\u4e0e\u6df1\u5165\u5206\u6790 Netlink \u591a\u64ad\u673a\u5236\u5b9e\u73b0\u539f\u7406\u3002<\/li>\n<h3>\u6d4b\u8bd5\u4e0e\u6ce8\u610f\u4e8b\u9879<\/h3>\n<li>\u7f16\u8bd1\u5b8c\u6210\u540e&#xff0c;\u9700\u5148\u6267\u884c insmod \u547d\u4ee4\u52a0\u8f7d\u5185\u6838\u6a21\u5757&#xff0c;\u518d\u8fd0\u884c\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f\u3002\u82e5\u672a\u52a0\u8f7d mynlkern.ko \u5185\u6838\u6a21\u5757\u800c\u76f4\u63a5\u8fd0\u884c .\/test 5&#xff0c;bind() \u7cfb\u7edf\u8c03\u7528\u5c06\u8fd4\u56de No such file or directory \u9519\u8bef\u3002<\/li>\n<li>\u90e8\u5206\u8001\u7248\u672c Netlink \u591a\u64ad\u6559\u7a0b\u4e2d\u63d0\u53ca\u7684\u201c\u5148\u8fd0\u884c\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f&#xff0c;\u518d\u52a0\u8f7d\u5185\u6838\u6a21\u5757\u201d\u7684\u65b9\u5f0f&#xff0c;\u5728\u5185\u6838 2.6.21 \u7248\u672c\u4e2d\u5df2\u4e0d\u518d\u9002\u7528&#xff0c;\u9700\u91cd\u70b9\u6ce8\u610f\u3002<\/li>\n<h3>\u5c0f\u7ed3<\/h3>\n<p>\u901a\u8fc7\u4e09\u7bc7\u5185\u5bb9\u7684\u9610\u8ff0&#xff0c;<\/p>\n<li>\u660e\u786e\u4e86 Netlink \u7684\u5173\u952e\u7279\u6027&#xff08;\u65e0\u8fde\u63a5\u3001\u57fa\u4e8e BSD Socket\u3001\u652f\u6301\u5355\u64ad\/\u591a\u64ad&#xff09;\u3001\u6d88\u606f\u683c\u5f0f&#xff08;16 \u5b57\u8282\u56fa\u5b9a\u5934&#043;\u53ef\u53d8\u8d1f\u8f7d&#xff09;\u4e0e\u7f16\u7a0b\u5173\u952e\u8981\u70b9&#xff08;pid \u5b57\u6bb5\u53d6\u503c\u3001\u591a\u64ad\u7ec4\u53f7\u4e0e\u63a9\u7801\u8f6c\u6362\u3001bind() \u8c03\u7528\u7684\u9002\u7528\u573a\u666f&#xff09;&#xff1b;<\/li>\n<li>\u68b3\u7406\u4e86 Netlink \u7f16\u7a0b\u7684\u4e09\u4e2a\u9636\u6bb5&#xff08;\u5355\u5411\u901a\u4fe1\u3001\u53cc\u5411\u901a\u4fe1\u3001\u65e0 bind() \u901a\u4fe1&#xff09;\u4e0e\u591a\u64ad\u673a\u5236\u7684\u5b9e\u73b0\u6d41\u7a0b&#xff0c;\u8865\u5145\u4e86\u5b9e\u9a8c\u6ce8\u610f\u4e8b\u9879\u4e0e\u540e\u7eed\u6df1\u5165\u5b66\u4e60\u7684\u65b9\u5411&#xff1b;<\/li>\n<p>\u53ef\u5bf9 Netlink \u673a\u5236\u5f62\u6210\u521d\u6b65\u8ba4\u77e5&#xff0c;\u5e76\u80fd\u591f\u5f00\u53d1\u57fa\u4e8e Netlink \u7684\u57fa\u7840\u5e94\u7528\u7a0b\u5e8f\u3002\u4f46\u8fd9\u4ec5\u4e3a\u8be5\u673a\u5236\u7684\u5165\u95e8\u5185\u5bb9&#xff0c;\u82e5\u8981\u5f00\u53d1\u9ad8\u8d28\u91cf\u3001\u9ad8\u6548\u7387\u7684 Netlink \u5e94\u7528\u6a21\u5757&#xff0c;\u8fd8\u9700\u8fdb\u4e00\u6b65\u6df1\u5165\u7406\u89e3\u5176\u5e95\u5c42\u672c\u8d28&#xff0c;\u540c\u65f6\u638c\u63e1\u5185\u6838\u7f16\u7a0b\u7684\u76f8\u5173\u57fa\u7840\u80fd\u529b&#xff0c;\u4f8b\u5982\u4e34\u754c\u8d44\u6e90\u7684\u4e92\u65a5\u4fdd\u62a4\u3001\u7ebf\u7a0b\u5b89\u5168\u6027\u4fdd\u969c\u3001\u5927\u6570\u636e\u91cf\u4f20\u8f93\u7684\u5904\u7406\u7b56\u7565\u7b49&#xff0c;\u8fd9\u4e9b\u5747\u4e3a\u5b9e\u9645\u5f00\u53d1\u4e2d\u9700\u8981\u91cd\u70b9\u8003\u8651\u7684\u95ee\u9898\u3002<\/p>\n<hr \/>\n<h2>Linux \u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u901a\u4fe1\u4e4b Netlink \u4f7f\u7528\u65b9\u6cd5<\/h2>\n<p>HAOMCU \u8f6c\u8f7d\u65f6\u95f4&#xff1a;2012-03-20 09:41:52<\/p>\n<h3>1 \u7b80\u4ecb<\/h3>\n<p>\u672c\u6587\u4ecb\u7ecd Linux \u5185\u6838\u4e2d\u7684 Netlink \u901a\u4fe1\u673a\u5236&#xff0c;\u8be6\u7ec6\u9610\u8ff0 Netlink \u7684\u5de5\u4f5c\u539f\u7406\u4e0e\u6280\u672f\u4f18\u52bf&#xff0c;\u5305\u62ec\u5176\u652f\u6301\u7684\u591a\u79cd\u534f\u8bae\u7c7b\u578b\u3001\u5f02\u6b65\u901a\u4fe1\u673a\u5236\u53ca\u591a\u64ad\u7279\u6027&#xff0c;\u5e76\u901a\u8fc7\u5b9e\u4f8b\u5c55\u793a\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684\u901a\u4fe1\u8fc7\u7a0b\u3002<\/p>\n<p>Linux \u4e2d\u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u673a\u5236\u6e90\u81ea Unix \u5e73\u53f0\u7684\u8fdb\u7a0b\u901a\u4fe1\u673a\u5236\u3002Unix \u7684\u4e24\u5927\u5206\u652f AT&amp;T Unix \u548c BSD Unix \u5728\u8fdb\u7a0b\u901a\u4fe1\u5b9e\u73b0\u673a\u5236\u4e0a\u5b58\u5728\u5dee\u5f02&#xff1a;\u524d\u8005\u5f62\u6210\u9002\u7528\u4e8e\u5355\u53f0\u8ba1\u7b97\u673a\u7684 System V IPC&#xff0c;\u540e\u8005\u5b9e\u73b0\u57fa\u4e8e Socket \u7684\u8fdb\u7a0b\u95f4\u901a\u4fe1\u673a\u5236\u3002\u540c\u65f6&#xff0c;Linux \u9075\u5faa IEEE \u5236\u5b9a\u7684 Posix IPC \u6807\u51c6&#xff0c;\u5728\u4e0a\u8ff0\u4e09\u7c7b\u673a\u5236\u57fa\u7840\u4e0a\u5b9e\u73b0\u4ee5\u4e0b\u4e3b\u8981 IPC \u673a\u5236&#xff1a;\u7ba1\u9053&#xff08;Pipe&#xff09;\u53ca\u547d\u540d\u7ba1\u9053&#xff08;Named Pipe&#xff09;\u3001\u4fe1\u53f7&#xff08;Signal&#xff09;\u3001\u6d88\u606f\u961f\u5217&#xff08;Message queue&#xff09;\u3001\u5171\u4eab\u5185\u5b58&#xff08;Shared Memory&#xff09;\u3001\u4fe1\u53f7\u91cf&#xff08;Semaphore&#xff09;\u3001\u5957\u63a5\u5b57&#xff08;Socket&#xff09;\u3002\u501f\u52a9\u8fd9\u4e9b IPC \u673a\u5236&#xff0c;\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u95f4\u53ef\u5b8c\u6210\u6570\u636e\u4ea4\u4e92\u3002\u4e3a\u5b9e\u73b0\u5185\u6838\u7a7a\u95f4\u4e0e\u7528\u6237\u7a7a\u95f4\u7684\u901a\u4fe1&#xff0c;Linux \u63d0\u4f9b\u57fa\u4e8e Socket \u7684 Netlink \u901a\u4fe1\u673a\u5236&#xff0c;\u53ef\u5b9e\u73b0\u5185\u6838\u7a7a\u95f4\u4e0e\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u6570\u636e\u7684\u5b9e\u65f6\u4ea4\u4e92\u3002<\/p>\n<p>\u672c\u6587\u7b2c 2 \u8282\u6982\u8ff0\u76f8\u5173\u7814\u7a76\u5de5\u4f5c&#xff0c;\u7b2c 3 \u8282\u5bf9\u6bd4\u5176\u4ed6 IPC \u673a\u5236&#xff0c;\u8be6\u7ec6\u4ecb\u7ecd Netlink \u673a\u5236\u53ca\u5176\u5173\u952e\u6280\u672f&#xff0c;\u7b2c 4 \u8282\u91c7\u7528 KGDB&#043;GDB \u7ec4\u5408\u8c03\u8bd5\u65b9\u5f0f&#xff0c;\u901a\u8fc7\u793a\u4f8b\u7a0b\u5e8f\u6f14\u793a Netlink \u901a\u4fe1\u8fc7\u7a0b&#xff0c;\u7b2c 5 \u8282\u603b\u7ed3\u5e76\u6307\u51fa Netlink \u901a\u4fe1\u673a\u5236\u7684\u4e0d\u8db3\u4e4b\u5904\u3002<\/p>\n<h4>2 \u76f8\u5173\u7814\u7a76<\/h4>\n<p>\u622a\u81f3\u76ee\u524d&#xff0c;Linux \u63d0\u4f9b 9 \u79cd\u5b9e\u73b0\u5185\u6838\u7a7a\u95f4\u4e0e\u7528\u6237\u7a7a\u95f4\u6570\u636e\u4ea4\u6362\u7684\u673a\u5236&#xff0c;\u5206\u522b\u4e3a\u5185\u6838\u542f\u52a8\u53c2\u6570\u3001\u6a21\u5757\u53c2\u6570\u4e0e sysfs\u3001sysctl\u3001\u7cfb\u7edf\u8c03\u7528\u3001netlink\u3001procfs\u3001seq_file\u3001debugfs \u548c relayfs\u3002\u5176\u4e2d&#xff0c;\u6a21\u5757\u53c2\u6570\u4e0e sysfs\u3001procfs\u3001debugfs\u3001relayfs \u5c5e\u4e8e\u57fa\u4e8e\u6587\u4ef6\u7cfb\u7edf\u7684\u901a\u4fe1\u673a\u5236&#xff0c;\u4e3b\u8981\u7528\u4e8e\u5185\u6838\u7a7a\u95f4\u5411\u7528\u6237\u7a7a\u95f4\u8f93\u51fa\u4fe1\u606f&#xff1b;sysctl\u3001\u7cfb\u7edf\u8c03\u7528\u4e3a\u7528\u6237\u7a7a\u95f4\u53d1\u8d77\u7684\u901a\u4fe1\u673a\u5236\u3002\u7531\u6b64\u53ef\u89c1&#xff0c;\u4e0a\u8ff0\u673a\u5236\u5747\u4e3a\u5355\u5de5\u901a\u4fe1\u673a\u5236&#xff0c;\u5728\u5185\u6838\u7a7a\u95f4\u4e0e\u7528\u6237\u7a7a\u95f4\u7684\u53cc\u5411\u4ea4\u4e92\u5f0f\u6570\u636e\u4ea4\u6362\u573a\u666f\u4e0b\u5b58\u5728\u4e00\u5b9a\u7684\u5c40\u9650\u6027\u3002<\/p>\n<p>Netlink \u662f\u57fa\u4e8e Socket \u7684\u901a\u4fe1\u673a\u5236&#xff0c;\u4f9d\u6258 Socket \u672c\u8eab\u5177\u5907\u7684\u53cc\u5411\u6027\u3001\u7a81\u53d1\u6027\u3001\u975e\u963b\u585e\u7279\u6027&#xff0c;\u80fd\u591f\u8f83\u597d\u5730\u6ee1\u8db3\u5185\u6838\u7a7a\u95f4\u4e0e\u7528\u6237\u7a7a\u95f4\u5c0f\u91cf\u6570\u636e\u7684\u5b9e\u65f6\u4ea4\u4e92\u9700\u6c42&#xff0c;\u56e0\u6b64\u5728 Linux 2.6 \u5185\u6838\u4e2d\u88ab\u5e7f\u6cdb\u5e94\u7528\u3002\u4f8b\u5982 SELinux \u7ec4\u4ef6&#xff0c;\u4ee5\u53ca Linux \u7cfb\u7edf\u9632\u706b\u5899\u7684\u5185\u6838\u6001\u7ec4\u4ef6 netfilter \u4e0e\u7528\u6237\u6001\u7ec4\u4ef6 iptables \u4e4b\u95f4\u7684\u6570\u636e\u4ea4\u6362&#xff0c;\u5747\u901a\u8fc7 Netlink \u673a\u5236\u5b8c\u6210\u3002<\/p>\n<h4>3 Netlink \u673a\u5236\u53ca\u5176\u5173\u952e\u6280\u672f<\/h4>\n<h6>3.1 Netlink \u673a\u5236<\/h6>\n<p>\u5728 Linux \u64cd\u4f5c\u7cfb\u7edf\u4e2d&#xff0c;CPU \u5904\u4e8e\u5185\u6838\u6001\u65f6\u53ef\u5206\u4e3a\u4e24\u79cd\u573a\u666f&#xff1a;\u5b58\u5728\u7528\u6237\u4e0a\u4e0b\u6587\u7684\u72b6\u6001\u3001\u6267\u884c\u786c\u4ef6\u4e2d\u65ad\u6216\u8f6f\u4ef6\u4e2d\u65ad\u7684\u72b6\u6001\u3002\u5176\u4e2d&#xff0c;\u5728\u5b58\u5728\u7528\u6237\u4e0a\u4e0b\u6587\u7684\u573a\u666f\u4e0b&#xff0c;\u7531\u4e8e\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u7684\u5185\u5b58\u6620\u5c04\u673a\u5236\u4e0d\u540c&#xff0c;\u65e0\u6cd5\u76f4\u63a5\u5c06\u672c\u5730\u53d8\u91cf\u4f20\u9012\u81f3\u7528\u6237\u6001\u5185\u5b58\u533a\u57df&#xff1b;\u5728\u6267\u884c\u786c\u4ef6\u4e2d\u65ad\u6216\u8f6f\u4ef6\u4e2d\u65ad\u7684\u573a\u666f\u4e0b&#xff0c;\u4ee3\u7801\u6267\u884c\u8fc7\u7a0b\u4e0d\u53ef\u4e2d\u65ad&#xff0c;\u540c\u6837\u65e0\u6cd5\u76f4\u63a5\u5411\u7528\u6237\u5185\u5b58\u533a\u57df\u4f20\u9012\u6570\u636e\u3002<\/p>\n<p>\u4f20\u7edf\u8fdb\u7a0b\u95f4\u901a\u4fe1\u673a\u5236\u5747\u65e0\u6cd5\u76f4\u63a5\u5e94\u7528\u4e8e\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u4e4b\u95f4\u7684\u901a\u4fe1&#xff0c;\u5177\u4f53\u539f\u56e0\u5982\u8868 1 \u6240\u793a&#xff1a;<\/p>\n<table>\n<tr>\u901a\u4fe1\u65b9\u6cd5\u65e0\u6cd5\u5e94\u7528\u4e8e\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u7684\u539f\u56e0<\/tr>\n<tbody>\n<tr>\n<td align=\"left\">\u7ba1\u9053&#xff08;\u4e0d\u542b\u547d\u540d\u7ba1\u9053&#xff09;<\/td>\n<td align=\"left\">\u4ec5\u652f\u6301\u7236\u5b50\u8fdb\u7a0b\u95f4\u7684\u901a\u4fe1<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u6d88\u606f\u961f\u5217<\/td>\n<td align=\"left\">\u65e0\u6cd5\u5728\u786c\u4ef6\u4e2d\u65ad\u3001\u8f6f\u4ef6\u4e2d\u65ad\u4e2d\u65e0\u963b\u585e\u63a5\u6536\u6570\u636e<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u4fe1\u53f7\u91cf<\/td>\n<td align=\"left\">\u65e0\u6cd5\u8de8\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u4f7f\u7528<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u5171\u4eab\u5185\u5b58<\/td>\n<td align=\"left\">\u9700\u4fe1\u53f7\u91cf\u8f85\u52a9\u5b9e\u73b0\u540c\u6b65&#xff0c;\u800c\u4fe1\u53f7\u91cf\u65e0\u6cd5\u8de8\u6001\u4f7f\u7528<\/td>\n<\/tr>\n<tr>\n<td align=\"left\">\u5957\u63a5\u5b57<\/td>\n<td align=\"left\">\u65e0\u6cd5\u5728\u786c\u4ef6\u4e2d\u65ad\u3001\u8f6f\u4ef6\u4e2d\u65ad\u4e2d\u65e0\u963b\u585e\u63a5\u6536\u6570\u636e<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u8868 1&#xff08;\u5f15\u81ea \u53c2\u8003\u6587\u732e 5&#xff09;<\/p>\n<p>\u89e3\u51b3\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u901a\u4fe1\u95ee\u9898\u7684\u65b9\u6848\u53ef\u5206\u4e3a\u4e24\u7c7b&#xff1a;<\/p>\n<li>\u5b58\u5728\u7528\u6237\u4e0a\u4e0b\u6587\u65f6&#xff0c;\u53ef\u8c03\u7528 Linux \u63d0\u4f9b\u7684 copy_from_user() \u548c copy_to_user() \u51fd\u6570\u5b8c\u6210\u6570\u636e\u4f20\u8f93&#xff0c;\u4f46\u8fd9\u4e24\u4e2a\u51fd\u6570\u53ef\u80fd\u4ea7\u751f\u963b\u585e&#xff0c;\u56e0\u6b64\u65e0\u6cd5\u5728\u786c\u4ef6\u4e2d\u65ad\u3001\u8f6f\u4ef6\u4e2d\u65ad\u8fc7\u7a0b\u4e2d\u8c03\u7528&#xff1b;<\/li>\n<li>\u6267\u884c\u786c\u4ef6\u4e2d\u65ad\u6216\u8f6f\u4ef6\u4e2d\u65ad\u65f6&#xff0c;\u53ef\u901a\u8fc7\u4ee5\u4e0b\u4e24\u79cd\u65b9\u5f0f\u5b9e\u73b0&#xff1a; 2.1 \u501f\u52a9 Linux \u5185\u6838\u63d0\u4f9b\u7684 spinlock \u81ea\u65cb\u9501\u5b9e\u73b0\u5185\u6838\u7ebf\u7a0b\u4e0e\u4e2d\u65ad\u8fc7\u7a0b\u7684\u540c\u6b65\u3002\u7531\u4e8e\u5185\u6838\u7ebf\u7a0b\u8fd0\u884c\u5728\u6709\u4e0a\u4e0b\u6587\u7684\u8fdb\u7a0b\u73af\u5883\u4e2d&#xff0c;\u56e0\u6b64\u53ef\u5728\u5185\u6838\u7ebf\u7a0b\u4e2d\u901a\u8fc7\u5957\u63a5\u5b57\u6216\u6d88\u606f\u961f\u5217\u83b7\u53d6\u7528\u6237\u7a7a\u95f4\u6570\u636e&#xff0c;\u518d\u901a\u8fc7\u4e34\u754c\u533a\u5c06\u6570\u636e\u4f20\u9012\u81f3\u4e2d\u65ad\u8fc7\u7a0b&#xff1b; 2.2 \u57fa\u4e8e Netlink \u673a\u5236\u5b9e\u73b0\u3002Netlink \u5957\u63a5\u5b57\u7684\u901a\u4fe1\u6807\u8bc6\u901a\u5e38\u4e3a\u8fdb\u7a0b\u7684 ID&#xff08;\u8fdb\u7a0b\u6807\u8bc6\u7b26&#xff09;\u3002Netlink \u901a\u4fe1\u7684\u663e\u8457\u7279\u5f81\u662f\u5bf9\u4e2d\u65ad\u8fc7\u7a0b\u7684\u826f\u597d\u652f\u6301&#xff1a;\u5185\u6838\u7a7a\u95f4\u63a5\u6536\u7528\u6237\u7a7a\u95f4\u6570\u636e\u65f6&#xff0c;\u65e0\u9700\u7528\u6237\u81ea\u884c\u542f\u52a8\u5185\u6838\u7ebf\u7a0b&#xff0c;\u800c\u662f\u901a\u8fc7\u8f6f\u4e2d\u65ad\u8c03\u7528\u7528\u6237\u9884\u5148\u6307\u5b9a\u7684\u63a5\u6536\u51fd\u6570\u3002\u8fd9\u79cd\u57fa\u4e8e\u8f6f\u4e2d\u65ad\u7684\u5b9e\u73b0\u65b9\u5f0f\u76f8\u8f83\u4e8e\u81ea\u884c\u542f\u52a8\u5185\u6838\u7ebf\u7a0b&#xff0c;\u80fd\u591f\u4fdd\u969c\u6570\u636e\u4f20\u8f93\u7684\u5b9e\u65f6\u6027\u3002<\/li>\n<h6>3.2 Netlink \u4f18\u52bf<\/h6>\n<p>\u76f8\u8f83\u4e8e\u5176\u4ed6\u901a\u4fe1\u673a\u5236&#xff0c;Netlink \u5177\u5907\u4ee5\u4e0b\u4f18\u52bf&#xff1a;<\/p>\n<li>\u57fa\u4e8e Netlink \u81ea\u5b9a\u4e49\u65b0\u534f\u8bae\u5e76\u52a0\u5165\u534f\u8bae\u65cf\u540e&#xff0c;\u5373\u53ef\u901a\u8fc7 Socket API \u5b8c\u6210\u6570\u636e\u4ea4\u6362&#xff1b;\u800c ioctl \u548c proc \u6587\u4ef6\u7cfb\u7edf\u9700\u901a\u8fc7\u7a0b\u5e8f\u65b0\u589e\u5bf9\u5e94\u7684\u8bbe\u5907\u6216\u6587\u4ef6\u624d\u80fd\u5b9e\u73b0\u901a\u4fe1&#xff1b;<\/li>\n<li>Netlink \u91c7\u7528 Socket \u7f13\u5b58\u961f\u5217\u5b9e\u73b0\u5f02\u6b65\u901a\u4fe1&#xff0c;\u800c ioctl \u4e3a\u540c\u6b65\u901a\u4fe1\u673a\u5236&#xff0c;\u82e5\u4f20\u8f93\u6570\u636e\u91cf\u8f83\u5927&#xff0c;\u6613\u964d\u4f4e\u7cfb\u7edf\u6027\u80fd&#xff1b;<\/li>\n<li>Netlink \u652f\u6301\u591a\u64ad\u7279\u6027&#xff0c;\u5f52\u5c5e\u540c\u4e00 Netlink \u7ec4\u7684\u6a21\u5757\u4e0e\u8fdb\u7a0b\u5747\u53ef\u63a5\u6536\u8be5\u7ec4\u7684\u591a\u64ad\u6d88\u606f&#xff1b;<\/li>\n<li>Netlink \u5141\u8bb8\u5185\u6838\u4e3b\u52a8\u53d1\u8d77\u4f1a\u8bdd&#xff0c;\u800c ioctl \u4e0e\u7cfb\u7edf\u8c03\u7528\u4ec5\u80fd\u7531\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u53d1\u8d77\u3002<\/li>\n<p>\u5185\u6838\u6e90\u7801\u4e2d\u5173\u4e8e Netlink \u534f\u8bae\u7684\u5934\u6587\u4ef6\u5b9a\u4e49\u4e86\u9884\u5b9a\u4e49\u534f\u8bae\u7c7b\u578b&#xff0c;\u5177\u4f53\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ROUTE<\/span>         <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_W1<\/span>             <span class=\"token expression\"><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_USERSOCK<\/span>     <span class=\"token expression\"><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIREWALL<\/span>      <span class=\"token expression\"><span class=\"token number\">3<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_INET_DIAG<\/span>     <span class=\"token expression\"><span class=\"token number\">4<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NFLOG<\/span>         <span class=\"token expression\"><span class=\"token number\">5<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_XFRM<\/span>          <span class=\"token expression\"><span class=\"token number\">6<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SELINUX<\/span>       <span class=\"token expression\"><span class=\"token number\">7<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ISCSI<\/span>           <span class=\"token expression\"><span class=\"token number\">8<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_AUDIT<\/span>          <span class=\"token expression\"><span class=\"token number\">9<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIB_LOOKUP<\/span>    <span class=\"token expression\"><span class=\"token number\">10<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CONNECTOR<\/span>    <span class=\"token expression\"><span class=\"token number\">11<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NETFILTER<\/span>      <span class=\"token expression\"><span class=\"token number\">12<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_IP6_FW<\/span>          <span class=\"token expression\"><span class=\"token number\">13<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_DNRTMSG<\/span>       <span class=\"token expression\"><span class=\"token number\">14<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_KOBJECT_UEVENT<\/span> <span class=\"token expression\"><span class=\"token number\">15<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_GENERIC<\/span>        <span class=\"token expression\"><span class=\"token number\">16<\/span><\/span><\/span><\/p>\n<p>\u4e0a\u8ff0\u534f\u8bae\u5df2\u9002\u914d\u4e0d\u540c\u7684\u7cfb\u7edf\u5e94\u7528\u573a\u666f&#xff0c;\u6bcf\u79cd\u5e94\u7528\u5747\u6709\u4e13\u5c5e\u7684\u4f20\u8f93\u6570\u636e\u683c\u5f0f\u3002\u82e5\u7528\u6237\u65e0\u9700\u4f7f\u7528\u8fd9\u4e9b\u9884\u5b9a\u4e49\u534f\u8bae&#xff0c;\u53ef\u65b0\u589e\u81ea\u5b9a\u4e49\u534f\u8bae\u53f7\u3002\u9488\u5bf9\u6bcf\u4e2a Netlink \u534f\u8bae\u7c7b\u578b&#xff0c;\u6700\u591a\u53ef\u8bbe\u7f6e 32 \u4e2a\u591a\u64ad\u7ec4&#xff0c;\u6bcf\u4e2a\u591a\u64ad\u7ec4\u7531 1 \u4e2a\u6bd4\u7279\u4f4d\u6807\u8bc6\u3002Netlink \u7684\u591a\u64ad\u7279\u6027\u4f7f\u5f97\u5411\u540c\u4e00\u7ec4\u53d1\u9001\u6d88\u606f\u4ec5\u9700\u4e00\u6b21\u7cfb\u7edf\u8c03\u7528&#xff0c;\u5bf9\u4e8e\u9700\u4f20\u8f93\u591a\u64ad\u6d88\u606f\u7684\u5e94\u7528\u800c\u8a00&#xff0c;\u53ef\u663e\u8457\u964d\u4f4e\u7cfb\u7edf\u8c03\u7528\u6b21\u6570\u3002<\/p>\n<p>\u5efa\u7acb Netlink \u4f1a\u8bdd\u7684\u6d41\u7a0b\u5982\u4e0b&#xff1a; <img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a666098921.jpg\" alt=\"img\" \/><\/p>\n<p>\u5185\u6838\u901a\u8fc7\u4e00\u5957\u4e0e\u6807\u51c6 Socket API \u76f8\u4f3c\u7684\u63a5\u53e3\u5b8c\u6210\u901a\u4fe1\u8fc7\u7a0b&#xff0c;\u9996\u5148\u8c03\u7528 netlink_kernel_create() \u521b\u5efa\u5957\u63a5\u5b57&#xff0c;\u8be5\u51fd\u6570\u539f\u578b\u4e3a&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token keyword\">int<\/span> unit<span class=\"token punctuation\">,<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span> groups<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">mutex<\/span> <span class=\"token operator\">*<\/span>cb_mutex<span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">module<\/span> <span class=\"token operator\">*<\/span>module<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5176\u4e2d&#xff0c;net \u53c2\u6570\u4e3a\u7f51\u7edc\u8bbe\u5907\u547d\u540d\u7a7a\u95f4\u6307\u9488&#xff1b;input \u51fd\u6570\u4e3a Netlink Socket \u63a5\u6536\u6d88\u606f\u65f6\u89e6\u53d1\u7684\u56de\u8c03\u51fd\u6570\u6307\u9488&#xff1b;module \u53c2\u6570\u9ed8\u8ba4\u503c\u4e3a THIS_MODULE\u3002<\/p>\n<p>\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u5219\u901a\u8fc7\u6807\u51c6 Socket API \u521b\u5efa\u5957\u63a5\u5b57&#xff0c;\u5e76\u5c06\u8fdb\u7a0b ID \u53d1\u9001\u81f3\u5185\u6838\u7a7a\u95f4\u3002\u7528\u6237\u7a7a\u95f4\u8c03\u7528 socket() \u521b\u5efa\u5957\u63a5\u5b57&#xff0c;\u51fd\u6570\u539f\u578b\u4e3a&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> domain<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> type<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> protocol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5176\u4e2d&#xff0c;domain \u53c2\u6570\u53d6\u503c\u4e3a PF_NETLINK&#xff08;\u5373 Netlink \u534f\u8bae\u65cf&#xff09;&#xff1b;protocol \u53c2\u6570\u4e3a Netlink \u9884\u5b9a\u4e49\u534f\u8bae&#xff08;\u5982 NETLINK_ROUTE\u3001NETLINK_FIREWALL\u3001NETLINK_ARPD\u3001NETLINK_ROUTE6\u3001NETLINK_IP6_FW&#xff09;\u6216\u7528\u6237\u81ea\u5b9a\u4e49\u534f\u8bae\u3002<\/p>\n<p>\u968f\u540e\u8c03\u7528 bind() \u51fd\u6570\u5b8c\u6210\u7ed1\u5b9a\u64cd\u4f5c\u3002Netlink \u7684 bind() \u51fd\u6570\u5c06\u672c\u5730 Socket \u5730\u5740&#xff08;\u6e90 Socket \u5730\u5740&#xff09;\u4e0e\u5df2\u6253\u5f00\u7684 Socket \u5173\u8054&#xff0c;\u7ed1\u5b9a\u5b8c\u6210\u4e14\u5185\u6838\u7a7a\u95f4\u63a5\u6536\u7528\u6237\u8fdb\u7a0b ID \u540e&#xff0c;\u5373\u53ef\u5f00\u5c55\u53cc\u5411\u901a\u4fe1\u3002<\/p>\n<p>\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u901a\u8fc7\u6807\u51c6 Socket API \u4e2d\u7684 sendmsg() \u51fd\u6570\u53d1\u9001\u6570\u636e&#xff0c;\u8c03\u7528\u65f6\u9700\u6784\u9020 struct msghdr \u6d88\u606f\u7ed3\u6784\u4e0e nlmsghdr \u6d88\u606f\u5934\u3002Netlink \u6d88\u606f\u4f53\u7531 nlmsghdr \u6d88\u606f\u5934\u548c\u6d88\u606f\u8f7d\u8377&#xff08;payload&#xff09;\u7ec4\u6210&#xff0c;\u8f93\u5165\u6d88\u606f\u540e&#xff0c;\u5185\u6838\u4f1a\u8bbf\u95ee nlmsghdr \u6307\u5411\u7684\u7f13\u51b2\u533a\u3002<\/p>\n<p>\u5185\u6838\u7a7a\u95f4\u901a\u8fc7\u72ec\u7acb\u521b\u5efa\u7684 sk_buff \u7f13\u51b2\u533a\u53d1\u9001\u6570\u636e&#xff0c;Linux \u5b9a\u4e49\u4ee5\u4e0b\u5b8f\u7528\u4e8e\u7b80\u5316\u7f13\u51b2\u533a\u5730\u5740\u914d\u7f6e&#xff1a; #define \\\\ NETLINK_CB(skb) \\\\ ((struct \\\\ netlink_skb_parms) &amp;((skb)-&gt;cb))$$<\/p>\n<p>\u7f13\u51b2\u533a\u5b8c\u6210\u6d88\u606f\u5730\u5740\u914d\u7f6e\u540e&#xff0c;\u53ef\u8c03\u7528 netlink_unicast() \u53d1\u9001\u5355\u64ad\u6d88\u606f&#xff0c;\u8be5\u51fd\u6570\u539f\u578b\u4e3a&#xff1a; int netlink_unicast(struct sock *sk, struct sk_buff *skb, u32 pid, int nonblock); \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>sk&#xff1a;netlink_kernel_create() \u51fd\u6570\u8fd4\u56de\u7684 Socket \u6307\u9488&#xff1b;<\/li>\n<li>skb&#xff1a;\u5b58\u50a8\u5f85\u53d1\u9001\u6d88\u606f\u7684\u7f13\u51b2\u533a&#xff0c;\u5176 data \u5b57\u6bb5\u6307\u5411 Netlink \u6d88\u606f\u7ed3\u6784&#xff0c;\u63a7\u5236\u5757\u4fdd\u5b58\u6d88\u606f\u5730\u5740\u4fe1\u606f&#xff08;\u53ef\u901a\u8fc7 NETLINK_CB(skb) \u5b8f\u914d\u7f6e&#xff09;&#xff1b;<\/li>\n<li>pid&#xff1a;\u63a5\u6536\u6d88\u606f\u8fdb\u7a0b\u7684\u8fdb\u7a0b ID&#xff1b;<\/li>\n<li>nonblock&#xff1a;\u51fd\u6570\u662f\u5426\u4e3a\u975e\u963b\u585e\u6a21\u5f0f&#xff08;\u53d6\u503c 1 \u65f6&#xff0c;\u65e0\u53ef\u7528\u63a5\u6536\u7f13\u5b58\u5219\u7acb\u5373\u8fd4\u56de&#xff1b;\u53d6\u503c 0 \u65f6&#xff0c;\u65e0\u53ef\u7528\u63a5\u6536\u7f13\u5b58\u5219\u8fdb\u5165\u7761\u7720\u72b6\u6001&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u5185\u6838\u6a21\u5757\u6216\u5b50\u7cfb\u7edf\u53ef\u8c03\u7528 netlink_broadcast() \u53d1\u9001\u5e7f\u64ad\u6d88\u606f&#xff0c;\u51fd\u6570\u539f\u578b\u4e3a&#xff1a; void netlink_broadcast(struct sock *sk, struct sk_buff *skb, u32 pid, u32 group, int allocation); \u524d 3 \u4e2a\u53c2\u6570\u4e0e netlink_unicast() \u4e00\u81f4&#xff1b;group \u4e3a\u63a5\u6536\u6d88\u606f\u7684\u591a\u64ad\u7ec4\u6807\u8bc6&#xff08;\u9700\u5411\u591a\u4e2a\u591a\u64ad\u7ec4\u53d1\u9001\u6d88\u606f\u65f6&#xff0c;\u53d6\u503c\u4e3a\u591a\u4e2a\u7ec4 ID \u7684\u6309\u4f4d\u6216\u7ed3\u679c&#xff09;&#xff1b;allocation \u4e3a\u5185\u6838\u5185\u5b58\u5206\u914d\u7c7b\u578b&#xff08;\u5e38\u7528 GFP_ATOMIC \u6216 GFP_KERNEL&#xff0c;\u524d\u8005\u9002\u7528\u4e8e\u539f\u5b50\u4e0a\u4e0b\u6587&#xff08;\u4e0d\u53ef\u7761\u7720&#xff09;&#xff0c;\u540e\u8005\u9002\u7528\u4e8e\u975e\u539f\u5b50\u4e0a\u4e0b\u6587&#xff09;\u3002<\/p>\n<p>\u63a5\u6536\u6570\u636e\u65f6&#xff0c;\u7a0b\u5e8f\u9700\u7533\u8bf7\u8db3\u591f\u5927\u5c0f\u7684\u5185\u5b58\u7a7a\u95f4&#xff0c;\u4ee5\u5b58\u50a8 Netlink \u6d88\u606f\u5934\u4e0e\u6d88\u606f\u8f7d\u8377&#xff0c;\u968f\u540e\u8c03\u7528\u6807\u51c6\u51fd\u6570 recvmsg() \u63a5\u6536\u6d88\u606f\u3002<\/p>\n<h4>4 Netlink \u901a\u4fe1\u8fc7\u7a0b<\/h4>\n<h5>4.1 \u8c03\u8bd5\u73af\u5883\u4e0e\u5de5\u5177<\/h5>\n<p>\u8c03\u8bd5\u5e73\u53f0&#xff1a;Vmware 5.5 &#043; Fedora Core 10&#xff08;\u4e24\u53f0\u4e3b\u673a&#xff0c;\u5206\u522b\u4f5c\u4e3a host \u673a\u4e0e target \u673a&#xff09;&#xff1b; \u8c03\u8bd5\u5de5\u5177&#xff1a;KGDB&#043;GDB \u7ec4\u5408&#xff08;Linux \u5185\u6838 2.6.26 \u53ca\u4ee5\u4e0a\u7248\u672c\u5185\u7f6e KGDB \u9009\u9879&#xff0c;\u7f16\u8bd1\u5185\u6838\u65f6\u9700\u542f\u7528\u76f8\u5173\u914d\u7f6e&#xff1b;\u8c03\u8bd5\u65f6 host \u7aef\u4f7f\u7528\u5e26\u7b26\u53f7\u8868\u7684 vmlinz \u5185\u6838&#xff0c;target \u7aef\u901a\u8fc7 GDB \u8c03\u8bd5\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f&#xff09;\u3002<\/p>\n<h5>4.2 \u8c03\u8bd5\u7a0b\u5e8f\u5b9e\u73b0<\/h5>\n<p>\u8c03\u8bd5\u7a0b\u5e8f\u5206\u4e3a\u5185\u6838\u6a21\u5757\u4e0e\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f\u4e24\u90e8\u5206&#xff1a;\u5185\u6838\u6a21\u5757\u52a0\u8f7d\u540e&#xff0c;\u8fd0\u884c\u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f&#xff0c;\u7531\u7528\u6237\u7a7a\u95f4\u53d1\u8d77 Netlink \u4f1a\u8bdd&#xff0c;\u4e0e\u5185\u6838\u6a21\u5757\u5b8c\u6210\u6570\u636e\u4ea4\u6362\u3002<\/p>\n<h6>4.2.1 \u7528\u6237\u7a7a\u95f4\u7a0b\u5e8f\u5173\u952e\u4ee3\u7801<\/h6>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">send_pck_to_kern<\/span><span class=\"token punctuation\">(<\/span>u8 op<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> u8 <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">,<\/span> u16 data_len<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_data_<\/span> <span class=\"token operator\">*<\/span>pck<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> ret<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5206\u914d\u5185\u5b58\u5e76\u521d\u59cb\u5316<\/span><br \/>\n    pck <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_data_<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">calloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>pck<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>pck<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;calloc in %s failed!!!\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> __FUNCTION__<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u586b\u5145\u6d88\u606f\u7ed3\u6784\u4f53<\/span><br \/>\n    pck<span class=\"token operator\">-&gt;<\/span>magic_num <span class=\"token operator\">&#061;<\/span> MAGIC_NUM_RNQ<span class=\"token punctuation\">;<\/span><br \/>\n    pck<span class=\"token operator\">-&gt;<\/span>op <span class=\"token operator\">&#061;<\/span> op<span class=\"token punctuation\">;<\/span><br \/>\n    pck<span class=\"token operator\">-&gt;<\/span>data_len <span class=\"token operator\">&#061;<\/span> data_len<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>pck<span class=\"token operator\">-&gt;<\/span>data<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u53d1\u9001\u6570\u636e\u81f3\u5185\u6838<\/span><br \/>\n    ret <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">send_to_kern<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> u8<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>pck<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>pck<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>ret<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send_to_kern in %s failed!!!\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> __FUNCTION__<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u91ca\u653e\u5185\u5b58<\/span><br \/>\n    <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span>pck<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ret <span class=\"token operator\">?<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">recv_from_nl<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> buf<span class=\"token punctuation\">[<\/span><span class=\"token number\">1000<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span>buf<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> sa<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nh<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u6d88\u606f\u5934<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    msg<span class=\"token punctuation\">.<\/span>msg_name <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>sa<span class=\"token punctuation\">;<\/span><br \/>\n    msg<span class=\"token punctuation\">.<\/span>msg_namelen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>sa<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    msg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\n    msg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u63a5\u6536\u5185\u6838\u6d88\u606f<\/span><br \/>\n    len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recvmsg<\/span><span class=\"token punctuation\">(<\/span>nl_sock<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89e3\u6790\u63a5\u6536\u5230\u7684\u6d88\u606f<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>nh <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>buf<span class=\"token punctuation\">;<\/span> <span class=\"token function\">NLMSG_OK<\/span><span class=\"token punctuation\">(<\/span>nh<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> nh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_NEXT<\/span> <span class=\"token punctuation\">(<\/span>nh<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u591a\u6bb5\u6d88\u606f\u7ed3\u675f\u6807\u8bc6<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nh<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;&#061;<\/span> NLMSG_DONE<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">puts<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;nh-&gt;nlmsg_type &#061;&#061; NLMSG_DONE&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6d88\u606f\u9519\u8bef\u6807\u8bc6<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>nh<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;&#061;<\/span> NLMSG_ERROR<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token function\">puts<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;nh-&gt;nlmsg_type &#061;&#061; NLMSG_ERROR&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">if<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n        <span class=\"token comment\">\/\/ \u6253\u5370\u4ece\u5185\u6838\u63a5\u6536\u7684\u6570\u636e<\/span><br \/>\n        <span class=\"token function\">puts<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Data received from kernel:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">hex_dump<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>u8<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">NLMSG_PAYLOAD<\/span><span class=\"token punctuation\">(<\/span>nh<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>4.2.2 \u5185\u6838\u6a21\u5757\u5173\u952e\u4ee3\u7801<\/h6>\n<p>\u5185\u6838\u6a21\u5757\u9700\u9632\u6b62\u8d44\u6e90\u62a2\u5360&#xff0c;\u786e\u4fdd Netlink \u8d44\u6e90\u7684\u4e92\u65a5\u8bbf\u95ee&#xff0c;\u5173\u952e\u4ee3\u7801\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">nl_rcv<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u52a0\u9501\u4fdd\u8bc1\u8d44\u6e90\u4e92\u65a5\u8bbf\u95ee<\/span><br \/>\n    <span class=\"token function\">mutex_lock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>nl_mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">netlink_rcv_skb<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>nl_rcv_msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">mutex_unlock<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>nl_mtx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">nl_send_msg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> u8 <span class=\"token operator\">*<\/span>data<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> data_len<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>rep<span class=\"token punctuation\">;<\/span><br \/>\n    u8 <span class=\"token operator\">*<\/span>res<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u53c2\u6570\u5408\u6cd5\u6027\u6821\u9a8c<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>g_pid <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">||<\/span> g_nl_sk <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Invalid parameter, g_pid &#061; %d, g_nl_sk &#061; %p\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> g_pid<span class=\"token punctuation\">,<\/span> g_nl_sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5206\u914d\u65b0\u7684sk_buff\u7f13\u51b2\u533a<\/span><br \/>\n    skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_new<\/span><span class=\"token punctuation\">(<\/span>data_len<span class=\"token punctuation\">,<\/span> GFP_KERNEL<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>skb<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;nlmsg_new failed!!!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u6253\u5370\u5f85\u53d1\u9001\u6570\u636e<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>g_debug_level <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Data to be send to user space:\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">hex_dump<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>data<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u586b\u5145Netlink\u6d88\u606f\u5934<\/span><br \/>\n    rep <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">__nlmsg_put<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">,<\/span> g_pid<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> NLMSG_NOOP<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    res <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_data<\/span><span class=\"token punctuation\">(<\/span>rep<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span>res<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u53d1\u9001\u5355\u64ad\u6d88\u606f\u81f3\u7528\u6237\u7a7a\u95f4<\/span><br \/>\n    <span class=\"token function\">netlink_unicast<\/span><span class=\"token punctuation\">(<\/span>g_nl_sk<span class=\"token punctuation\">,<\/span> skb<span class=\"token punctuation\">,<\/span> g_pid<span class=\"token punctuation\">,<\/span> MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">int<\/span> <span class=\"token function\">nl_rcv_msg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> u8 res_data<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;Hello, user&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token class-name\">size_t<\/span> data_len<span class=\"token punctuation\">;<\/span><br \/>\n    u8 <span class=\"token operator\">*<\/span>buf<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_data_<\/span> <span class=\"token operator\">*<\/span>pck<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_req<\/span> <span class=\"token operator\">*<\/span>req<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">*<\/span>match <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u83b7\u53d6\u53d1\u9001\u65b9\u8fdb\u7a0bID<\/span><br \/>\n    g_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>pid<span class=\"token punctuation\">;<\/span><br \/>\n    buf <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>u8<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    data_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_len<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6570\u636e\u957f\u5ea6\u6821\u9a8c<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>data_len <span class=\"token operator\">&lt;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_data_<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Too short data from user space!!!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u89e3\u6790\u7528\u6237\u7a7a\u95f4\u6d88\u606f<\/span><br \/>\n    pck <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">user_data_<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>buf<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>pck<span class=\"token operator\">-&gt;<\/span>magic_num <span class=\"token operator\">!&#061;<\/span> MAGIC_NUM_RNQ<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Magic number not matched!!!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u6253\u5370\u7528\u6237\u7a7a\u95f4\u6570\u636e<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>g_debug_level <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Data from user space:\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">hex_dump<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5339\u914d\u5bf9\u5e94\u7684\u8bf7\u6c42\u5904\u7406\u51fd\u6570<\/span><br \/>\n    req <span class=\"token operator\">&#061;<\/span> user_reqs<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token operator\">-&gt;<\/span>op<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>req<span class=\"token operator\">-&gt;<\/span>op <span class=\"token operator\">&#061;&#061;<\/span> pck<span class=\"token operator\">-&gt;<\/span>op<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            match <span class=\"token operator\">&#061;<\/span> req<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        req<span class=\"token operator\">&#043;&#043;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u6267\u884c\u5339\u914d\u7684\u5904\u7406\u51fd\u6570<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>match<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        match<span class=\"token operator\">-&gt;<\/span><span class=\"token function\">handler<\/span><span class=\"token punctuation\">(<\/span>buf<span class=\"token punctuation\">,<\/span> data_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u5411\u7528\u6237\u7a7a\u95f4\u56de\u590d\u6d88\u606f<\/span><br \/>\n    <span class=\"token function\">nl_send_msg<\/span><span class=\"token punctuation\">(<\/span>res_data<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>res_data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>5 \u5176\u4ed6\u76f8\u5173\u8bf4\u660e<\/h4>\n<p>Netlink \u662f Linux \u7279\u6709\u7684\u4e00\u79cd\u4e13\u7528 Socket&#xff0c;\u529f\u80fd\u7c7b\u4f3c\u4e8e BSD \u7cfb\u7edf\u4e2d\u7684 AF_ROUTE&#xff0c;\u4f46\u5177\u5907\u66f4\u4e30\u5bcc\u7684\u529f\u80fd\u3002\u5728 Linux 2.6.14 \u5185\u6838\u7248\u672c\u4e2d&#xff0c;\u5927\u91cf\u5e94\u7528\u901a\u8fc7 Netlink \u5b9e\u73b0\u5e94\u7528\u5c42\u4e0e\u5185\u6838\u5c42\u7684\u901a\u4fe1&#xff0c;\u5178\u578b\u573a\u666f\u5305\u62ec&#xff1a;<\/p>\n<ul>\n<li>\u8def\u7531\u5b88\u62a4\u8fdb\u7a0b&#xff08;NETLINK_ROUTE&#xff09;&#xff1b;<\/li>\n<li>1-wire \u5b50\u7cfb\u7edf&#xff08;NETLINK_W1&#xff09;&#xff1b;<\/li>\n<li>\u7528\u6237\u6001 Socket \u534f\u8bae&#xff08;NETLINK_USERSOCK&#xff09;&#xff1b;<\/li>\n<li>\u9632\u706b\u5899&#xff08;NETLINK_FIREWALL&#xff09;&#xff1b;<\/li>\n<li>Socket \u76d1\u63a7&#xff08;NETLINK_INET_DIAG&#xff09;&#xff1b;<\/li>\n<li>netfilter \u65e5\u5fd7&#xff08;NETLINK_NFLOG&#xff09;&#xff1b;<\/li>\n<li>IPsec \u5b89\u5168\u7b56\u7565&#xff08;NETLINK_XFRM&#xff09;&#xff1b;<\/li>\n<li>SELinux \u4e8b\u4ef6\u901a\u77e5&#xff08;NETLINK_SELINUX&#xff09;&#xff1b;<\/li>\n<li>iSCSI \u5b50\u7cfb\u7edf&#xff08;NETLINK_ISCSI&#xff09;&#xff1b;<\/li>\n<li>\u8fdb\u7a0b\u5ba1\u8ba1&#xff08;NETLINK_AUDIT&#xff09;&#xff1b;<\/li>\n<li>\u8f6c\u53d1\u4fe1\u606f\u8868\u67e5\u8be2&#xff08;NETLINK_FIB_LOOKUP&#xff09;&#xff1b;<\/li>\n<li>Netlink \u8fde\u63a5\u5668&#xff08;NETLINK_CONNECTOR&#xff09;&#xff1b;<\/li>\n<li>netfilter \u5b50\u7cfb\u7edf&#xff08;NETLINK_NETFILTER&#xff09;&#xff1b;<\/li>\n<li>IPv6 \u9632\u706b\u5899&#xff08;NETLINK_IP6_FW&#xff09;&#xff1b;<\/li>\n<li>DECnet \u8def\u7531\u4fe1\u606f&#xff08;NETLINK_DNRTMSG&#xff09;&#xff1b;<\/li>\n<li>\u5185\u6838\u4e8b\u4ef6\u5411\u7528\u6237\u6001\u901a\u77e5&#xff08;NETLINK_KOBJECT_UEVENT&#xff09;&#xff1b;<\/li>\n<li>\u901a\u7528 Netlink&#xff08;NETLINK_GENERIC&#xff09;\u3002<\/li>\n<\/ul>\n<p>Netlink \u662f\u5b9e\u73b0\u5185\u6838\u4e0e\u7528\u6237\u5e94\u7528\u95f4\u53cc\u5411\u6570\u636e\u4f20\u8f93\u7684\u9ad8\u6548\u65b9\u5f0f&#xff1a;\u7528\u6237\u6001\u5e94\u7528\u53ef\u901a\u8fc7\u6807\u51c6 Socket API \u8c03\u7528 Netlink \u7684\u529f\u80fd&#xff0c;\u5185\u6838\u6001\u5219\u9700\u901a\u8fc7\u4e13\u7528\u5185\u6838 API \u5b9e\u73b0 Netlink \u901a\u4fe1\u3002<\/p>\n<p>\u76f8\u8f83\u4e8e\u7cfb\u7edf\u8c03\u7528\u3001ioctl \u53ca \/proc \u6587\u4ef6\u7cfb\u7edf&#xff0c;Netlink \u5177\u5907\u4ee5\u4e0b\u4f18\u52bf&#xff1a;<\/p>\n<li>\u4f7f\u7528 Netlink \u65f6&#xff0c;\u4ec5\u9700\u5728 include\/linux\/netlink.h \u4e2d\u65b0\u589e Netlink \u534f\u8bae\u5b9a\u4e49&#xff08;\u5982 #define NETLINK_MYTEST 17&#xff09;&#xff0c;\u5185\u6838\u4e0e\u7528\u6237\u6001\u5e94\u7528\u5373\u53ef\u901a\u8fc7 Socket API \u57fa\u4e8e\u8be5\u534f\u8bae\u5b8c\u6210\u6570\u636e\u4ea4\u6362&#xff1b;\u800c\u65b0\u589e\u7cfb\u7edf\u8c03\u7528\u9700\u4fee\u6539\u5185\u6838\u6e90\u7801\u5e76\u9759\u6001\u7f16\u8bd1&#xff0c;ioctl \u9700\u65b0\u589e\u8bbe\u5907\/\u6587\u4ef6&#xff0c;\/proc \u6587\u4ef6\u7cfb\u7edf\u9700\u65b0\u589e\u6587\u4ef6\/\u76ee\u5f55&#xff0c;\u5747\u4f1a\u589e\u52a0\u5f00\u53d1\u6210\u672c\u6216\u5bfc\u81f4 \/proc \u76ee\u5f55\u7ed3\u6784\u6df7\u4e71&#xff1b;<\/li>\n<li>Netlink \u4e3a\u5f02\u6b65\u901a\u4fe1\u673a\u5236&#xff0c;\u5185\u6838\u4e0e\u7528\u6237\u6001\u5e94\u7528\u95f4\u7684\u6d88\u606f\u5b58\u50a8\u4e8e Socket \u7f13\u5b58\u961f\u5217&#xff0c;\u53d1\u9001\u6d88\u606f\u4ec5\u9700\u5c06\u5176\u5b58\u5165\u63a5\u6536\u8005\u7684 Socket \u63a5\u6536\u961f\u5217&#xff0c;\u65e0\u9700\u7b49\u5f85\u63a5\u6536\u65b9\u786e\u8ba4&#xff1b;\u800c\u7cfb\u7edf\u8c03\u7528\u4e0e ioctl \u4e3a\u540c\u6b65\u901a\u4fe1\u673a\u5236&#xff0c;\u4f20\u8f93\u5927\u5c3a\u5bf8\u6570\u636e\u65f6\u4f1a\u5f71\u54cd\u7cfb\u7edf\u8c03\u5ea6\u7c92\u5ea6&#xff1b;<\/li>\n<li>\u57fa\u4e8e Netlink \u7684\u5185\u6838\u6a21\u5757\u53ef\u52a8\u6001\u52a0\u8f7d&#xff0c;\u5e94\u7528\u5c42\u4e0e\u5185\u6838\u5c42\u65e0\u7f16\u8bd1\u671f\u4f9d\u8d56&#xff1b;\u800c\u65b0\u589e\u7cfb\u7edf\u8c03\u7528\u9700\u9759\u6001\u94fe\u63a5\u81f3\u5185\u6838&#xff0c;\u65e0\u6cd5\u901a\u8fc7\u6a21\u5757\u5b9e\u73b0&#xff0c;\u4e14\u5e94\u7528\u5c42\u7f16\u8bd1\u65f6\u9700\u4f9d\u8d56\u5185\u6838\u5934\u6587\u4ef6&#xff1b;<\/li>\n<li>Netlink \u652f\u6301\u591a\u64ad\u7279\u6027&#xff0c;\u5185\u6838\u6a21\u5757\u6216\u5e94\u7528\u53ef\u5c06\u6d88\u606f\u591a\u64ad\u81f3\u6307\u5b9a Netlink \u7ec4&#xff0c;\u5f52\u5c5e\u8be5\u7ec4\u7684\u6240\u6709\u5185\u6838\u6a21\u5757\/\u5e94\u7528\u5747\u53ef\u63a5\u6536\u6d88\u606f&#xff08;\u5185\u6838\u4e8b\u4ef6\u5411\u7528\u6237\u6001\u901a\u77e5\u673a\u5236\u5373\u57fa\u4e8e\u6b64\u7279\u6027&#xff09;&#xff1b;<\/li>\n<li>\u5185\u6838\u53ef\u4e3b\u52a8\u53d1\u8d77 Netlink \u4f1a\u8bdd&#xff0c;\u800c\u7cfb\u7edf\u8c03\u7528\u4e0e ioctl \u4ec5\u80fd\u7531\u7528\u6237\u5e94\u7528\u53d1\u8d77&#xff1b;<\/li>\n<li>Netlink \u57fa\u4e8e\u6807\u51c6 Socket API \u5b9e\u73b0&#xff0c;\u5f00\u53d1\u95e8\u69db\u4f4e&#xff1b;\u800c\u7cfb\u7edf\u8c03\u7528\u4e0e ioctl \u9700\u638c\u63e1\u4e13\u7528\u5f00\u53d1\u89c4\u8303&#xff0c;\u5b66\u4e60\u6210\u672c\u66f4\u9ad8\u3002<\/li>\n<h4>\u7528\u6237\u6001\u4f7f\u7528 Netlink<\/h4>\n<p>\u7528\u6237\u6001\u5e94\u7528\u53ef\u901a\u8fc7\u6807\u51c6 Socket API&#xff08;socket()\u3001bind()\u3001sendmsg()\u3001recvmsg()\u3001close()&#xff09;\u4fbf\u6377\u4f7f\u7528 Netlink Socket&#xff0c;\u9700\u5305\u542b\u5934\u6587\u4ef6 linux\/netlink.h \u4e0e sys\/socket.h&#xff08;Socket \u57fa\u7840\u5934\u6587\u4ef6&#xff09;\u3002<\/p>\n<h5>5.1 \u521b\u5efa Netlink Socket<\/h5>\n<p>\u8c03\u7528 socket() \u51fd\u6570\u521b\u5efa Netlink Socket&#xff0c;\u539f\u578b\u5982\u4e0b&#xff1a; <span class=\"katex--display\">KaTeX parse error: Expected &#039;EOF&#039;, got &#039;_&#039; at position 16: \\\\text{socket(AF_\u0332NETLINK, SOCK_R\u2026<\/span> \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>\u7b2c\u4e00\u4e2a\u53c2\u6570&#xff1a;\u5fc5\u987b\u4e3a AF_NETLINK \u6216 PF_NETLINK&#xff08;Linux \u4e2d\u4e8c\u8005\u7b49\u4ef7&#xff09;&#xff0c;\u6807\u8bc6\u4f7f\u7528 Netlink \u534f\u8bae\u65cf&#xff1b;<\/li>\n<li>\u7b2c\u4e8c\u4e2a\u53c2\u6570&#xff1a;\u5fc5\u987b\u4e3a SOCK_RAW \u6216 SOCK_DGRAM&#xff1b;<\/li>\n<li>\u7b2c\u4e09\u4e2a\u53c2\u6570&#xff1a;\u6307\u5b9a Netlink \u534f\u8bae\u7c7b\u578b&#xff08;\u5982\u81ea\u5b9a\u4e49\u7684 NETLINK_MYTEST&#xff0c;\u6216\u901a\u7528\u534f\u8bae NETLINK_GENERIC&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u5185\u6838\u9884\u5b9a\u4e49\u7684 Netlink \u534f\u8bae\u7c7b\u578b\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ROUTE<\/span> <span class=\"token expression\"><span class=\"token number\">0<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_W1<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_USERSOCK<\/span> <span class=\"token expression\"><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIREWALL<\/span> <span class=\"token expression\"><span class=\"token number\">3<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_INET_DIAG<\/span> <span class=\"token expression\"><span class=\"token number\">4<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NFLOG<\/span> <span class=\"token expression\"><span class=\"token number\">5<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_XFRM<\/span> <span class=\"token expression\"><span class=\"token number\">6<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SELINUX<\/span> <span class=\"token expression\"><span class=\"token number\">7<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ISCSI<\/span> <span class=\"token expression\"><span class=\"token number\">8<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_AUDIT<\/span> <span class=\"token expression\"><span class=\"token number\">9<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIB_LOOKUP<\/span> <span class=\"token expression\"><span class=\"token number\">10<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CONNECTOR<\/span> <span class=\"token expression\"><span class=\"token number\">11<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NETFILTER<\/span> <span class=\"token expression\"><span class=\"token number\">12<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_IP6_FW<\/span> <span class=\"token expression\"><span class=\"token number\">13<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_DNRTMSG<\/span> <span class=\"token expression\"><span class=\"token number\">14<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_KOBJECT_UEVENT<\/span> <span class=\"token expression\"><span class=\"token number\">15<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_GENERIC<\/span> <span class=\"token expression\"><span class=\"token number\">16<\/span><\/span><\/span><\/p>\n<p>\u6bcf\u4e2a Netlink \u534f\u8bae\u7c7b\u578b\u6700\u591a\u652f\u6301 32 \u4e2a\u591a\u64ad\u7ec4&#xff0c;\u6bcf\u4e2a\u591a\u64ad\u7ec4\u7531 1 \u4e2a\u6bd4\u7279\u4f4d\u6807\u8bc6\u3002Netlink \u7684\u591a\u64ad\u7279\u6027\u53ef\u663e\u8457\u964d\u4f4e\u591a\u64ad\u573a\u666f\u4e0b\u7684\u7cfb\u7edf\u8c03\u7528\u6b21\u6570\u3002<\/p>\n<h5>5.2 \u7ed1\u5b9a Netlink Socket<\/h5>\n<p>bind() \u51fd\u6570\u7528\u4e8e\u5c06\u5df2\u6253\u5f00\u7684 Netlink Socket \u4e0e\u672c\u5730 Netlink \u5730\u5740\u7ed1\u5b9a&#xff0c;Netlink Socket \u5730\u5740\u7ed3\u6784\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token class-name\">sa_family_t<\/span> nl_family<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span> nl_pad<span class=\"token punctuation\">;<\/span><br \/>\n    __u32 nl_pid<span class=\"token punctuation\">;<\/span><br \/>\n    __u32 nl_groups<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5b57\u6bb5\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>nl_family&#xff1a;\u5fc5\u987b\u8bbe\u7f6e\u4e3a AF_NETLINK \u6216 PF_NETLINK&#xff1b;<\/li>\n<li>nl_pad&#xff1a;\u9884\u7559\u5b57\u6bb5&#xff0c;\u9700\u8bbe\u7f6e\u4e3a 0&#xff1b;<\/li>\n<li>nl_pid&#xff1a;\u63a5\u6536\/\u53d1\u9001\u6d88\u606f\u7684\u8fdb\u7a0b ID&#xff08;\u5185\u6838\u5904\u7406\/\u591a\u64ad\u6d88\u606f\u65f6\u8bbe\u4e3a 0&#xff0c;\u5426\u5219\u8bbe\u4e3a\u8fdb\u7a0b ID&#xff1b;\u591a\u7ebf\u7a0b\u573a\u666f\u4e0b\u53ef\u81ea\u5b9a\u4e49&#xff0c;\u5982 pthread_self() &lt;&lt; 16 | getpid()&#xff09;&#xff1b;<\/li>\n<li>nl_groups&#xff1a;\u591a\u64ad\u7ec4\u6807\u8bc6&#xff08;\u8bbe\u4e3a 0 \u8868\u793a\u4e0d\u52a0\u5165\u4efb\u4f55\u591a\u64ad\u7ec4&#xff09;\u3002<\/li>\n<\/ul>\n<p>bind() \u51fd\u6570\u8c03\u7528\u793a\u4f8b&#xff1a;<\/p>\n<p><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>nladdr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u5176\u4e2d&#xff0c;fd \u4e3a socket() \u51fd\u6570\u8fd4\u56de\u7684\u6587\u4ef6\u63cf\u8ff0\u7b26&#xff0c;nladdr \u4e3a struct sockaddr_nl \u7c7b\u578b\u7684\u5730\u5740\u7ed3\u6784\u4f53\u3002<\/p>\n<h5>5.3 \u53d1\u9001 Netlink \u6d88\u606f<\/h5>\n<p>\u5411\u5185\u6838\/\u5176\u4ed6\u7528\u6237\u6001\u5e94\u7528\u53d1\u9001 Netlink \u6d88\u606f\u65f6&#xff0c;\u9700\u6784\u9020\u76ee\u6807 Netlink \u5730\u5740\u3001struct msghdr\u3001struct nlmsghdr \u4e0e struct iovec \u7ed3\u6784\u4f53&#xff1a;<\/p>\n<h6>5.3.1 \u6d88\u606f\u5934\u4e0e\u5730\u5740\u914d\u7f6e<\/h6>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_name <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span>nladdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u76ee\u6807Netlink\u5730\u5740<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_namelen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>nladdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h6>5.3.2 Netlink \u6d88\u606f\u5934\u914d\u7f6e<\/h6>\n<p>struct nlmsghdr \u4e3a Netlink \u6d88\u606f\u5934&#xff08;\u63a7\u5236\u5757&#xff09;&#xff0c;\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __u32 nlmsg_len<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u6d88\u606f\u603b\u957f\u5ea6&#xff08;\u542b\u6d88\u606f\u5934&#043;\u8f7d\u8377&#xff09;<\/span><br \/>\n    __u16 nlmsg_type<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u5e94\u7528\u81ea\u5b9a\u4e49\u6d88\u606f\u7c7b\u578b&#xff08;\u5185\u6838\u900f\u4f20&#xff0c;\u901a\u5e38\u8bbe\u4e3a0&#xff09;<\/span><br \/>\n    __u16 nlmsg_flags<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u6d88\u606f\u6807\u5fd7&#xff08;\u666e\u901a\u573a\u666f\u8bbe\u4e3a0&#xff09;<\/span><br \/>\n    __u32 nlmsg_seq<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u6d88\u606f\u5e8f\u5217\u53f7&#xff08;\u5e94\u7528\u8ffd\u8e2a\u6d88\u606f\u7528&#xff09;<\/span><br \/>\n    __u32 nlmsg_pid<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u6d88\u606f\u53d1\u9001\u8fdb\u7a0bID<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u6d88\u606f\u6807\u5fd7&#xff08;nlmsg_flags&#xff09;\u53ef\u9009\u503c&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_REQUEST<\/span> <span class=\"token expression\"><span class=\"token number\">1<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_MULTI<\/span>     <span class=\"token expression\"><span class=\"token number\">2<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_ACK<\/span>        <span class=\"token expression\"><span class=\"token number\">4<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_ECHO<\/span>      <span class=\"token expression\"><span class=\"token number\">8<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_ROOT<\/span>     <span class=\"token expression\"><span class=\"token number\">0x100<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_MATCH<\/span>    <span class=\"token expression\"><span class=\"token number\">0x200<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_ATOMIC<\/span>  <span class=\"token expression\"><span class=\"token number\">0x400<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_DUMP<\/span>      <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>NLM_F_ROOT<span class=\"token operator\">|<\/span>NLM_F_MATCH<span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_REPLACE<\/span>  <span class=\"token expression\"><span class=\"token number\">0x100<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_EXCL<\/span>       <span class=\"token expression\"><span class=\"token number\">0x200<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_CREATE<\/span>   <span class=\"token expression\"><span class=\"token number\">0x400<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLM_F_APPEND<\/span>   <span class=\"token expression\"><span class=\"token number\">0x800<\/span><\/span><\/span><\/p>\n<h6>5.3.3 \u6d88\u606f\u8f7d\u8377\u4e0e\u53d1\u9001\u793a\u4f8b<\/h6>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_MSGSIZE<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span><\/span><\/span><br \/>\n<span class=\"token keyword\">char<\/span> buffer<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;An example message&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlhdr<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5206\u914d\u6d88\u606f\u7f13\u51b2\u533a<\/span><br \/>\nnlhdr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_MSGSIZE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u586b\u5145\u6d88\u606f\u8f7d\u8377<\/span><br \/>\n<span class=\"token function\">strcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlhdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8bbe\u7f6e\u6d88\u606f\u957f\u5ea6<\/span><br \/>\nnlhdr<span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_LENGTH<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>buffer<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u8bbe\u7f6e\u53d1\u9001\u8fdb\u7a0bID<\/span><br \/>\nnlhdr<span class=\"token operator\">-&gt;<\/span>nlmsg_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6d88\u606f\u6807\u5fd7\u8bbe\u4e3a0<\/span><br \/>\nnlhdr<span class=\"token operator\">-&gt;<\/span>nlmsg_flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6784\u9020iovec\u7ed3\u6784\u4f53<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov<span class=\"token punctuation\">;<\/span><br \/>\niov<span class=\"token punctuation\">.<\/span>iov_base <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlhdr<span class=\"token punctuation\">;<\/span><br \/>\niov<span class=\"token punctuation\">.<\/span>iov_len <span class=\"token operator\">&#061;<\/span> nlhdr<span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u53d1\u9001\u6d88\u606f<\/span><br \/>\n<span class=\"token function\">sendmsg<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>5.4 \u63a5\u6536 Netlink \u6d88\u606f<\/h5>\n<p>\u63a5\u6536\u6d88\u606f\u9700\u5148\u5206\u914d\u8db3\u591f\u5927\u7684\u7f13\u51b2\u533a&#xff0c;\u518d\u8c03\u7528 recvmsg() \u51fd\u6570&#xff0c;\u793a\u4f8b\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_NL_MSG_LEN<\/span> <span class=\"token expression\"><span class=\"token number\">1024<\/span><\/span><\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> nladdr<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">msghdr<\/span> msg<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">iovec<\/span> iov<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span> nlhdr<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5206\u914d\u7f13\u51b2\u533a<\/span><br \/>\nnlhdr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span>MAX_NL_MSG_LEN<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\niov<span class=\"token punctuation\">.<\/span>iov_base <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlhdr<span class=\"token punctuation\">;<\/span><br \/>\niov<span class=\"token punctuation\">.<\/span>iov_len <span class=\"token operator\">&#061;<\/span> MAX_NL_MSG_LEN<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u6d88\u606f\u5934<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_name <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span><span class=\"token punctuation\">(<\/span>nladdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_namelen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>nladdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_iov <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&amp;<\/span>iov<span class=\"token punctuation\">;<\/span><br \/>\nmsg<span class=\"token punctuation\">.<\/span>msg_iovlen <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u63a5\u6536\u6d88\u606f<\/span><br \/>\n<span class=\"token function\">recvmsg<\/span><span class=\"token punctuation\">(<\/span>fd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>msg<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u63a5\u6536\u5b8c\u6210\u540e&#xff1a;<\/p>\n<ul>\n<li>nlhdr \u6307\u5411\u6d88\u606f\u5934&#xff1b;<\/li>\n<li>nladdr \u5b58\u50a8\u6d88\u606f\u7684\u76ee\u6807\u5730\u5740&#xff1b;<\/li>\n<li>NLMSG_DATA(nlhdr) \u5b8f\u8fd4\u56de\u6d88\u606f\u8f7d\u8377\u7684\u9996\u5730\u5740\u3002<\/li>\n<\/ul>\n<h5>5.5 Netlink \u6d88\u606f\u5904\u7406\u5b8f<\/h5>\n<p>linux\/netlink.h \u5b9a\u4e49\u4e86\u4ee5\u4e0b\u5e38\u7528\u5b8f&#xff0c;\u7528\u4e8e\u7b80\u5316\u6d88\u606f\u5904\u7406&#xff1a;<\/p>\n<li>\n<p>\u5b57\u8282\u5bf9\u9f50\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\_ALIGNTO \\\\ <span class=\"token number\">4<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_ALIGN<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span>NLMSG\\\\_ALIGNTO<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> \\\\<span class=\"token operator\">&amp;<\/span> \\\\<span class=\"token function\">sim<\/span><span class=\"token punctuation\">(<\/span>NLMSG\\\\_ALIGNTO<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u83b7\u53d6\u4e0d\u5c0f\u4e8e len \u4e14\u6ee1\u8db3\u5b57\u8282\u5bf9\u9f50\u7684\u6700\u5c0f\u6570\u503c\u3002<\/p>\n<\/li>\n<li>\n<p>\u6d88\u606f\u957f\u5ea6\u8ba1\u7b97\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_LENGTH<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span>NLMSG\\\\<span class=\"token function\">_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> \\\\ nlmsghdr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u8ba1\u7b97\u8f7d\u8377\u957f\u5ea6\u4e3a len \u65f6\u7684\u6d88\u606f\u603b\u957f\u5ea6&#xff08;\u7528\u4e8e\u5206\u914d\u7f13\u51b2\u533a&#xff09;\u3002<\/p>\n<\/li>\n<li>\n<p>\u7f13\u51b2\u533a\u7a7a\u95f4\u8ba1\u7b97\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_SPACE<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ NLMSG\\\\<span class=\"token function\">_ALIGN<\/span><span class=\"token punctuation\">(<\/span>NLMSG\\\\<span class=\"token function\">_LENGTH<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u8fd4\u56de\u4e0d\u5c0f\u4e8e NLMSG_LENGTH(len) \u4e14\u5b57\u8282\u5bf9\u9f50\u7684\u6700\u5c0f\u6570\u503c&#xff08;\u7528\u4e8e\u7f13\u51b2\u533a\u5206\u914d&#xff09;\u3002<\/p>\n<\/li>\n<li>\n<p>\u8f7d\u8377\u5730\u5740\u83b7\u53d6\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlh<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> NLMSG\\\\<span class=\"token function\">_LENGTH<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u8fd4\u56de\u6d88\u606f\u8f7d\u8377\u7684\u9996\u5730\u5740\u3002<\/p>\n<\/li>\n<li>\n<p>\u4e0b\u4e00\u6761\u6d88\u606f\u83b7\u53d6\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_NEXT<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&#061;<\/span> NLMSG\\\\<span class=\"token function\">_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg\\\\_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> \\\\\\\\ <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> \\\\ nlmsghdr<span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> NLMSG\\\\<span class=\"token function\">_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg\\\\_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u83b7\u53d6\u4e0b\u4e00\u6761\u6d88\u606f\u7684\u9996\u5730\u5740&#xff0c;\u5e76\u66f4\u65b0\u5269\u4f59\u6d88\u606f\u957f\u5ea6\u3002<\/p>\n<\/li>\n<li>\n<p>\u6d88\u606f\u5408\u6cd5\u6027\u6821\u9a8c\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_OK<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> \\\\ nlmsghdr<span class=\"token punctuation\">)<\/span> \\\\<span class=\"token operator\">&amp;<\/span>\\\\<span class=\"token operator\">&amp;<\/span> \\\\\\\\ <span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg\\\\_len <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> \\\\ nlmsghdr<span class=\"token punctuation\">)<\/span> \\\\<span class=\"token operator\">&amp;<\/span>\\\\<span class=\"token operator\">&amp;<\/span> \\\\\\\\ <span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg\\\\_len <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u6821\u9a8c\u6d88\u606f\u957f\u5ea6\u662f\u5426\u5408\u6cd5\u3002<\/p>\n<\/li>\n<li>\n<p>\u8f7d\u8377\u957f\u5ea6\u8ba1\u7b97\u5b8f&#xff1a;<\/p>\n<p> <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NLMSG\\\\<span class=\"token function\">_PAYLOAD<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span> \\\\ <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg\\\\_len <span class=\"token operator\">&#8211;<\/span> NLMSG\\\\<span class=\"token function\">_SPACE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u8fd4\u56de\u6d88\u606f\u8f7d\u8377\u7684\u5b9e\u9645\u957f\u5ea6\u3002<\/p>\n<\/li>\n<h5>5.6 \u5173\u95ed Netlink Socket<\/h5>\n<p>\u8c03\u7528 close(fd) \u51fd\u6570\u5173\u95ed\u5df2\u6253\u5f00\u7684 Netlink Socket \u6587\u4ef6\u63cf\u8ff0\u7b26\u5373\u53ef\u3002<\/p>\n<h4>Netlink \u5185\u6838 API<\/h4>\n<p>Netlink \u7684\u5185\u6838\u5b9e\u73b0\u5728 net\/core\/af_netlink.c \u6587\u4ef6\u4e2d&#xff0c;\u5185\u6838\u6a21\u5757\u4f7f\u7528 Netlink \u9700\u5305\u542b linux\/netlink.h \u5934\u6587\u4ef6&#xff0c;\u5e76\u8c03\u7528\u4e13\u7528\u5185\u6838 API\u3002<\/p>\n<h5>6.1 \u65b0\u589e Netlink \u534f\u8bae\u7c7b\u578b<\/h5>\n<p>\u5982\u9700\u65b0\u589e\u81ea\u5b9a\u4e49 Netlink \u534f\u8bae\u7c7b\u578b&#xff0c;\u9700\u4fee\u6539 linux\/netlink.h&#xff0c;\u793a\u4f8b\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token expression\">\\\\ NETLINK\\\\_MYTEST \\\\ <span class=\"token number\">17<\/span><\/span><\/span><\/p>\n<p>\u4e5f\u53ef\u76f4\u63a5\u4f7f\u7528\u901a\u7528\u534f\u8bae\u7c7b\u578b NETLINK_GENERIC&#xff0c;\u65e0\u9700\u65b0\u589e\u5b9a\u4e49\u3002<\/p>\n<h5>6.2 \u521b\u5efa\u5185\u6838 Netlink Socket<\/h5>\n<p>\u8c03\u7528 netlink_kernel_create() \u51fd\u6570\u521b\u5efa\u5185\u6838\u6001 Netlink Socket&#xff0c;\u539f\u578b\u5982\u4e0b&#xff1a; <span class=\"katex--display\">KaTeX parse error: Expected &#039;EOF&#039;, got &#039;_&#039; at position 28: \u2026 sock * netlink_\u0332kernel_create(i\u2026<\/span> \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>unit&#xff1a;Netlink \u534f\u8bae\u7c7b\u578b&#xff08;\u5982 NETLINK_MYTEST&#xff09;&#xff1b;<\/li>\n<li>input&#xff1a;\u6d88\u606f\u5904\u7406\u56de\u8c03\u51fd\u6570&#xff08;Socket \u63a5\u6536\u6d88\u606f\u65f6\u89e6\u53d1&#xff09;\u3002<\/li>\n<\/ul>\n<h5>6.3 \u6d88\u606f\u5904\u7406\u56de\u8c03\u51fd\u6570<\/h5>\n<p>\u56de\u8c03\u51fd\u6570\u6709\u4e24\u79cd\u5b9e\u73b0\u65b9\u5f0f&#xff1a;<\/p>\n<h6>6.3.1 \u76f4\u63a5\u5904\u7406\u6d88\u606f&#xff08;\u9002\u7528\u4e8e\u77ed\u6d88\u606f&#xff09;<\/h6>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">input<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    u8 <span class=\"token operator\">*<\/span>data <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">skb_dequeue<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>sk<span class=\"token operator\">-&gt;<\/span>receive_queue<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>skb<span class=\"token operator\">-&gt;<\/span>data<span class=\"token punctuation\">;<\/span><br \/>\n        data <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ \u5904\u7406\u6d88\u606f\u8f7d\u8377<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>6.3.2 \u5524\u9192\u5185\u6838\u7ebf\u7a0b\u5904\u7406&#xff08;\u9002\u7528\u4e8e\u957f\u6d88\u606f&#xff09;<\/h6>\n<p><span class=\"token keyword\">void<\/span> <span class=\"token function\">input<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u5524\u9192\u7b49\u5f85\u961f\u5217\u4e2d\u7684\u5185\u6838\u7ebf\u7a0b<\/span><br \/>\n    <span class=\"token function\">wake_up_interruptible<\/span><span class=\"token punctuation\">(<\/span>sk<span class=\"token operator\">-&gt;<\/span>sk_sleep<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5185\u6838\u7ebf\u7a0b\u53ef\u901a\u8fc7 skb_recv_datagram(nl_sk) \u63a5\u6536\u6d88\u606f&#xff08;\u65e0\u6d88\u606f\u65f6\u8fdb\u5165\u7761\u7720\u72b6\u6001&#xff09;\u3002<\/p>\n<h5>6.4 \u5185\u6838\u6001\u53d1\u9001\u6d88\u606f<\/h5>\n<h6>6.4.1 \u5730\u5740\u914d\u7f6e<\/h6>\n<p>\u901a\u8fc7 NETLINK_CB(skb) \u5b8f\u914d\u7f6e\u6d88\u606f\u5730\u5740&#xff08;\u6e90\/\u76ee\u6807&#xff09;&#xff1a;<\/p>\n<p><span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u6e90\u5730\u5740&#xff08;\u5185\u6838\u8bbe\u4e3a0&#xff09;<\/span><br \/>\n<span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>dst_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u76ee\u6807\u8fdb\u7a0bID&#xff08;\u5185\u6838\/\u591a\u64ad\u8bbe\u4e3a0&#xff09;<\/span><br \/>\n<span class=\"token function\">NETLINK_CB<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>dst_group <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u76ee\u6807\u591a\u64ad\u7ec4&#xff08;\u5355\u64ad\u8bbe\u4e3a0&#xff09;<\/span><\/p>\n<h6>6.4.2 \u53d1\u9001\u5355\u64ad\u6d88\u606f<\/h6>\n<p>\u8c03\u7528 netlink_unicast() \u51fd\u6570&#xff08;\u539f\u578b\u89c1 3.2 \u8282&#xff09;\u3002<\/p>\n<h6>6.4.3 \u53d1\u9001\u5e7f\u64ad\u6d88\u606f<\/h6>\n<p>\u8c03\u7528 netlink_broadcast() \u51fd\u6570&#xff08;\u539f\u578b\u89c1 3.2 \u8282&#xff09;\u3002<\/p>\n<h5>6.5 \u91ca\u653e\u5185\u6838 Netlink Socket<\/h5>\n<p>\u8c03\u7528 sock_release() \u51fd\u6570\u91ca\u653e Socket&#xff0c;\u793a\u4f8b\u5982\u4e0b&#xff1a; <span class=\"katex--display\">KaTeX parse error: Expected &#039;EOF&#039;, got &#039;_&#039; at position 11: \\\\text{sock_\u0332release(sk-&gt;sk_\u2026<\/span> \u5176\u4e2d&#xff0c;sk \u4e3a netlink_kernel_create() \u51fd\u6570\u7684\u8fd4\u56de\u503c\u3002<\/p>\n<h5>6.6 \u793a\u4f8b\u7a0b\u5e8f\u8bf4\u660e<\/h5>\n<p>\u914d\u5957\u793a\u4f8b\u7a0b\u5e8f\u5305\u542b&#xff1a;<\/p>\n<ul>\n<li>\u5185\u6838\u6a21\u5757&#xff1a;netlink-exam-kern.c&#xff1b;<\/li>\n<li>\u7528\u6237\u6001\u7a0b\u5e8f&#xff1a;netlink-exam-user-recv.c&#xff08;\u63a5\u6536&#xff09;\u3001netlink-exam-user-send.c&#xff08;\u53d1\u9001&#xff09;\u3002<\/li>\n<\/ul>\n<p>\u8fd0\u884c\u6d41\u7a0b&#xff1a;<\/p>\n<li>\u52a0\u8f7d\u5185\u6838\u6a21\u5757&#xff1b;<\/li>\n<li>\u7ec8\u7aef 1 \u8fd0\u884c\u63a5\u6536\u7a0b\u5e8f&#xff1b;<\/li>\n<li>\u7ec8\u7aef 2 \u8fd0\u884c\u53d1\u9001\u7a0b\u5e8f&#xff08;\u8bfb\u53d6\u6307\u5b9a\u6587\u672c\u6587\u4ef6&#xff0c;\u901a\u8fc7 Netlink \u53d1\u9001\u81f3\u5185\u6838&#xff09;&#xff1b;<\/li>\n<li>\u5185\u6838\u6a21\u5757\u63a5\u6536\u6d88\u606f\u540e&#xff0c;\u901a\u8fc7 \/proc\/netlink_exam_buffer \u66b4\u9732\u6570\u636e&#xff0c;\u5e76\u5c06\u6d88\u606f\u56de\u4f20\u7ed9\u63a5\u6536\u7a0b\u5e8f&#xff1b;<\/li>\n<li>\u63a5\u6536\u7a0b\u5e8f\u6253\u5370\u6d88\u606f\u5185\u5bb9\u81f3\u5c4f\u5e55\u3002<\/li>\n<h4>\u603b\u7ed3<\/h4>\n<li>Netlink \u662f Linux \u7279\u6709\u7684\u57fa\u4e8e Socket \u7684\u53cc\u5411\u5f02\u6b65\u901a\u4fe1\u673a\u5236&#xff0c;\u652f\u6301\u591a\u64ad\u3001\u5185\u6838\u4e3b\u52a8\u53d1\u8d77\u4f1a\u8bdd&#xff0c;\u9002\u914d\u5185\u6838\u6001\u4e0e\u7528\u6237\u6001\u7684\u901a\u4fe1\u9700\u6c42&#xff0c;\u5728 2.6 \u53ca\u4ee5\u4e0a\u5185\u6838\u7248\u672c\u4e2d\u5e7f\u6cdb\u5e94\u7528&#xff1b;<\/li>\n<li>\u7528\u6237\u6001\u901a\u8fc7\u6807\u51c6 Socket API&#xff08;socket()\/bind()\/sendmsg()\/recvmsg()&#xff09;\u4f7f\u7528 Netlink&#xff0c;\u5185\u6838\u6001\u9700\u8c03\u7528\u4e13\u7528 API&#xff08;netlink_kernel_create()\/netlink_unicast() \u7b49&#xff09;&#xff1b;<\/li>\n<li>Netlink \u6d88\u606f\u7531 nlmsghdr \u5934\u548c\u8f7d\u8377\u7ec4\u6210&#xff0c;\u53ef\u901a\u8fc7\u5185\u6838\u9884\u5b9a\u4e49\u5b8f\u7b80\u5316\u6d88\u606f\u957f\u5ea6\u8ba1\u7b97\u3001\u8f7d\u8377\u89e3\u6790\u7b49\u64cd\u4f5c&#xff0c;\u76f8\u8f83\u4e8e\u7cfb\u7edf\u8c03\u7528\u3001ioctl \u7b49\u673a\u5236\u5177\u5907\u5f00\u53d1\u6210\u672c\u4f4e\u3001\u6027\u80fd\u4f18\u3001\u7075\u6d3b\u6027\u9ad8\u7684\u7279\u70b9\u3002<\/li>\n<hr \/>\n<h2>Linux \u5185\u6838 netlink \u673a\u5236 &#8211; \u7528\u6237\u7a7a\u95f4\u548c\u5185\u6838\u7a7a\u95f4\u6570\u636e\u4f20\u8f93<\/h2>\n<p>hinewcc \u539f\u521b\u5df2\u4e8e 2024-12-31 09:49:56 \u4fee\u6539<\/p>\n<h3>1 \u7b80\u4ecb<\/h3>\n<p>Netlink socket \u662f Linux \u7cfb\u7edf\u7279\u6709\u7684\u5957\u63a5\u5b57\u7c7b\u578b&#xff0c;\u662f\u5b9e\u73b0\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u8fdb\u7a0b\u95f4\u901a\u4fe1&#xff08;Inter-Process Communication, IPC&#xff09;\u7684\u4e13\u7528\u673a\u5236&#xff0c;\u540c\u65f6\u4e5f\u662f\u7f51\u7edc\u5e94\u7528\u7a0b\u5e8f\u4e0e\u5185\u6838\u8fdb\u884c\u4ea4\u4e92\u7684\u4e3b\u6d41\u63a5\u53e3\u3002 Netlink \u4e3a\u5185\u6838\u4e0e\u7528\u6237\u6001\u5e94\u7528\u4e4b\u95f4\u7684\u53cc\u5411\u6570\u636e\u4f20\u8f93\u63d0\u4f9b\u4e86\u9ad8\u6548\u7684\u5b9e\u73b0\u65b9\u5f0f&#xff1a;\u7528\u6237\u6001\u5e94\u7528\u53ef\u901a\u8fc7\u6807\u51c6\u7684 socket API \u8c03\u7528 Netlink \u63d0\u4f9b\u7684\u529f\u80fd&#xff0c;\u800c\u5185\u6838\u6001\u9700\u501f\u52a9\u4e13\u7528\u7684\u5185\u6838 API \u5b8c\u6210 Netlink \u76f8\u5173\u64cd\u4f5c\u3002Netlink \u63a5\u53e3\u5206\u4e3a\u5e94\u7528\u5c42\u63a5\u53e3\u4e0e\u5185\u6838\u63a5\u53e3\u4e24\u7c7b&#xff0c;\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d&#xff0c;\u9700\u4e8e\u5e94\u7528\u7a0b\u5e8f\u4fa7\u5b9e\u73b0\u7b56\u7565\u903b\u8f91&#xff0c;\u5e76\u5728\u5185\u6838\u4fa7\u5b9e\u73b0\u5e95\u5c42\u673a\u5236\u3002<\/p>\n<p>\u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684\u5e38\u7528\u901a\u4fe1\u65b9\u5f0f\u5305\u542b\u4ee5\u4e0b\u4e09\u7c7b&#xff1a;proc \u6587\u4ef6\u7cfb\u7edf\u3001ioctl \u8c03\u7528\u3001Netlink \u673a\u5236&#xff1a; &#xff08;1&#xff09;\/proc \u6587\u4ef6\u7cfb\u7edf &#8211; \u5355\u5411\u901a\u4fe1&#xff1a;\u4f5c\u4e3a\u865a\u62df\u6587\u4ef6\u7cfb\u7edf&#xff0c;\u4e3b\u8981\u7528\u4e8e\u7528\u6237\u7a7a\u95f4\u4ece\u5185\u6838\u83b7\u53d6\u4fe1\u606f\u3001\u8f93\u51fa\u6570\u636e&#xff1b; &#xff08;2&#xff09;ioctl \u8c03\u7528 &#8211; \u5355\u5411\u901a\u4fe1&#xff1a;\u4e0d\u652f\u6301\u5f02\u6b65\u4fe1\u606f\u53d1\u9001&#xff0c;\u4ec5\u7528\u4e8e\u7528\u6237\u7a7a\u95f4\u5411\u5185\u6838\u4f20\u9012\u63a7\u5236\u547d\u4ee4&#xff1b; &#xff08;3&#xff09;Netlink \u673a\u5236 &#8211; \u53cc\u5411\u901a\u4fe1&#xff1a;\u5185\u6838\u53ef\u4e3b\u52a8\u53d1\u8d77\u6570\u636e\u4f20\u8f93&#xff0c;\u800c\u975e\u4ec5\u54cd\u5e94\u7528\u6237\u7a7a\u95f4\u8bf7\u6c42\u5e76\u8fd4\u56de\u4fe1\u606f\u3002<\/p>\n<h4>1.1 netlink \u673a\u5236\u7684\u4f18\u52bf<\/h4>\n<ul>\n<li>\u652f\u6301\u5168\u53cc\u5de5\u3001\u5f02\u6b65\u901a\u4fe1\u6a21\u5f0f&#xff1b;<\/li>\n<li>\u7528\u6237\u7a7a\u95f4\u53ef\u76f4\u63a5\u4f7f\u7528\u6807\u51c6 socket \u63a5\u53e3\u5b8c\u6210\u901a\u4fe1\u64cd\u4f5c&#xff1b;<\/li>\n<li>\u5177\u5907\u591a\u64ad\u901a\u4fe1\u80fd\u529b&#xff1b;<\/li>\n<li>\u5185\u6838\u7aef\u53ef\u5728\u8fdb\u7a0b\u4e0a\u4e0b\u6587\u4e0e\u4e2d\u65ad\u4e0a\u4e0b\u6587\u73af\u5883\u4e2d\u4f7f\u7528\u3002<\/li>\n<\/ul>\n<h4>1.2 netlink \u673a\u5236\u7684\u5178\u578b\u5e94\u7528\u573a\u666f<\/h4>\n<ul>\n<li>\u83b7\u53d6\u6216\u4fee\u6539\u7cfb\u7edf\u8def\u7531\u4fe1\u606f&#xff1b;<\/li>\n<li>\u76d1\u542c TCP \u534f\u8bae\u6570\u636e\u62a5\u6587&#xff1b;<\/li>\n<li>\u9632\u706b\u5899\u529f\u80fd\u5b9e\u73b0&#xff1b;<\/li>\n<li>netfilter \u5b50\u7cfb\u7edf\u4ea4\u4e92&#xff1b;<\/li>\n<li>\u5185\u6838\u4e8b\u4ef6\u5411\u7528\u6237\u6001\u7684\u4e3b\u52a8\u901a\u77e5\u3002<\/li>\n<\/ul>\n<h3>2 netlink \u5e38\u7528\u6570\u636e\u7ed3\u6784\u53ca\u51fd\u6570<\/h3>\n<h4>2.1 netlink \u5e94\u7528\u5c42\u6570\u636e\u7ed3\u6784\u53ca\u51fd\u6570<\/h4>\n<p>\u5728\u7f51\u7edc\u7f16\u7a0b\u4e2d&#xff0c;\u901a\u5e38\u901a\u8fc7 IP \u5730\u5740 &#043; \u7aef\u53e3\u53f7 \u5b8c\u6210\u5bfb\u5740\u64cd\u4f5c&#xff1b;\u800c netlink \u673a\u5236\u5219\u901a\u8fc7 \u534f\u8bae\u7c7b\u578b &#043; \u8fdb\u7a0b ID \u5b9e\u73b0\u5bfb\u5740&#xff0c;\u5176\u4e2d \u534f\u8bae\u7c7b\u578b \u9700\u5728\u8c03\u7528 socket \u63a5\u53e3 \u65f6\u6307\u5b9a\u3002<\/p>\n<h5>2.1.1 \u6d88\u606f\u7ed3\u6784<\/h5>\n<p>netlink \u6d88\u606f\u7531\u6d88\u606f\u5934\u4e0e\u6d88\u606f\u4f53\u4e24\u90e8\u5206\u7ec4\u6210&#xff1a;\u6d88\u606f\u5934\u56fa\u5b9a\u5360\u7528 16 \u5b57\u8282&#xff0c;\u5176\u540e\u7d27\u8ddf\u6d88\u606f\u4f53&#xff08;\u6709\u6548\u6570\u636e&#xff09;\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a6660bdf48.png\" alt=\"img\" \/><\/p>\n<ul>\n<li>Message Length&#xff1a;\u6d88\u606f\u603b\u957f\u5ea6&#xff0c;\u5305\u542b netlink \u6d88\u606f\u5934\u5728\u5185\u7684\u5168\u90e8\u5b57\u8282\u6570&#xff0c;\u5360\u7528 4 \u5b57\u8282&#xff1b;<\/li>\n<li>Type&#xff1a;\u6d88\u606f\u7c7b\u578b&#xff0c;\u591a\u7528\u4e8e\u534f\u8bae\u4ea4\u4e92\u6d41\u7a0b&#xff0c;\u5185\u6838\u5b9a\u4e49\u4e86\u82e5\u5e72\u6807\u51c6\u6d88\u606f\u7c7b\u578b&#xff0c;\u4e14\u5df2\u57fa\u4e8e netlink \u5b9e\u73b0\u591a\u79cd\u534f\u8bae&#xff0c;\u6bcf\u79cd\u534f\u8bae\u5bf9\u5e94\u7279\u5b9a\u7684\u7c7b\u578b\u4e0e\u529f\u80fd&#xff0c;\u5360\u7528 2 \u5b57\u8282&#xff1b;<\/li>\n<li>Flags&#xff1a;\u6d88\u606f\u6807\u5fd7\u4f4d&#xff0c;\u5360\u7528 2 \u5b57\u8282&#xff1b;<\/li>\n<li>Sequence number&#xff1a;\u5e8f\u5217\u53f7&#xff0c;\u4e3a\u53ef\u9009\u5b57\u6bb5&#xff0c;\u529f\u80fd\u7c7b\u6bd4 TCP \u534f\u8bae\u4e2d\u7684\u62a5\u6587\u5e8f\u53f7&#xff0c;\u5360\u7528 4 \u5b57\u8282&#xff1b;<\/li>\n<li>PID&#xff08;port ID&#xff09;&#xff1a;\u7aef\u53e3\u6807\u8bc6&#xff0c;\u5373\u53d1\u9001\u7aef\u7684\u7aef\u53e3 ID \u53f7&#xff0c;\u5360\u7528 4 \u5b57\u8282\u3002<\/li>\n<\/ul>\n<h6>\u6d88\u606f\u5934 nlmsghdr \u7ed3\u6784\u4f53\u5b9a\u4e49&#xff1a;<\/h6>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __u32       nlmsg_len<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u5305\u62ec netlink \u6d88\u606f\u5934\u5728\u5185&#xff0c;\u6574\u4e2a\u6d88\u606f\u7684\u603b\u957f\u5ea6 *\/<\/span><br \/>\n    __u16       nlmsg_type<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/* \u6d88\u606f\u7c7b\u578b *\/<\/span><br \/>\n    __u16       nlmsg_flags<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u6d88\u606f\u6807\u5fd7\u4f4d *\/<\/span><br \/>\n    __u32       nlmsg_seq<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u6d88\u606f\u62a5\u6587\u7684\u5e8f\u5217\u53f7 *\/<\/span><br \/>\n    __u32       nlmsg_pid<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u53d1\u9001\u7aef\u53e3\u7684 ID \u53f7&#xff1a;\u5185\u6838\u4fa7\u8be5\u503c\u4e3a 0&#xff0c;\u7528\u6237\u8fdb\u7a0b\u4fa7\u4e3a\u5176 socket \u7ed1\u5b9a\u7684 ID \u53f7 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>2.1.2 netlink \u901a\u4fe1\u5730\u5740 struct sockaddr_nl<\/h5>\n<p>struct sockaddr_nl \u662f netlink \u673a\u5236\u7684\u901a\u4fe1\u5730\u5740\u7ed3\u6784\u4f53&#xff0c;\u529f\u80fd\u7c7b\u6bd4\u666e\u901a socket \u7f16\u7a0b\u4e2d\u7684 struct sockaddr_in \u7ed3\u6784\u4f53&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __kernel_sa_family_t    nl_family<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u5730\u5740\u65cf&#xff0c;\u56fa\u5b9a\u4e3a AF_NETLINK *\/<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span>          nl_pad<span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/* \u9884\u7559\u586b\u5145\u5b57\u6bb5&#xff0c;\u6682\u672a\u4f7f\u7528&#xff0c;\u9700\u7f6e\u4e3a 0 *\/<\/span><br \/>\n    __u32                   nl_pid<span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/* \u7aef\u53e3 ID&#xff08;\u901a\u4fe1\u7aef\u53e3\u53f7&#xff09;&#xff0c;0 \u8868\u793a\u76ee\u6807\u4e3a\u5185\u6838 *\/<\/span><br \/>\n    __u32                   nl_groups<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/* \u591a\u64ad\u7ec4\u63a9\u7801 *\/<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>nl_groups \u4e3a\u591a\u64ad\u7ec4\u7684\u5730\u5740\u63a9\u7801&#xff08;\u975e\u591a\u64ad\u7ec4\u7f16\u53f7&#xff09;&#xff0c;\u53ef\u53c2\u8003\u5185\u6838\u6e90\u7801\u6587\u4ef6 net\/netlink\/af_netlink.c \u4e2d\u7684\u5982\u4e0b\u51fd\u6570&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> u32 <span class=\"token function\">netlink_group_mask<\/span><span class=\"token punctuation\">(<\/span>u32 group<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> group <span class=\"token operator\">?<\/span> <span class=\"token number\">1<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token punctuation\">(<\/span>group <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p>\u5373\u7528\u6237\u7a7a\u95f4\u4ee3\u7801\u4e2d&#xff0c;\u82e5\u9700\u52a0\u5165\u591a\u64ad\u7ec4 1&#xff0c;\u9700\u5c06 nl_groups \u8bbe\u4e3a 1&#xff1b;\u591a\u64ad\u7ec4 2 \u5bf9\u5e94\u7684\u63a9\u7801\u4e3a 2&#xff1b;\u591a\u64ad\u7ec4 3 \u5bf9\u5e94\u7684\u63a9\u7801\u4e3a 4&#xff0c;\u4f9d\u6b64\u7c7b\u63a8\u3002nl_groups \u4e3a 0 \u65f6&#xff0c;\u8868\u793a\u4e0d\u52a0\u5165\u4efb\u4f55\u591a\u64ad\u7ec4\u3002<\/p>\n<p>nl_groups \u591a\u64ad\u7ec4\u63a9\u7801\u4e3a 32 \u4f4d\u6574\u578b&#xff0c;\u6bcf 1 \u4e2a\u6bd4\u7279\u4f4d\u5bf9\u5e94 1 \u4e2a\u591a\u64ad\u7ec4&#xff0c;\u56e0\u6b64\u6bcf\u79cd Netlink \u534f\u8bae\u6700\u591a\u652f\u6301 32 \u4e2a\u591a\u64ad\u7ec4\u3002\u7528\u6237\u7a7a\u95f4\u8fdb\u7a0b\u82e5\u5173\u6ce8\u67d0\u4e00\u591a\u64ad\u7ec4&#xff0c;\u53ef\u52a0\u5165\u8be5\u7ec4&#xff1b;\u5f53\u5185\u6838\u7a7a\u95f4\u8fdb\u7a0b\u5411\u8be5\u7ec4\u53d1\u9001\u591a\u64ad\u6d88\u606f\u65f6&#xff0c;\u6240\u6709\u5df2\u52a0\u5165\u8be5\u7ec4\u7684\u7528\u6237\u8fdb\u7a0b\u5747\u53ef\u63a5\u6536\u6b64\u6d88\u606f\u3002<\/p>\n<h4>2.2 netlink \u5185\u6838\u5c42\u6570\u636e\u7ed3\u6784\u53ca\u51fd\u6570<\/h4>\n<h5>2.2.1 \u5e38\u7528\u5b8f\u5b9a\u4e49<\/h5>\n<p>netlink \u6d88\u606f\u7c7b\u578b\u53ca\u5e38\u7528\u64cd\u4f5c\u5b8f\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p><span class=\"token comment\">\/******************** netlink \u6d88\u606f\u7c7b\u578b ********************\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ROUTE<\/span>       <span class=\"token expression\"><span class=\"token number\">0<\/span>   <\/span><span class=\"token comment\">\/* \u8def\u7531\/\u8bbe\u5907\u94a9\u5b50\u51fd\u6570\u63a5\u53e3              *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_UNUSED<\/span>      <span class=\"token expression\"><span class=\"token number\">1<\/span>   <\/span><span class=\"token comment\">\/* \u672a\u4f7f\u7528\u7f16\u53f7                        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_USERSOCK<\/span>    <span class=\"token expression\"><span class=\"token number\">2<\/span>   <\/span><span class=\"token comment\">\/* \u4e3a\u7528\u6237\u6001 socket \u534f\u8bae\u9884\u7559          *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIREWALL<\/span>    <span class=\"token expression\"><span class=\"token number\">3<\/span>   <\/span><span class=\"token comment\">\/* \u672a\u4f7f\u7528\u7f16\u53f7&#xff0c;\u539f\u7528\u4e8e ip_queue \u6a21\u5757   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SOCK_DIAG<\/span>   <span class=\"token expression\"><span class=\"token number\">4<\/span>   <\/span><span class=\"token comment\">\/* socket \u76d1\u63a7\u63a5\u53e3                   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NFLOG<\/span>       <span class=\"token expression\"><span class=\"token number\">5<\/span>   <\/span><span class=\"token comment\">\/* netfilter\/iptables ULOG \u6a21\u5757      *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_XFRM<\/span>        <span class=\"token expression\"><span class=\"token number\">6<\/span>   <\/span><span class=\"token comment\">\/* IPsec \u534f\u8bae\u76f8\u5173                    *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SELINUX<\/span>     <span class=\"token expression\"><span class=\"token number\">7<\/span>   <\/span><span class=\"token comment\">\/* SELinux \u4e8b\u4ef6\u901a\u77e5                  *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ISCSI<\/span>       <span class=\"token expression\"><span class=\"token number\">8<\/span>   <\/span><span class=\"token comment\">\/* Open-iSCSI \u534f\u8bae\u76f8\u5173               *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_AUDIT<\/span>       <span class=\"token expression\"><span class=\"token number\">9<\/span>   <\/span><span class=\"token comment\">\/* \u5ba1\u8ba1\u529f\u80fd\u76f8\u5173                      *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_FIB_LOOKUP<\/span>  <span class=\"token expression\"><span class=\"token number\">10<\/span>  <\/span><span class=\"token comment\">\/* FIB \u67e5\u8868\u529f\u80fd\u76f8\u5173                  *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CONNECTOR<\/span>   <span class=\"token expression\"><span class=\"token number\">11<\/span>  <\/span><span class=\"token comment\">\/* \u8fde\u63a5\u5668\u5b50\u7cfb\u7edf\u76f8\u5173                  *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_NETFILTER<\/span>   <span class=\"token expression\"><span class=\"token number\">12<\/span>  <\/span><span class=\"token comment\">\/* netfilter \u5b50\u7cfb\u7edf                  *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_IP6_FW<\/span>      <span class=\"token expression\"><span class=\"token number\">13<\/span>  <\/span><span class=\"token comment\">\/* IPv6 \u9632\u706b\u5899\u76f8\u5173                   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_DNRTMSG<\/span>     <span class=\"token expression\"><span class=\"token number\">14<\/span>  <\/span><span class=\"token comment\">\/* DECnet \u8def\u7531\u6d88\u606f                   *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_KOBJECT_UEVENT<\/span>  <span class=\"token expression\"><span class=\"token number\">15<\/span>  <\/span><span class=\"token comment\">\/* \u5185\u6838\u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u7684\u5bf9\u8c61\u4e8b\u4ef6\u6d88\u606f *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_GENERIC<\/span>     <span class=\"token expression\"><span class=\"token number\">16<\/span>  <\/span><span class=\"token comment\">\/* \u901a\u7528\u578b netlink \u534f\u8bae               *\/<\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u4e3a NETLINK_DM&#xff08;DM \u4e8b\u4ef6&#xff09;\u9884\u7559\u7a7a\u95f4 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_SCSITRANSPORT<\/span>   <span class=\"token expression\"><span class=\"token number\">18<\/span>  <\/span><span class=\"token comment\">\/* SCSI \u4f20\u8f93\u5c42\u76f8\u5173                  *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_ECRYPTFS<\/span>    <span class=\"token expression\"><span class=\"token number\">19<\/span>  <\/span><span class=\"token comment\">\/* ECRYPTFS \u52a0\u5bc6\u6587\u4ef6\u7cfb\u7edf\u76f8\u5173         *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_RDMA<\/span>        <span class=\"token expression\"><span class=\"token number\">20<\/span>  <\/span><span class=\"token comment\">\/* RDMA \u534f\u8bae\u76f8\u5173                     *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_CRYPTO<\/span>      <span class=\"token expression\"><span class=\"token number\">21<\/span>  <\/span><span class=\"token comment\">\/* \u52a0\u5bc6\u5c42\u76f8\u5173                        *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_INET_DIAG<\/span>   <span class=\"token expression\">NETLINK_SOCK_DIAG  <\/span><span class=\"token comment\">\/* \u7f51\u7edc\u5957\u63a5\u5b57\u8bca\u65ad *\/<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_LINKS<\/span> <span class=\"token expression\"><span class=\"token number\">32<\/span>            <\/span><span class=\"token comment\">\/* \u6700\u5927\u652f\u6301\u7684 netlink \u94fe\u8def\u6570         *\/<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/******************** netlink \u5e38\u7528\u5b8f ********************\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLMSG_ALIGNTO<\/span>   <span class=\"token expression\"><span class=\"token number\">4U<\/span>      <\/span><span class=\"token comment\">\/* \u5b57\u8282\u5bf9\u9f50\u57fa\u51c6\u503c                    *\/<\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u8ba1\u7b97\u4e0d\u5c0f\u4e8e len \u4e14\u6ee1\u8db3\u5b57\u8282\u5bf9\u9f50\u7684\u6700\u5c0f\u6570\u503c *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_ALIGN<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#043;<\/span>NLMSG_ALIGNTO<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;<\/span> <span class=\"token operator\">~<\/span><span class=\"token punctuation\">(<\/span>NLMSG_ALIGNTO<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* Netlink \u6d88\u606f\u5934\u957f\u5ea6 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NLMSG_HDRLEN<\/span>     <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token function\">NLMSG_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u8ba1\u7b97\u5305\u542b\u6d88\u606f\u5934\u7684\u6d88\u606f\u603b\u957f\u5ea6&#xff08;\u6d88\u606f\u4f53\u957f\u5ea6 &#043; \u6d88\u606f\u5934\u957f\u5ea6&#xff09;*\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_LENGTH<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> NLMSG_HDRLEN<span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u8fd4\u56de\u4e0d\u5c0f\u4e8e NLMSG_LENGTH(len) \u4e14\u6ee1\u8db3\u5b57\u8282\u5bf9\u9f50\u7684\u6700\u5c0f\u6570\u503c *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_SPACE<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token function\">NLMSG_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_LENGTH<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u83b7\u53d6\u6d88\u606f\u4f53\u6570\u636e\u90e8\u5206\u7684\u9996\u5730\u5740&#xff0c;\u8bfb\u5199\u6d88\u606f\u6570\u636e\u65f6\u8c03\u7528 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_DATA<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span>  <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>nlh<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token function\">NLMSG_LENGTH<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u83b7\u53d6\u4e0b\u4e00\u4e2a\u6d88\u606f\u7684\u9996\u5730\u5740&#xff0c;\u540c\u65f6\u66f4\u65b0 len \u4e3a\u5269\u4f59\u6d88\u606f\u957f\u5ea6 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_NEXT<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span>  <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-&#061;<\/span> <span class=\"token function\">NLMSG_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token function\">NLMSG_ALIGN<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u5224\u65ad\u6d88\u606f\u957f\u5ea6\u662f\u5426\u5408\u6cd5 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_OK<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span><span class=\"token punctuation\">)<\/span><span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&amp;&amp;<\/span> <\/span><span class=\"token punctuation\">\\\\<\/span><br \/>\n    <span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><br \/>\n<span class=\"token comment\">\/* \u8ba1\u7b97\u6d88\u606f\u8f7d\u8377&#xff08;payload&#xff09;\u7684\u957f\u5ea6 *\/<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name function\">NLMSG_PAYLOAD<\/span><span class=\"token expression\"><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">,<\/span>len<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#8211;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><\/span><\/span><\/p>\n<h5>2.2.2 \u5e38\u7528\u51fd\u6570<\/h5>\n<h6>&#xff08;1&#xff09;netlink_kernel_create \u51fd\u6570<\/h6>\n<p>\u51fd\u6570\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">inline<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span><br \/>\n<span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> unit<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">netlink_kernel_cfg<\/span> <span class=\"token operator\">*<\/span>cfg<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u521b\u5efa\u5185\u6838\u6001 socket&#xff0c;\u7528\u4e8e\u5b9e\u73b0\u4e0e\u7528\u6237\u6001\u7684\u901a\u4fe1\u3002 \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>net&#xff1a;\u6307\u5411\u7f51\u7edc\u547d\u540d\u7a7a\u95f4&#xff08;namespace&#xff09;\u7684\u6307\u9488&#xff0c;\u9ed8\u8ba4\u573a\u666f\u4e0b\u4f20\u5165\u5168\u5c40\u53d8\u91cf &amp;init_net&#xff08;\u65e0\u9700\u989d\u5916\u5b9a\u4e49&#xff09;&#xff1b;<\/li>\n<li>unit&#xff1a;netlink \u534f\u8bae\u7c7b\u578b&#xff0c;\u5982 NETLINK_TEST\u3001NETLINK_SELINUX \u7b49&#xff1b;<\/li>\n<li>cfg&#xff1a;\u5b58\u653e netlink \u5185\u6838\u914d\u7f6e\u53c2\u6570\u7684\u7ed3\u6784\u4f53&#xff08;\u5b9a\u4e49\u5982\u4e0b&#xff09;\u3002<\/li>\n<\/ul>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">netlink_kernel_cfg<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span>    groups<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u8be5\u534f\u8bae\u7c7b\u578b\u652f\u6301\u7684\u6700\u5927\u591a\u64ad\u7ec4\u6570\u91cf&#xff0c;\u82e5\u5c0f\u4e8e 32 \u5219\u9ed8\u8ba4\u6309 32 \u5904\u7406&#xff0c;\u901a\u5e38\u7f6e\u4e3a 0<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span>    flags<span class=\"token punctuation\">;<\/span>     <span class=\"token comment\">\/\/ \u914d\u7f6e\u6807\u5fd7\u4f4d<\/span><br \/>\n    <span class=\"token keyword\">void<\/span>        <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u6d88\u606f\u63a5\u6536\u56de\u8c03\u51fd\u6570<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">mutex<\/span>    <span class=\"token operator\">*<\/span>cb_mutex<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u56de\u8c03\u51fd\u6570\u4e92\u65a5\u9501<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>         <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>bind<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> group<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u56de\u8c03\u51fd\u6570<\/span><br \/>\n    <span class=\"token keyword\">void<\/span>        <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>unbind<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> group<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u89e3\u7ed1\u56de\u8c03\u51fd\u6570<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span>        <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>compare<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6bd4\u8f83\u51fd\u6570<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h6>&#xff08;2&#xff09;\u5355\u64ad\u51fd\u6570 netlink_unicast()<\/h6>\n<p>\u51fd\u6570\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">netlink_unicast<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>ssk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> __u32 portid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> nonblock<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u5411\u6307\u5b9a\u7aef\u53e3\u53d1\u9001\u5355\u64ad\u6d88\u606f\u3002 \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>ssk&#xff1a;netlink socket \u6307\u9488&#xff08;netlink_kernel_create \u51fd\u6570\u7684\u8fd4\u56de\u503c&#xff09;&#xff1b;<\/li>\n<li>skb&#xff1a;\u5185\u6838\u5957\u63a5\u5b57\u7f13\u51b2\u533a&#xff08;sk_buff&#xff09;\u6307\u9488&#xff1b;<\/li>\n<li>portid&#xff1a;\u76ee\u6807\u901a\u4fe1\u7aef\u53e3\u53f7&#xff08;\u63a5\u6536\u6d88\u606f\u7684\u8fdb\u7a0b PID&#xff09;&#xff1b;<\/li>\n<li>nonblock&#xff1a;\u975e\u963b\u585e\u6807\u5fd7\u4f4d&#xff0c;1 \u8868\u793a\u65e0\u53ef\u7528\u63a5\u6536\u7f13\u5b58\u65f6\u7acb\u5373\u8fd4\u56de&#xff0c;0 \u8868\u793a\u65e0\u53ef\u7528\u63a5\u6536\u7f13\u5b58\u65f6\u7761\u7720\u7b49\u5f85\u3002<\/li>\n<\/ul>\n<h6>&#xff08;3&#xff09;\u591a\u64ad\u51fd\u6570 netlink_broadcast()<\/h6>\n<p>\u51fd\u6570\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">netlink_broadcast<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>ssk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> __u32 portid<span class=\"token punctuation\">,<\/span><br \/>\n           __u32 group<span class=\"token punctuation\">,<\/span> gfp_t allocation<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u529f\u80fd&#xff1a;\u5411\u6307\u5b9a\u591a\u64ad\u7ec4\u53d1\u9001\u591a\u64ad\u6d88\u606f\u3002 \u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>ssk&#xff1a;netlink socket \u6307\u9488&#xff08;netlink_kernel_create \u51fd\u6570\u7684\u8fd4\u56de\u503c&#xff09;&#xff1b;<\/li>\n<li>skb&#xff1a;\u5185\u6838\u5957\u63a5\u5b57\u7f13\u51b2\u533a&#xff08;sk_buff&#xff09;\u6307\u9488&#xff1b;<\/li>\n<li>portid&#xff1a;\u53d1\u9001\u7aef\u7aef\u53e3 ID&#xff1b;<\/li>\n<li>group&#xff1a;\u76ee\u6807\u591a\u64ad\u7ec4\u63a9\u7801\u7684\u6309\u4f4d\u6216\u7ed3\u679c&#xff1b;<\/li>\n<li>allocation&#xff1a;\u5185\u6838\u5185\u5b58\u5206\u914d\u65b9\u5f0f\u6807\u8bc6&#xff0c;\u4e2d\u65ad\u4e0a\u4e0b\u6587\u901a\u5e38\u4f7f\u7528 GFP_ATOMIC&#xff0c;\u5176\u4ed6\u573a\u666f\u4f7f\u7528 GFP_KERNEL&#xff1b;\u8be5\u53c2\u6570\u5b58\u5728\u7684\u539f\u56e0\u662f\u8be5 API \u53ef\u80fd\u9700\u8981\u5206\u914d\u7f13\u51b2\u533a\u4ee5\u514b\u9686\u591a\u64ad\u6d88\u606f\u3002<\/li>\n<\/ul>\n<h3>3 \u4ee3\u7801\u5b9e\u4f8b<\/h3>\n<p>\u4ee5\u4e0b\u4ee3\u7801\u793a\u4f8b\u5206\u522b\u5b9e\u73b0\u7528\u6237\u6001\u4e0e\u5185\u6838\u6001\u7684 netlink \u901a\u4fe1\u903b\u8f91\u3002<\/p>\n<h4>3.1 \u7528\u6237\u6001 netlink \u7a0b\u5e8f<\/h4>\n<h5>3.1.1 netlink \u5e94\u7528\u5c42\u7f16\u7a0b\u57fa\u672c\u6b65\u9aa4<\/h5>\n<h6>&#xff08;1&#xff09;\u521b\u5efa\u5957\u63a5\u5b57<\/h6>\n<p>\u51fd\u6570\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> domain<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> type<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> protocol<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u53c2\u6570\u8bf4\u660e&#xff1a;<\/p>\n<ul>\n<li>domain&#xff1a;\u534f\u8bae\u65cf&#xff0c;netlink \u673a\u5236\u4e2d\u56fa\u5b9a\u4e3a AF_NETLINK&#xff1b;<\/li>\n<li>type&#xff1a;\u5957\u63a5\u5b57\u7c7b\u578b&#xff0c;netlink \u673a\u5236\u4e2d\u56fa\u5b9a\u4e3a SOCK_RAW&#xff1b;<\/li>\n<li>protocol&#xff1a;\u534f\u8bae\u7c7b\u578b&#xff0c;\u53ef\u4f7f\u7528\u5185\u6838\u9884\u5b9a\u4e49\u534f\u8bae\u6216\u81ea\u5b9a\u4e49\u534f\u8bae\u3002<\/li>\n<\/ul>\n<p>\u81ea\u5b9a\u4e49\u534f\u8bae\u793a\u4f8b&#xff1a;<\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_TEST<\/span> <span class=\"token expression\"><span class=\"token number\">23<\/span>    <\/span><span class=\"token comment\">\/\/ \u81ea\u5b9a\u4e49 netlink \u534f\u8bae\u7c7b\u578b<\/span><\/span><br \/>\n<span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><br \/>\n<span class=\"token keyword\">int<\/span> skfd <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\nskfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>AF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span> NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h6>&#xff08;2&#xff09;\u7ed1\u5b9a\u672c\u5730\u5730\u5740\u5230\u5957\u63a5\u5b57<\/h6>\n<p>\u51fd\u6570\u539f\u578b&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span>addr<span class=\"token punctuation\">,<\/span> socklen_t addrlen<span class=\"token punctuation\">)<\/span>    <span class=\"token comment\">\/\/ \u5730\u5740\u7ed1\u5b9a<\/span><br \/>\n<span class=\"token comment\">\/* sockaddr_nl \u662f netlink \u4e13\u7528\u5730\u5740\u7ed3\u6784\u4f53&#xff0c;\u533a\u522b\u4e8e\u7f51\u7edc\u7f16\u7a0b\u7684\u901a\u7528\u5730\u5740\u7ed3\u6784 *\/<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __kernel_sa_family_t   nl_family<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u5730\u5740\u65cf&#xff0c;\u56fa\u5b9a\u4e3a AF_NETLINK<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">short<\/span>        nl_pad<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u586b\u5145\u5b57\u6bb5&#xff0c;\u65e0\u9700\u8d4b\u503c<\/span><br \/>\n    __u32               nl_pid<span class=\"token punctuation\">;<\/span>   <span class=\"token comment\">\/\/ \u4e0e\u5185\u6838\u901a\u4fe1\u7684\u8fdb\u7a0b PID&#xff0c;0 \u8868\u793a\u76ee\u6807\u4e3a\u5185\u6838<\/span><br \/>\n    __u32               nl_groups<span class=\"token punctuation\">;<\/span>  <span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u5730\u5740\u63a9\u7801&#xff0c;netlink \u652f\u6301\u591a\u64ad\u901a\u4fe1<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>\u7ed1\u5b9a\u793a\u4f8b&#xff1a;<\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> nlsrc_addr <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/* \u521d\u59cb\u5316\u672c\u5730 socket \u5730\u5740 *\/<\/span><br \/>\nnlsrc_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\nnlsrc_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nnlsrc_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/* \u6267\u884c\u5730\u5740\u7ed1\u5b9a *\/<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>skfd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>nlsrc_addr<span class=\"token punctuation\">,<\/span> addr_len<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;bind addr error\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>&#xff08;3&#xff09;\u6784\u9020\u901a\u4fe1\u6d88\u606f<\/h6>\n<h6>&#xff08;4&#xff09;\u53d1\u9001\/\u63a5\u6536\u6d88\u606f<\/h6>\n<p>netlink \u673a\u5236\u63d0\u4f9b\u4e24\u5957\u6536\u53d1\u6d88\u606f\u7684\u63a5\u53e3&#xff1a;sendto\/recvfrom\u3001sendmsg\/recvmsg\u3002\u6838\u5fc3\u63a5\u53e3\u5b9a\u4e49\u5982\u4e0b&#xff1a;<\/p>\n<p>ssize_t <span class=\"token function\">sendto<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>buf<span class=\"token punctuation\">,<\/span> size_t len<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span>dest_addr<span class=\"token punctuation\">,<\/span> socklen_t addrlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nssize_t <span class=\"token function\">recvfrom<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> sockfd<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span>buf<span class=\"token punctuation\">,<\/span> size_t len<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span>src_addr<span class=\"token punctuation\">,<\/span> socklen_t <span class=\"token operator\">*<\/span>addrlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>3.1.2 netlink \u7528\u6237\u7a7a\u95f4\u5b8c\u6574\u4ee3\u7801<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdio.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdlib.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;sys\/socket.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_TEST<\/span>    <span class=\"token expression\"><span class=\"token number\">17<\/span><\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">RX_BUF_SIZE<\/span>     <span class=\"token expression\"><span class=\"token number\">100<\/span>        <\/span><span class=\"token comment\">\/\/ \u63a5\u6536\u7f13\u51b2\u533a\u5927\u5c0f<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">MAX_PLOAD<\/span>       <span class=\"token expression\"><span class=\"token number\">100<\/span>        <\/span><span class=\"token comment\">\/\/ \u53d1\u9001\u6d88\u606f\u5185\u5b58\u7a7a\u95f4\u5927\u5c0f<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b9a\u4e49\u63a5\u6536\u5185\u6838\u6d88\u606f\u7684\u7ed3\u6784\u4f53<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">struct<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> hdr<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> msg<span class=\"token punctuation\">[<\/span>RX_BUF_SIZE<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>RX_KERNEL_MSG<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>data <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;This message is from user&#039;s space&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316\u53d8\u91cf<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span> src_addr<span class=\"token punctuation\">,<\/span> dest_addr<span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ netlink \u5730\u5740\u7ed3\u6784\u4f53<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> skfd<span class=\"token punctuation\">,<\/span> ret<span class=\"token punctuation\">,<\/span> rxlen <span class=\"token operator\">&#061;<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr_nl<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>message<span class=\"token punctuation\">;<\/span><br \/>\n    RX_KERNEL_MSG info<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>retval<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* 1. \u521b\u5efa NETLINK \u5957\u63a5\u5b57 *\/<\/span><br \/>\n    skfd <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">socket<\/span><span class=\"token punctuation\">(<\/span>PF_NETLINK<span class=\"token punctuation\">,<\/span> SOCK_RAW<span class=\"token punctuation\">,<\/span> NETLINK_TEST<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>skfd <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;can not create a netlink socket\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316 netlink \u6e90\u5730\u5740<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>src_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>src_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    src_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n    src_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">getpid<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u6e90\u7aef\u53e3\u4e3a\u5f53\u524d\u8fdb\u7a0b PID<\/span><br \/>\n    src_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>        <span class=\"token comment\">\/\/ \u4e0d\u52a0\u5165\u4efb\u4f55\u591a\u64ad\u7ec4<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u7ed1\u5b9a\u5957\u63a5\u5b57\u5230\u6e90\u5730\u5740<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">bind<\/span><span class=\"token punctuation\">(<\/span>skfd<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>src_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>src_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;bind() error\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u521d\u59cb\u5316 netlink \u76ee\u6807\u5730\u5740<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    dest_addr<span class=\"token punctuation\">.<\/span>nl_family <span class=\"token operator\">&#061;<\/span> AF_NETLINK<span class=\"token punctuation\">;<\/span><br \/>\n    dest_addr<span class=\"token punctuation\">.<\/span>nl_pid <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>            <span class=\"token comment\">\/\/ \u76ee\u6807\u7aef\u53e3\u4e3a\u5185\u6838&#xff08;PID &#061; 0&#xff09;<\/span><br \/>\n    dest_addr<span class=\"token punctuation\">.<\/span>nl_groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>         <span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u63a9\u7801\u7f6e 0<\/span><\/p>\n<p>    <span class=\"token comment\">\/* 2. \u6784\u9020\u901a\u4fe1\u6d88\u606f *\/<\/span><br \/>\n    message <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">malloc<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>MAX_PLOAD<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">memset<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">,<\/span> <span class=\"token char\">&#039;\\\\0&#039;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    message<span class=\"token operator\">-&gt;<\/span>nlmsg_len <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6d88\u606f\u603b\u957f\u5ea6&#xff08;\u542b\u6d88\u606f\u5934&#xff09;<\/span><br \/>\n    message<span class=\"token operator\">-&gt;<\/span>nlmsg_flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>            <span class=\"token comment\">\/\/ \u6d88\u606f\u6807\u5fd7\u4f4d\u7f6e 0<\/span><br \/>\n    message<span class=\"token operator\">-&gt;<\/span>nlmsg_type <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>             <span class=\"token comment\">\/\/ \u6d88\u606f\u7c7b\u578b\u7f6e 0<\/span><br \/>\n    message<span class=\"token operator\">-&gt;<\/span>nlmsg_seq <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>              <span class=\"token comment\">\/\/ \u6d88\u606f\u5e8f\u5217\u53f7\u7f6e 0<\/span><br \/>\n    message<span class=\"token operator\">-&gt;<\/span>nlmsg_pid <span class=\"token operator\">&#061;<\/span> src_addr<span class=\"token punctuation\">.<\/span>nl_pid<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ \u6d88\u606f\u4e2d\u643a\u5e26\u6e90\u7aef\u53e3 PID<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u62f7\u8d1d\u6709\u6548\u6570\u636e\u5230\u6d88\u606f\u4f53<\/span><br \/>\n    retval <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <\/p>\n<p>    <span class=\"token comment\">\/* 3. \u53d1\u9001\u6d88\u606f\u5230\u5185\u6838 *\/<\/span><br \/>\n    ret <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">sendto<\/span><span class=\"token punctuation\">(<\/span>skfd<span class=\"token punctuation\">,<\/span> message<span class=\"token punctuation\">,<\/span> message<span class=\"token operator\">-&gt;<\/span>nlmsg_len<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>dest_addr<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>ret<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;send pid:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* 4. \u63a5\u6536\u5185\u6838\u8fd4\u56de\u7684\u54cd\u5e94\u6d88\u606f *\/<\/span><br \/>\n    ret <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">recvfrom<\/span><span class=\"token punctuation\">(<\/span>skfd<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>info<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">sizeof<\/span><span class=\"token punctuation\">(<\/span>RX_KERNEL_MSG<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sockaddr<\/span><span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&amp;<\/span>dest_addr<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>rxlen<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>ret<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">perror<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;recv form kerner:&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">printf<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;User Receive ACK from kernel:%s\\\\r\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>info<span class=\"token punctuation\">.<\/span>msg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u91ca\u653e\u8d44\u6e90\u5e76\u5173\u95ed\u5957\u63a5\u5b57<\/span><br \/>\n    <span class=\"token function\">close<\/span><span class=\"token punctuation\">(<\/span>skfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token function\">free<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span>message<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h4>3.2 \u5185\u6838\u7a7a\u95f4 netlink \u4ee3\u7801<\/h4>\n<h5>3.2.1 netlink \u5185\u6838\u6001\u7f16\u7a0b\u57fa\u672c\u6b65\u9aa4<\/h5>\n<p>\u5185\u6838\u4fa7 netlink \u7f16\u7a0b\u63a5\u53e3\u4e0e\u5e94\u7528\u5c42\u903b\u8f91\u76f8\u4f3c&#xff0c;\u6838\u5fc3\u6b65\u9aa4\u5982\u4e0b&#xff1a;<\/p>\n<h6>&#xff08;1&#xff09;\u521b\u5efa socket \u5e76\u6ce8\u518c\u56de\u8c03\u51fd\u6570<\/h6>\n<p><span class=\"token comment\">\/\/ netlink \u5185\u6838\u914d\u7f6e\u7ed3\u6784\u4f53<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">netlink_kernel_cfg<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span>    groups<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span>    flags<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">void<\/span>            <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>input<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/* \u6d88\u606f\u63a5\u6536\u56de\u8c03\u51fd\u6570 *\/<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">mutex<\/span>    <span class=\"token operator\">*<\/span>cb_mutex<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span>             <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>bind<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> group<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">void<\/span>            <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>unbind<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> group<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span>            <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>compare<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/* \u521b\u5efa\u5185\u6838 netlink socket&#xff0c;\u53c2\u6570 net \u901a\u5e38\u4f20\u5165 &amp;init_net *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">inline<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">net<\/span> <span class=\"token operator\">*<\/span>net<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> unit<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">netlink_kernel_cfg<\/span> <span class=\"token operator\">*<\/span>cfg<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token comment\">\/* \u91ca\u653e\u5185\u6838 netlink socket *\/<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">netlink_kernel_release<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>sk<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h6>&#xff08;2&#xff09;\u6784\u9020\u901a\u4fe1\u6d88\u606f<\/h6>\n<p><span class=\"token comment\">\/\/ sk_buff \u662f\u5185\u6838\u4e2d netlink \u6d88\u606f\u7684\u8f7d\u4f53&#xff0c;\u4ee5\u4e0b\u4e3a\u5176\u5206\u914d\u3001\u5f15\u7528\u3001\u91ca\u653e\u63a5\u53e3<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">inline<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">alloc_skb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">unsigned<\/span> <span class=\"token keyword\">int<\/span> size<span class=\"token punctuation\">,<\/span> gfp_t priority<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">inline<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">skb_get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token keyword\">void<\/span> <span class=\"token function\">kfree_skb<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6784\u9020 netlink \u6d88\u606f\u5934\u7684\u63a5\u53e3<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">inline<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span><span class=\"token function\">nlmsg_put<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> u32 portid<span class=\"token punctuation\">,<\/span> u32 seq<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> type<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> payload<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> flags<span class=\"token punctuation\">)<\/span><\/p>\n<p>\u5178\u578b\u8c03\u7528\u793a\u4f8b&#xff1a;<\/p>\n<p><span class=\"token comment\">\/\/ NLMSG_SPACE \u8ba1\u7b97\u5305\u542b\u6d88\u606f\u5934\u7684\u6d88\u606f\u603b\u957f\u5ea6<\/span><br \/>\nsize_t size <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span>message_size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>size_t<span class=\"token punctuation\">)<\/span>NLMSG_GOODSIZE<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u5206\u914d sk_buff \u5185\u5b58\u7a7a\u95f4<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span> log_skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">alloc_skb<\/span><span class=\"token punctuation\">(<\/span>size<span class=\"token punctuation\">,<\/span> GFP_ATOMIC<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u6784\u9020\u6d88\u606f\u5934<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_put<\/span><span class=\"token punctuation\">(<\/span>log_skb<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/*pid*\/<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/*seq*\/<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> type<span class=\"token punctuation\">,<\/span><br \/>\n                message_size<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token comment\">\/\/ \u62f7\u8d1d\u6709\u6548\u6570\u636e\u5230\u6d88\u606f\u4f53<\/span><br \/>\n<span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>payload <span class=\"token operator\">!&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">nlmsg_data<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>  payload<span class=\"token punctuation\">,<\/span> size<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<h6>&#xff08;3&#xff09;\u53d1\u9001\/\u63a5\u6536\u6d88\u606f<\/h6>\n<p>\u5185\u6838\u63d0\u4f9b\u5355\u64ad\u3001\u591a\u64ad\u4e24\u7c7b\u6d88\u606f\u53d1\u9001\u63a5\u53e3&#xff0c;\u53ef\u6839\u636e\u4e1a\u52a1\u573a\u666f\u9009\u62e9&#xff1a;<\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">netlink_unicast<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>ssk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> __u32 portid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">int<\/span> nonblock<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">netlink_broadcast<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>ssk<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">,<\/span> __u32 portid<span class=\"token punctuation\">,<\/span> __u32 group<span class=\"token punctuation\">,<\/span> gfp_t allocation<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h5>3.2.2 netlink \u5185\u6838\u6001\u6a21\u5757\u5b8c\u6574\u4ee3\u7801<\/h5>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/kernel.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/module.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/types.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/sched.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;net\/sock.h&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;linux\/netlink.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">define<\/span> <span class=\"token macro-name\">NETLINK_TEST<\/span>    <span class=\"token expression\"><span class=\"token number\">17<\/span>    <\/span><span class=\"token comment\">\/\/ \u4e0e\u7528\u6237\u6001\u4e00\u81f4\u7684\u81ea\u5b9a\u4e49\u534f\u8bae\u7c7b\u578b<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b58\u50a8\u7528\u6237\u8fdb\u7a0b PID \u7684\u7ed3\u6784\u4f53<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    __u32 pid<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span>user_process<span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span>netlinkfd <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ netlink socket \u6307\u9488<\/span><\/p>\n<p><span class=\"token comment\">\/* \u5411\u7528\u6237\u7a7a\u95f4\u53d1\u9001\u6d88\u606f\u7684\u51fd\u6570 *\/<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">send_to_user<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> _pid<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>pbuf<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">uint16_t<\/span> len<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>nl_skb<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> ret<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u5206\u914d sk_buff \u5185\u5b58\u7a7a\u95f4 *\/<\/span><br \/>\n    nl_skb <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_new<\/span><span class=\"token punctuation\">(<\/span>len<span class=\"token punctuation\">,<\/span> GFP_ATOMIC<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>nl_skb<span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;netlink alloc failure\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u6784\u9020 netlink \u6d88\u606f\u5934 *\/<\/span><br \/>\n    nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_put<\/span><span class=\"token punctuation\">(<\/span>nl_skb<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> NETLINK_TEST<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>nlh <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;nlmsg_put failure \\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">nlmsg_free<\/span><span class=\"token punctuation\">(<\/span>nl_skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/* \u62f7\u8d1d\u6570\u636e\u5230\u6d88\u606f\u4f53 *\/<\/span><br \/>\n    <span class=\"token function\">memcpy<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">nlmsg_data<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> pbuf<span class=\"token punctuation\">,<\/span> len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u53d1\u9001\u5355\u64ad\u6d88\u606f\u5230\u7528\u6237\u8fdb\u7a0b<\/span><br \/>\n    ret <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">netlink_unicast<\/span><span class=\"token punctuation\">(<\/span>netlinkfd<span class=\"token punctuation\">,<\/span> nl_skb<span class=\"token punctuation\">,<\/span> _pid<span class=\"token punctuation\">,<\/span> MSG_DONTWAIT<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> ret<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/* \u6d88\u606f\u63a5\u6536\u56de\u8c03\u51fd\u6570 *\/<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">netlink_rcv_msg<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sk_buff<\/span> <span class=\"token operator\">*<\/span>skb<span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">nlmsghdr<\/span> <span class=\"token operator\">*<\/span>nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>data <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">char<\/span> <span class=\"token operator\">*<\/span>kmsg <span class=\"token operator\">&#061;<\/span> <span class=\"token string\">&#034;hello users!!!&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ \u83b7\u53d6\u6d88\u606f\u5934<\/span><br \/>\n    nlh <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">nlmsg_hdr<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ \u6821\u9a8c\u6d88\u606f\u957f\u5ea6\u5408\u6cd5\u6027<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>skb<span class=\"token operator\">-&gt;<\/span>len <span class=\"token operator\">&gt;&#061;<\/span> <span class=\"token function\">NLMSG_SPACE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><br \/>\n    <span class=\"token punctuation\">{<\/span><br \/>\n        data <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">NLMSG_DATA<\/span><span class=\"token punctuation\">(<\/span>nlh<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>    <span class=\"token comment\">\/\/ \u63d0\u53d6\u6d88\u606f\u4f53\u6570\u636e<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>data<span class=\"token punctuation\">)<\/span><br \/>\n        <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u8bb0\u5f55\u53d1\u9001\u7aef\u7528\u6237\u8fdb\u7a0b PID<\/span><br \/>\n            user_process<span class=\"token punctuation\">.<\/span>pid <span class=\"token operator\">&#061;<\/span> nlh<span class=\"token operator\">-&gt;<\/span>nlmsg_pid<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;kernel recv from user pid %d: %s\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> user_process<span class=\"token punctuation\">.<\/span>pid<span class=\"token punctuation\">,<\/span> data<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ \u5411\u7528\u6237\u8fdb\u7a0b\u53d1\u9001\u54cd\u5e94\u6d88\u606f<\/span><br \/>\n            <span class=\"token function\">send_to_user<\/span><span class=\"token punctuation\">(<\/span>user_process<span class=\"token punctuation\">.<\/span>pid<span class=\"token punctuation\">,<\/span> kmsg<span class=\"token punctuation\">,<\/span> <span class=\"token function\">strlen<\/span><span class=\"token punctuation\">(<\/span>kmsg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;%s: error skb, length:%d\\\\n&#034;<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token constant\">__func__<\/span><span class=\"token punctuation\">,<\/span> skb<span class=\"token operator\">-&gt;<\/span>len<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u5b9a\u4e49 netlink \u5185\u6838\u914d\u7f6e<\/span><br \/>\n<span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">netlink_kernel_cfg<\/span> cfg <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>input  <span class=\"token operator\">&#061;<\/span> netlink_rcv_msg<span class=\"token punctuation\">,<\/span> <span class=\"token comment\">\/* \u6ce8\u518c\u6d88\u606f\u63a5\u6536\u56de\u8c03\u51fd\u6570 *\/<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>groups <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span>               <span class=\"token comment\">\/\/ \u591a\u64ad\u7ec4\u6570\u91cf\u7f6e 0<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>flags <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>cb_mutex <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>bind <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">.<\/span>compare <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">,<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6a21\u5757\u521d\u59cb\u5316\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">int<\/span> __init <span class=\"token function\">test_netlink_init<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/* \u521b\u5efa netlink socket *\/<\/span><br \/>\n    netlinkfd <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">sock<\/span> <span class=\"token operator\">*<\/span><span class=\"token punctuation\">)<\/span><span class=\"token function\">netlink_kernel_create<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&amp;<\/span>init_net<span class=\"token punctuation\">,<\/span> NETLINK_TEST<span class=\"token punctuation\">,<\/span> <span class=\"token operator\">&amp;<\/span>cfg<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span><span class=\"token punctuation\">(<\/span>netlinkfd <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span>KERN_ERR <span class=\"token string\">&#034;can not create a netlink socket\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ \u6a21\u5757\u9000\u51fa\u51fd\u6570<\/span><br \/>\n<span class=\"token keyword\">void<\/span> __exit <span class=\"token function\">test_netlink_exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">)<\/span><br \/>\n<span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>netlinkfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token function\">netlink_kernel_release<\/span><span class=\"token punctuation\">(<\/span>netlinkfd<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/* \u91ca\u653e netlink socket *\/<\/span><br \/>\n        netlinkfd <span class=\"token operator\">&#061;<\/span> <span class=\"token constant\">NULL<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token function\">printk<\/span><span class=\"token punctuation\">(<\/span>KERN_DEBUG <span class=\"token string\">&#034;test_netlink_exit!!\\\\n&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token function\">module_init<\/span><span class=\"token punctuation\">(<\/span>test_netlink_init<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">module_exit<\/span><span class=\"token punctuation\">(<\/span>test_netlink_exit<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">MODULE_LICENSE<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;GPL&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">MODULE_AUTHOR<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;donga&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<h4>3.3 \u6d4b\u8bd5\u7ed3\u679c<\/h4>\n<p>\u6d4b\u8bd5\u4ee3\u7801\u4e0b\u8f7d\u94fe\u63a5&#xff1a;https:\/\/download.csdn.net\/download\/hinewcc\/89590914<\/p>\n<p>\u5c06\u5185\u6838\u6001\u4ee3\u7801\u7f16\u8bd1\u4e3a ko \u6a21\u5757&#xff0c;\u7528\u6237\u6001\u4ee3\u7801\u7f16\u8bd1\u4e3a\u53ef\u6267\u884c\u7a0b\u5e8f&#xff1b;\u901a\u8fc7 insmod \u547d\u4ee4\u52a0\u8f7d ko \u6a21\u5757\u540e\u8fd0\u884c\u7528\u6237\u6001\u7a0b\u5e8f&#xff1a;<\/p>\n<p>$ insmod netlink_test.ko    <span class=\"token comment\"># \u52a0\u8f7d\u5185\u6838\u6a21\u5757<\/span><\/p>\n<p>$ .\/netlink_app            <span class=\"token comment\"># \u8fd0\u884c\u7528\u6237\u6001\u5e94\u7528\u7a0b\u5e8f<\/span><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a6660d0996.png\" alt=\"img\" \/><\/p>\n<p>\u5185\u6838\u6001\u53ef\u63a5\u6536\u7528\u6237\u6001\u53d1\u9001\u7684\u6570\u636e&#xff0c;\u5e76\u5411\u7528\u6237\u7a7a\u95f4\u8fd4\u56de \u201chello users!!!\u201d \u54cd\u5e94\u6d88\u606f\u3002<\/p>\n<h4>3.4 netlink \u72b6\u6001\u67e5\u770b\u547d\u4ee4<\/h4>\n<p>\u901a\u8fc7\u5982\u4e0b\u547d\u4ee4\u53ef\u67e5\u770b\u7cfb\u7edf\u4e2d netlink \u63a5\u53e3\u7684 ID \u53ca\u72b6\u6001&#xff1a;<\/p>\n<p>$ <span class=\"token function\">cat<\/span> \/proc\/net\/netlink<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a6660e083d.png\" alt=\"img\" width=\"700\" \/><\/p>\n<hr \/>\n<h4>\u603b\u7ed3<\/h4>\n<li>netlink \u662f Linux \u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u7684\u53cc\u5411\u901a\u4fe1\u673a\u5236&#xff0c;\u76f8\u6bd4 proc\u3001ioctl \u5177\u5907\u5168\u53cc\u5de5\u3001\u5f02\u6b65\u3001\u591a\u64ad\u7b49\u7279\u6027&#xff0c;\u662f\u7f51\u7edc\u7c7b\u5185\u6838\u4ea4\u4e92\u7684\u4e3b\u6d41\u65b9\u5f0f&#xff1b;<\/li>\n<li>netlink \u6d88\u606f\u7531 16 \u5b57\u8282\u56fa\u5b9a\u957f\u5ea6\u7684\u6d88\u606f\u5934&#xff08;nlmsghdr&#xff09;\u548c\u53ef\u53d8\u957f\u5ea6\u7684\u6d88\u606f\u4f53\u7ec4\u6210&#xff0c;\u5bfb\u5740\u65b9\u5f0f\u4e3a\u300c\u534f\u8bae\u7c7b\u578b &#043; \u8fdb\u7a0b PID\u300d&#xff0c;\u533a\u522b\u4e8e\u4f20\u7edf\u7f51\u7edc\u7f16\u7a0b\u7684\u300cIP \u5730\u5740 &#043; \u7aef\u53e3\u53f7\u300d&#xff1b;<\/li>\n<li>\u5185\u6838\u6001\u9700\u901a\u8fc7 netlink_kernel_create \u521b\u5efa socket \u5e76\u6ce8\u518c\u56de\u8c03\u51fd\u6570&#xff0c;\u7528\u6237\u6001\u53ef\u76f4\u63a5\u4f7f\u7528\u6807\u51c6 socket API&#xff0c;\u6838\u5fc3\u4ea4\u4e92\u63a5\u53e3\u5305\u62ec sendto\/recvfrom&#xff08;\u5355\u64ad&#xff09;\u3001netlink_broadcast&#xff08;\u591a\u64ad&#xff09;\u7b49\u3002<\/li>\n<hr \/>\n<h2>via:<\/h2>\n<ul>\n<li>\u7528\u6237\u7a7a\u95f4\u548c\u5185\u6838\u7a7a\u95f4\u901a\u8baf\u4e4b\u3010Netlink \u4e0a\u3011-wjlkoorey258-ChinaUnix\u535a\u5ba2 http:\/\/blog.chinaunix.net\/uid-23069658-id-3400761.html<\/li>\n<li>\u7528\u6237\u7a7a\u95f4\u548c\u5185\u6838\u7a7a\u95f4\u901a\u8baf\u4e4b\u3010Netlink \u4e2d\u3011-wjlkoorey258-ChinaUnix\u535a\u5ba2 http:\/\/blog.chinaunix.net\/uid-23069658-id-3405954.html<\/li>\n<li>\u7528\u6237\u7a7a\u95f4\u548c\u5185\u6838\u7a7a\u95f4\u901a\u8baf\u4e4b\u3010Netlink \u4e0b\u3011-wjlkoorey258-ChinaUnix\u535a\u5ba2 http:\/\/blog.chinaunix.net\/uid-23069658-id-3409786.html<\/li>\n<li>linux \u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u901a\u4fe1\u4e4bnetlink\u4f7f\u7528\u65b9\u6cd5-CSDN\u535a\u5ba2 https:\/\/blog.csdn.net\/HAOMCU\/article\/details\/7371835<\/li>\n<li>Linux\u5185\u6838netlink\u673a\u5236 &#8211; \u7528\u6237\u7a7a\u95f4\u548c\u5185\u6838\u7a7a\u95f4\u6570\u636e\u4f20\u8f93-CSDN\u535a\u5ba2 https:\/\/blog.csdn.net\/hinewcc\/article\/details\/139156381<\/li>\n<li>linux netlink\u901a\u4fe1\u673a\u5236 &#8211; zhangwju &#8211; \u535a\u5ba2\u56ed 2017 https:\/\/www.cnblogs.com\/wenqiang\/p\/6306727.html<\/li>\n<li>Netlink \u624b\u518c \u2014 Linux \u5185\u6838\u6587\u6863 &#8211; Linux \u5185\u6838 https:\/\/linuxkernel.org.cn\/doc\/html\/latest\/userspace-api\/netlink\/index.html<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u6ce8&#xff1a;\u672c\u6587\u4e3a \u201cLinux Netlink \u901a\u4fe1\u673a\u5236\u201d \u76f8\u5173\u5408\u8f91\u3002 \u7565\u4f5c\u91cd\u6392&#xff0c;\u672a\u6574\u7406\u53bb\u91cd\u3002 \u5982\u6709\u5185\u5bb9\u5f02\u5e38&#xff0c;\u8bf7\u770b\u539f\u6587\u3002 \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e0a&#xff09;<br \/>\nwjlkoorey258 2012-11-07 22:00:24<br \/>\n\u5f15\u8a00<br \/>\nAlan Cox \u5728\u5185\u6838 1.3 \u7248\u672c\u7684\u5f00\u53d1\u9636\u6bb5\u9996\u6b21\u5f15\u5165\u4e86 Netlink \u673a\u5236&#xff0c;\u6700\u521d\u8be5\u673a\u5236\u4ee5\u5b57\u7b26\u9a71\u52a8\u63a5\u53e3\u7684\u5f62\u5f0f&#xff0c;\u63d0\u4f9b\u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u7684\u53cc<\/p>\n","protected":false},"author":2,"featured_media":67699,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[7160],"topic":[],"class_list":["post-67703","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-server","tag-linux-netlink"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/67703.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"\u6ce8&#xff1a;\u672c\u6587\u4e3a \u201cLinux Netlink \u901a\u4fe1\u673a\u5236\u201d \u76f8\u5173\u5408\u8f91\u3002 \u7565\u4f5c\u91cd\u6392&#xff0c;\u672a\u6574\u7406\u53bb\u91cd\u3002 \u5982\u6709\u5185\u5bb9\u5f02\u5e38&#xff0c;\u8bf7\u770b\u539f\u6587\u3002 \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e0a&#xff09; wjlkoorey258 2012-11-07 22:00:24 \u5f15\u8a00 Alan Cox \u5728\u5185\u6838 1.3 \u7248\u672c\u7684\u5f00\u53d1\u9636\u6bb5\u9996\u6b21\u5f15\u5165\u4e86 Netlink \u673a\u5236&#xff0c;\u6700\u521d\u8be5\u673a\u5236\u4ee5\u5b57\u7b26\u9a71\u52a8\u63a5\u53e3\u7684\u5f62\u5f0f&#xff0c;\u63d0\u4f9b\u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u7684\u53cc\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/67703.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-28T19:41:22+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a666098921.jpg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"37 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/67703.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/67703.html\",\"name\":\"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-01-28T19:41:22+00:00\",\"dateModified\":\"2026-01-28T19:41:22+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/67703.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/67703.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/67703.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/67703.html","og_locale":"zh_CN","og_type":"article","og_title":"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"\u6ce8&#xff1a;\u672c\u6587\u4e3a \u201cLinux Netlink \u901a\u4fe1\u673a\u5236\u201d \u76f8\u5173\u5408\u8f91\u3002 \u7565\u4f5c\u91cd\u6392&#xff0c;\u672a\u6574\u7406\u53bb\u91cd\u3002 \u5982\u6709\u5185\u5bb9\u5f02\u5e38&#xff0c;\u8bf7\u770b\u539f\u6587\u3002 \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u901a\u4fe1\u2014\u2014Netlink&#xff08;\u4e0a&#xff09; wjlkoorey258 2012-11-07 22:00:24 \u5f15\u8a00 Alan Cox \u5728\u5185\u6838 1.3 \u7248\u672c\u7684\u5f00\u53d1\u9636\u6bb5\u9996\u6b21\u5f15\u5165\u4e86 Netlink \u673a\u5236&#xff0c;\u6700\u521d\u8be5\u673a\u5236\u4ee5\u5b57\u7b26\u9a71\u52a8\u63a5\u53e3\u7684\u5f62\u5f0f&#xff0c;\u63d0\u4f9b\u5185\u6838\u4e0e\u7528\u6237\u7a7a\u95f4\u4e4b\u95f4\u7684\u53cc","og_url":"https:\/\/www.wsisp.com\/helps\/67703.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-01-28T19:41:22+00:00","og_image":[{"url":"https:\/\/www.wsisp.com\/helps\/wp-content\/uploads\/2026\/01\/20260128194120-697a666098921.jpg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"37 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/67703.html","url":"https:\/\/www.wsisp.com\/helps\/67703.html","name":"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0 - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-01-28T19:41:22+00:00","dateModified":"2026-01-28T19:41:22+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/67703.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/67703.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/67703.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"Linux \u7528\u6237\u7a7a\u95f4\u4e0e\u5185\u6838\u7a7a\u95f4\u7684 Netlink \u901a\u4fe1\u673a\u5236\u53ca\u5b9e\u73b0"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/67703","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=67703"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/67703\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media\/67699"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=67703"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=67703"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=67703"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=67703"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}