linux下用户程序同内核通信详解(netlink机制)
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><span><strong>简介</strong></span>
</li><li>
<span><strong>内核模块</strong></span>
</li><li>
<span><strong>用户程序</strong></span>
</li><li>
<span><strong>总结</strong></span>
</li></ul></div><p class="maodian"></p><h2>
<span><strong>简介</strong></span>
</h2>
<p>
linux下用户程序同内核通信的方式一般有ioctl, proc文件系统,剩下一个就是Netlink套接字了。 这里先介绍下netlink。</p>
<p>
Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。</p>
<p>
Netlink 相对于系统调用,ioctl 以及 /proc 文件系统而言具有以下优点:</p>
<p>
1,为了使用 netlink,用户仅需要在 include/linux/netlink.h 中增加一个新类型的 netlink 协议定义即可, 如 #define NETLINK_MYTEST 17 然后,内核和用户态应用就可以立即通过 socket API 使用该 netlink 协议类型进行数据交换。但系统调用需要增加新的系统调用,ioctl 则需要增加设备或文件, 那需要不少代码,proc 文件系统则需要在 /proc 下添加新的文件或目录,那将使本来就混乱的 /proc 更加混乱。</p>
<p>
2. netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接 收队列,而不需要等待接收者收到消息,但系统调用与 ioctl 则是同步通信机制,如果传递的数据太长,将影响调度粒度。</p>
<p>
3.使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖,但系统调用就有依赖,而且新的系统调用的实现必须静态地连接到内核中,它无法在模块中实现,使用新系统调用的应用在编译时需要依赖内核。</p>
<p>
4.netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知机制就使用了这一特性,任何对内核事件感兴趣的应用都能收到该子系统发送的内核事件,在 后面的文章中将介绍这一机制的使用。</p>
<p>
5.内核可以使用 netlink 首先发起会话,但系统调用和 ioctl 只能由用户应用发起调用。</p>
<p>
6.netlink 使用标准的 socket API,因此很容易使用,但系统调用和 ioctl则需要专门的培训才能使用。</p>
<p>
下面这两部分代码主要的目的是用netlink机制实现用户程序和内核的通信。 具体就是用户程序执行./netlink -S [我是参数] 或./netlink -G 时,内核会返回"S know you!" 和“I know you!” 这两种字符串, 然后输出。 内核和用户程序均加有打印。</p>
<p class="maodian"></p><h2>
<span><strong>内核模块</strong></span>
</h2>
<p>
<strong>1. Makefile依赖的编译规则 ruler.dir</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_245723">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">PWD := $(shell pwd) </code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">all: modules romfs </code>
</div>
<div class="line number4 index3 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">modules: </code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code><code class="plain plain">$(MAKE) -C $(KDIR) M=$(PWD) modules </code>
</div>
<div class="line number7 index6 alt2">
<code class="plain spaces"> </code><code class="plain plain">@echo $(OBJ) </code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number9 index8 alt2">
<code class="plain plain">modules_install: </code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">$(MAKE) -C $(KDIR) M=$(PWD) modules_install </code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="plain plain">romfs: </code>
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code><code class="plain plain">cp -rf *.ko $(MODULES_BUILD_DIR) </code>
</div>
<div class="line number14 index13 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number15 index14 alt2">
<code class="plain plain">clean: </code>
</div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">rm *.o *.ko *.mod.* Module.* modules.* </code>
</div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">rm -rf $(MODULES_BUILD_DIR) </code>
</div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number19 index18 alt2">
<code class="plain plain">obj-m := $(MOD_NAME).o</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>2.Makefile</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterplain" id="highlighter_790481">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="plain plain">KERNEL_MODULES := netlink </code>
</div>
<div class="line number2 index1 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number3 index2 alt2">
<code class="plain plain">export MODULES_ROOT_DIR := $(shell pwd) </code>
</div>
<div class="line number4 index3 alt1">
<code class="plain plain">export MODULES_BUILD_DIR := $(MODULES_ROOT_DIR)/build </code>
</div>
<div class="line number5 index4 alt2">
<code class="plain plain">export KDIR := /lib/modules/$(shell uname -r)/build #这行是为了取出系统下内核的目录(ubuntu) </code>
</div>
<div class="line number6 index5 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number7 index6 alt2">
<code class="plain plain">all: init modules romfs </code>
</div>
<div class="line number8 index7 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number9 index8 alt2">
<code class="plain plain">init: </code>
</div>
<div class="line number10 index9 alt1">
<code class="plain spaces"> </code><code class="plain plain">mkdir -p $(MODULES_BUILD_DIR) </code>
</div>
<div class="line number11 index10 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="plain plain">modules:$(patsubst %, _dir_%, $(KERNEL_MODULES)) </code>
</div>
<div class="line number13 index12 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number14 index13 alt1">
<code class="plain plain">$(patsubst %, _dir_%, $(KERNEL_MODULES)): </code>
</div>
<div class="line number15 index14 alt2">
<code class="plain spaces"> </code><code class="plain plain">@echo </code>
</div>
<div class="line number16 index15 alt1">
<code class="plain spaces"> </code><code class="plain plain">@echo Building $(patsubst _dir_%, %, $@) </code>
</div>
<div class="line number17 index16 alt2">
<code class="plain spaces"> </code><code class="plain plain">$(MAKE) -C $(patsubst _dir_%, %, $@) all </code>
</div>
<div class="line number18 index17 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number19 index18 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number20 index19 alt1">
<code class="plain plain">romfs: $(patsubst %, _romfs_%, $(KERNEL_MODULES)) </code>
</div>
<div class="line number21 index20 alt2">
<code class="plain plain">$(patsubst %, _romfs_%, $(KERNEL_MODULES)): </code>
</div>
<div class="line number22 index21 alt1">
<code class="plain spaces"> </code><code class="plain plain">$(MAKE) -C $(patsubst _romfs_%, %, $@) romfs </code>
</div>
<div class="line number23 index22 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number24 index23 alt1">
<code class="plain spaces"> </code>
</div>
<div class="line number25 index24 alt2">
<code class="plain plain">clean: $(patsubst %, _clean_%, $(KERNEL_MODULES)) </code>
</div>
<div class="line number26 index25 alt1">
<code class="plain spaces"> </code><code class="plain plain">$(RM) $(BUILD_DIR) </code>
</div>
<div class="line number27 index26 alt2">
<code class="plain plain">$(patsubst %, _clean_%, $(KERNEL_MODULES)): </code>
</div>
<div class="line number28 index27 alt1">
<code class="plain spaces"> </code><code class="plain plain">@echo </code>
</div>
<div class="line number29 index28 alt2">
<code class="plain spaces"> </code><code class="plain plain">@echo Cleaning $(patsubst _dir_%, %, $@) </code>
</div>
<div class="line number30 index29 alt1">
<code class="plain spaces"> </code><code class="plain plain">$(MAKE) -C $(patsubst _clean_%, %, $@) clean </code>
</div>
<div class="line number31 index30 alt2">
<code class="plain spaces"> </code>
</div>
<div class="line number32 index31 alt1">
<code class="plain plain">.PHONY:</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>3. ./netlink/netlink.c</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_310948">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
<div class="line number84 index83 alt1">
84</div>
<div class="line number85 index84 alt2">
85</div>
<div class="line number86 index85 alt1">
86</div>
<div class="line number87 index86 alt2">
87</div>
<div class="line number88 index87 alt1">
88</div>
<div class="line number89 index88 alt2">
89</div>
<div class="line number90 index89 alt1">
90</div>
<div class="line number91 index90 alt2">
91</div>
<div class="line number92 index91 alt1">
92</div>
<div class="line number93 index92 alt2">
93</div>
<div class="line number94 index93 alt1">
94</div>
<div class="line number95 index94 alt2">
95</div>
<div class="line number96 index95 alt1">
96</div>
<div class="line number97 index96 alt2">
97</div>
<div class="line number98 index97 alt1">
98</div>
<div class="line number99 index98 alt2">
99</div>
<div class="line number100 index99 alt1">
100</div>
<div class="line number101 index100 alt2">
101</div>
<div class="line number102 index101 alt1">
102</div>
<div class="line number103 index102 alt2">
103</div>
<div class="line number104 index103 alt1">
104</div>
<div class="line number105 index104 alt2">
105</div>
<div class="line number106 index105 alt1">
106</div>
<div class="line number107 index106 alt2">
107</div>
<div class="line number108 index107 alt1">
108</div>
<div class="line number109 index108 alt2">
109</div>
<div class="line number110 index109 alt1">
110</div>
<div class="line number111 index110 alt2">
111</div>
<div class="line number112 index111 alt1">
112</div>
<div class="line number113 index112 alt2">
113</div>
<div class="line number114 index113 alt1">
114</div>
<div class="line number115 index114 alt2">
115</div>
<div class="line number116 index115 alt1">
116</div>
<div class="line number117 index116 alt2">
117</div>
<div class="line number118 index117 alt1">
118</div>
<div class="line number119 index118 alt2">
119</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* netlink.c </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* Created on: 2014 * Author: cr </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include <linux/init.h> </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp preprocessor">#include <linux/module.h> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include <linux/kernel.h> </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#include <linux/skbuff.h> </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp preprocessor">#include <linux/ip.h> </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp preprocessor">#include <linux/types.h> </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp preprocessor">#include <linux/sched.h> </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp preprocessor">#include <linux/netlink.h> </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp preprocessor">#include <net/sock.h> </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp preprocessor">#include "usrlink.h" </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp plain">MODULE_LICENSE(</code><code class="cpp string">"Dual BSD/GPL"</code><code class="cpp plain">); </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp plain">MODULE_AUTHOR(</code><code class="cpp string">"MDAXIA"</code><code class="cpp plain">); </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp keyword bold">struct</code> <code class="cpp plain">sock *netlink_fd; </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">netlink_to_user(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">dest, </code><code class="cpp keyword bold">void</code> <code class="cpp plain">*buf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">len) </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *nl; </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sk_buff *skb; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">size; </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">size = NLMSG_SPACE(len); </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">skb = alloc_skb(size, GFP_ATOMIC); </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(!skb || !buf) </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"netlink_to_user skb of buf null! "</code><code class="cpp plain">); </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code><code class="cpp plain">; </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">nl = nlmsg_put(skb, 0, 0, 0, NLMSG_SPACE(len) - </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr), 0); </code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NETLINK_CB(skb).pid = 0; </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NETLINK_CB(skb).dst_group = 0; </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(NLMSG_DATA(nl), buf, len); </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">nl->nlmsg_len = (len > 2) ? (len - 2):len; </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_unicast(netlink_fd, skb, dest, MSG_DONTWAIT); </code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"K send packet success "</code><code class="cpp plain">); </code>
</div>
<div class="line number46 index45 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">process_hello_get(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">dest, </code><code class="cpp keyword bold">void</code> <code class="cpp plain">*buf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">len) </code>
</div>
<div class="line number49 index48 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"In process_hello get! "</code><code class="cpp plain">); </code>
</div>
<div class="line number51 index50 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(buf, </code><code class="cpp string">"I known you !"</code><code class="cpp plain">, 13); </code>
</div>
<div class="line number52 index51 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_to_user(dest, buf, 13); </code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_OK; </code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">process_hello_set(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">dest, </code><code class="cpp keyword bold">void</code> <code class="cpp plain">*buf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">len) </code>
</div>
<div class="line number57 index56 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number58 index57 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"In process_hello set! %s "</code><code class="cpp plain">, (</code><code class="cpp color1 bold">char</code> <code class="cpp plain">*)buf); </code>
</div>
<div class="line number59 index58 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(buf, </code><code class="cpp string">"S known you !"</code><code class="cpp plain">, 13); </code>
</div>
<div class="line number60 index59 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_to_user(dest, buf, 13); </code>
</div>
<div class="line number61 index60 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_OK; </code>
</div>
<div class="line number62 index61 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number63 index62 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number64 index63 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number65 index64 alt2">
<code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">netlink_process_packet(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *nl) </code>
</div>
<div class="line number66 index65 alt1">
<code class="cpp plain">{ </code>
</div>
<div class="line number67 index66 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret; </code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number69 index68 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">switch</code><code class="cpp plain">(nl->nlmsg_type) </code>
</div>
<div class="line number70 index69 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">HELLO_GET: </code>
</div>
<div class="line number72 index71 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">ret = process_hello_get(nl->nlmsg_pid, NLMSG_DATA(nl), nl->nlmsg_len); </code>
</div>
<div class="line number73 index72 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
<div class="line number74 index73 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">HELLO_SET: </code>
</div>
<div class="line number75 index74 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">ret = process_hello_set(nl->nlmsg_pid, NLMSG_DATA(nl), nl->nlmsg_len); </code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
<div class="line number77 index76 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">default</code><code class="cpp plain">:</code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
<div class="line number78 index77 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp plain">} </code>
</div>
<div class="line number80 index79 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number81 index80 alt2">
<code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">netlink_recv_packet(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sk_buff *__skb) </code>
</div>
<div class="line number82 index81 alt1">
<code class="cpp plain">{ </code>
</div>
<div class="line number83 index82 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sk_buff *skb; </code>
</div>
<div class="line number84 index83 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *nlhdr; </code>
</div>
<div class="line number85 index84 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number86 index85 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">skb = skb_get(__skb); </code>
</div>
<div class="line number87 index86 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(skb->len >= </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr)) </code>
</div>
<div class="line number88 index87 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number89 index88 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr = (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *)skb->data; </code>
</div>
<div class="line number90 index89 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(nlhdr->nlmsg_len >= </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr) && </code>
</div>
<div class="line number91 index90 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">__skb->len >= nlhdr->nlmsg_len) </code>
</div>
<div class="line number92 index91 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number93 index92 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_process_packet(nlhdr); </code>
</div>
<div class="line number94 index93 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number95 index94 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number96 index95 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">else</code>
</div>
<div class="line number97 index96 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"Kernel receive msg length error! "</code><code class="cpp plain">); </code>
</div>
<div class="line number98 index97 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number99 index98 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number100 index99 alt1">
<code class="cpp keyword bold">static</code> <code class="cpp color1 bold">int</code> <code class="cpp plain">__init netlink_init(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
<div class="line number101 index100 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number102 index101 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_fd = netlink_kernel_create(&init_net, USER_NETLINK_CMD, 0, netlink_recv_packet, NULL, THIS_MODULE); </code>
</div>
<div class="line number103 index102 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(NULL == netlink_fd) </code>
</div>
<div class="line number104 index103 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number105 index104 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"Init netlink! "</code><code class="cpp plain">); </code>
</div>
<div class="line number106 index105 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">-1; </code>
</div>
<div class="line number107 index106 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number108 index107 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"Init netlink success! "</code><code class="cpp plain">); </code>
</div>
<div class="line number109 index108 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
<div class="line number110 index109 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number111 index110 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number112 index111 alt1">
<code class="cpp keyword bold">static</code> <code class="cpp keyword bold">void</code> <code class="cpp plain">__exit netlink_exit(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
<div class="line number113 index112 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number114 index113 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_kernel_release(netlink_fd); </code>
</div>
<div class="line number115 index114 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">printk(KERN_ALERT </code><code class="cpp string">"Exit netlink! "</code><code class="cpp plain">); </code>
</div>
<div class="line number116 index115 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number117 index116 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number118 index117 alt1">
<code class="cpp plain">module_init(netlink_init); </code>
</div>
<div class="line number119 index118 alt2">
<code class="cpp plain">module_exit(netlink_exit);</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>4. ./netlink/usrlink.h</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_909497">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* usrlink.h </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* Created on: 2014骞?鏈?7鏃? * Author: cr </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#ifndef USRLINK_H_ </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#define USRLINK_H_ </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#define USER_NETLINK_CMD 25 </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#define MAXMSGLEN 1024 </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">error_e { </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NET_ERROR, </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NET_OK, </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NET_PARAM, </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NET_MEM, </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NET_SOCK, </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp plain">} netlink_err; </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">module_e { </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_CMD = 1, </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp plain">} netlink_module; </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">type_e { </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_SET, </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_GET, </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp plain">} netlink_type; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp preprocessor">#endif /* USRLINK_H_ */</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>5. ./netlink/Makefile</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_871101">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp plain">MOD_NAME := netlink </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp plain">$(MOD_NAME)-objs : netlink.o </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp plain">-include $(MODULES_ROOT_DIR)/rules.dir </code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp plain">.PHONY:</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>6. 编译方式</strong>。</p>
<p>
其中Makefile、rulers.dir 在Knetlink/下, netlink.c 、netlink.h 、Makefile在Knetlink/netlink/目录下。 编译时在Knetlink目录下执行Make即可</p>
<p class="maodian"></p><h2>
<span><strong>用户程序</strong></span>
</h2>
<p>
用户程序的Makefile 这里就不放出了。 我是直接在eclipse下建的工程 自动编译的、...</p>
<p>
<strong>1. netlink.c</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_95754">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
<div class="line number80 index79 alt1">
80</div>
<div class="line number81 index80 alt2">
81</div>
<div class="line number82 index81 alt1">
82</div>
<div class="line number83 index82 alt2">
83</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* usrlink.c </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* Created on: 2014骞?鏈?7鏃? * Author: cr </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include <stdlib.h> </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp preprocessor">#include <string.h> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include <unistd.h> </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#include "usrlink.h" </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_sock_init(netlink_sock *netlink_s, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">module, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">protocol) </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->sock = socket(PF_NETLINK, SOCK_RAW, protocol); </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(netlink_s->sock < 0) </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_SOCK; </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memset</code><code class="cpp plain">(&netlink_s->src, 0 ,</code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(netlink_s->src)); </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->src.nl_family = AF_NETLINK; </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->src.nl_pid = module; </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->src.nl_groups = 0; </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(bind(netlink_s->sock, (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr *)&netlink_s->src, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(netlink_s->src)) < 0) </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_SOCK; </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->dest.nl_family = AF_NETLINK; </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->dest.nl_pid = 0; </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_s->dest.nl_groups = 0; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_OK; </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_send(netlink_sock *netlink_s, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">type, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*sbuf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">slen, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*rbuf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">*rlen) </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">msghdr msg; </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *nlhdr = NULL; </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">iovec iov; </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret; </code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr = (</code><code class="cpp keyword bold">struct</code> <code class="cpp plain">nlmsghdr *)</code><code class="cpp functions bold">malloc</code><code class="cpp plain">(NLMSG_SPACE(MAXMSGLEN)); </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(NULL == nlhdr) </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_MEM; </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(NLMSG_DATA(nlhdr), sbuf, slen); </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr->nlmsg_len = NLMSG_SPACE(slen); </code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr->nlmsg_pid = netlink_s->src.nl_pid; </code>
</div>
<div class="line number46 index45 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr->nlmsg_type = type; </code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">nlhdr->nlmsg_flags = 0; </code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number49 index48 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">iov.iov_base = (</code><code class="cpp keyword bold">void</code> <code class="cpp plain">*)nlhdr; </code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">iov.iov_len = nlhdr->nlmsg_len; </code>
</div>
<div class="line number51 index50 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number52 index51 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">msg.msg_name = (</code><code class="cpp keyword bold">void</code> <code class="cpp plain">*)&(netlink_s->dest); </code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">msg.msg_namelen = </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(netlink_s->dest); </code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">msg.msg_iov = &iov; </code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">msg.msg_iovlen = 1; </code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number57 index56 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">ret = sendmsg(netlink_s->sock, &msg, 0); </code>
</div>
<div class="line number58 index57 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(ret < 0) </code>
</div>
<div class="line number59 index58 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number60 index59 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Send fail "</code><code class="cpp plain">); </code>
</div>
<div class="line number61 index60 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">error; </code>
</div>
<div class="line number62 index61 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number63 index62 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">ret = recvmsg(netlink_s->sock, &msg, 0); </code>
</div>
<div class="line number64 index63 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(ret < 0) </code>
</div>
<div class="line number65 index64 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number66 index65 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Read fail "</code><code class="cpp plain">); </code>
</div>
<div class="line number67 index66 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">error; </code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number69 index68 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memcpy</code><code class="cpp plain">(rbuf, NLMSG_DATA(nlhdr), nlhdr->nlmsg_len); </code>
</div>
<div class="line number70 index69 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">*rlen = nlhdr->nlmsg_len; </code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_OK; </code>
</div>
<div class="line number72 index71 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number73 index72 alt2">
<code class="cpp plain">error: </code>
</div>
<div class="line number74 index73 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">free</code><code class="cpp plain">(nlhdr); </code>
</div>
<div class="line number75 index74 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_SOCK; </code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number77 index76 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number78 index77 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_sock_deinit(netlink_sock *netlink_s) </code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number80 index79 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">close(netlink_s->sock); </code>
</div>
<div class="line number81 index80 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">memset</code><code class="cpp plain">(netlink_s, 0, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(netlink_sock)); </code>
</div>
<div class="line number82 index81 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_OK; </code>
</div>
<div class="line number83 index82 alt2">
<code class="cpp plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>2. netlink.h</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_406892">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* usrlink.h </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* Created on: 2014 * Author: cr </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <sys/types.h> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include <sys/socket.h> </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp preprocessor">#include <asm/types.h> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include <linux/socket.h> </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp preprocessor">#include <linux/netlink.h> </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp preprocessor">#ifndef USRLINK_H_ </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp preprocessor">#define USRLINK_H_ </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp preprocessor">#define USER_NETLINK_CMD 25 </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp preprocessor">#define MAXMSGLEN 1024 </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">error_e { </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NET_ERROR, </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NET_OK, </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NET_PARAM, </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">NET_MEM, </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">NET_SOCK, </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp plain">} netlink_err; </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">module_e { </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_CMD = 1, </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp plain">} netlink_module; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">enum</code> <code class="cpp plain">type_e { </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_SET, </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">HELLO_GET, </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp plain">} netlink_type; </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp keyword bold">typedef</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">usr_sock_h { </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">sock; </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr_nl dest; </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">struct</code> <code class="cpp plain">sockaddr_nl src; </code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp plain">} netlink_sock; </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_sock_init(netlink_sock *netlink_s, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">module, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">protocol); </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_sock_deinit(netlink_sock *netlink_s); </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">netlink_send(netlink_sock *netlink_s, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">type, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*sbuf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">slen, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">*rbuf, </code><code class="cpp color1 bold">int</code> <code class="cpp plain">*rlen); </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp preprocessor">#endif /* USRLINK_H_ */</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
<strong>3. main.c</strong></p>
<div class="jb51code">
<div>
<div class="syntaxhighlightercpp" id="highlighter_26244">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
<div class="line number23 index22 alt2">
23</div>
<div class="line number24 index23 alt1">
24</div>
<div class="line number25 index24 alt2">
25</div>
<div class="line number26 index25 alt1">
26</div>
<div class="line number27 index26 alt2">
27</div>
<div class="line number28 index27 alt1">
28</div>
<div class="line number29 index28 alt2">
29</div>
<div class="line number30 index29 alt1">
30</div>
<div class="line number31 index30 alt2">
31</div>
<div class="line number32 index31 alt1">
32</div>
<div class="line number33 index32 alt2">
33</div>
<div class="line number34 index33 alt1">
34</div>
<div class="line number35 index34 alt2">
35</div>
<div class="line number36 index35 alt1">
36</div>
<div class="line number37 index36 alt2">
37</div>
<div class="line number38 index37 alt1">
38</div>
<div class="line number39 index38 alt2">
39</div>
<div class="line number40 index39 alt1">
40</div>
<div class="line number41 index40 alt2">
41</div>
<div class="line number42 index41 alt1">
42</div>
<div class="line number43 index42 alt2">
43</div>
<div class="line number44 index43 alt1">
44</div>
<div class="line number45 index44 alt2">
45</div>
<div class="line number46 index45 alt1">
46</div>
<div class="line number47 index46 alt2">
47</div>
<div class="line number48 index47 alt1">
48</div>
<div class="line number49 index48 alt2">
49</div>
<div class="line number50 index49 alt1">
50</div>
<div class="line number51 index50 alt2">
51</div>
<div class="line number52 index51 alt1">
52</div>
<div class="line number53 index52 alt2">
53</div>
<div class="line number54 index53 alt1">
54</div>
<div class="line number55 index54 alt2">
55</div>
<div class="line number56 index55 alt1">
56</div>
<div class="line number57 index56 alt2">
57</div>
<div class="line number58 index57 alt1">
58</div>
<div class="line number59 index58 alt2">
59</div>
<div class="line number60 index59 alt1">
60</div>
<div class="line number61 index60 alt2">
61</div>
<div class="line number62 index61 alt1">
62</div>
<div class="line number63 index62 alt2">
63</div>
<div class="line number64 index63 alt1">
64</div>
<div class="line number65 index64 alt2">
65</div>
<div class="line number66 index65 alt1">
66</div>
<div class="line number67 index66 alt2">
67</div>
<div class="line number68 index67 alt1">
68</div>
<div class="line number69 index68 alt2">
69</div>
<div class="line number70 index69 alt1">
70</div>
<div class="line number71 index70 alt2">
71</div>
<div class="line number72 index71 alt1">
72</div>
<div class="line number73 index72 alt2">
73</div>
<div class="line number74 index73 alt1">
74</div>
<div class="line number75 index74 alt2">
75</div>
<div class="line number76 index75 alt1">
76</div>
<div class="line number77 index76 alt2">
77</div>
<div class="line number78 index77 alt1">
78</div>
<div class="line number79 index78 alt2">
79</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="cpp comments">/* </code>
</div>
<div class="line number2 index1 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* main.c </code>
</div>
<div class="line number3 index2 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">* </code>
</div>
<div class="line number4 index3 alt1">
<code class="cpp spaces"> </code><code class="cpp comments">* Created on: 2014骞?鏈?7鏃? * Author: cr </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp spaces"> </code><code class="cpp comments">*/</code>
</div>
<div class="line number6 index5 alt1">
<code class="cpp preprocessor">#include <stdio.h> </code>
</div>
<div class="line number7 index6 alt2">
<code class="cpp preprocessor">#include <stdlib.h> </code>
</div>
<div class="line number8 index7 alt1">
<code class="cpp preprocessor">#include <string.h> </code>
</div>
<div class="line number9 index8 alt2">
<code class="cpp preprocessor">#include "usrlink.h" </code>
</div>
<div class="line number10 index9 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number11 index10 alt2">
<code class="cpp color1 bold">int</code> <code class="cpp plain">parse_ret(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret) </code>
</div>
<div class="line number12 index11 alt1">
<code class="cpp plain">{ </code>
</div>
<div class="line number13 index12 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">switch</code><code class="cpp plain">(ret) </code>
</div>
<div class="line number14 index13 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number15 index14 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">NET_OK: </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">ret; </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">NET_ERROR: </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"error "</code><code class="cpp plain">); </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number20 index19 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">NET_MEM: </code>
</div>
<div class="line number21 index20 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Memory error "</code><code class="cpp plain">); </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">NET_PARAM: </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Param error "</code><code class="cpp plain">); </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">case</code> <code class="cpp plain">NET_SOCK: </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Socket error "</code><code class="cpp plain">); </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">default</code><code class="cpp plain">:</code><code class="cpp keyword bold">break</code><code class="cpp plain">; </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number31 index30 alt2">
<code class="cpp plain">exit_p: </code>
</div>
<div class="line number32 index31 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">NET_ERROR; </code>
</div>
<div class="line number33 index32 alt2">
<code class="cpp plain">} </code>
</div>
<div class="line number34 index33 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number35 index34 alt2">
<code class="cpp keyword bold">void</code> <code class="cpp plain">usage(</code><code class="cpp keyword bold">void</code><code class="cpp plain">) </code>
</div>
<div class="line number36 index35 alt1">
<code class="cpp plain">{ </code>
</div>
<div class="line number37 index36 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"Usage: Netlink -G <param> -S <param> "</code><code class="cpp plain">); </code>
</div>
<div class="line number38 index37 alt1">
<code class="cpp plain">} </code>
</div>
<div class="line number39 index38 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number40 index39 alt1">
<code class="cpp color1 bold">int</code> <code class="cpp plain">main(</code><code class="cpp color1 bold">int</code> <code class="cpp plain">argc, </code><code class="cpp color1 bold">char</code> <code class="cpp plain">**argv) </code>
</div>
<div class="line number41 index40 alt2">
<code class="cpp plain">{ </code>
</div>
<div class="line number42 index41 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_sock h_sock; </code>
</div>
<div class="line number43 index42 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">rbuf; </code>
</div>
<div class="line number44 index43 alt1">
<code class="cpp spaces"> </code><code class="cpp color1 bold">char</code> <code class="cpp plain">sbuf; </code>
</div>
<div class="line number45 index44 alt2">
<code class="cpp spaces"> </code><code class="cpp color1 bold">int</code> <code class="cpp plain">ret, type, slen = 0, rlen = 0; </code>
</div>
<div class="line number46 index45 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number47 index46 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">ret = netlink_sock_init(&h_sock, HELLO_CMD, USER_NETLINK_CMD); </code>
</div>
<div class="line number48 index47 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(NET_OK != parse_ret(ret)) </code>
</div>
<div class="line number49 index48 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number50 index49 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number51 index50 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">bzero(&rbuf, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(rbuf)); </code>
</div>
<div class="line number52 index51 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">bzero(&sbuf, </code><code class="cpp keyword bold">sizeof</code><code class="cpp plain">(sbuf)); </code>
</div>
<div class="line number53 index52 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(argc < 3) </code>
</div>
<div class="line number54 index53 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number55 index54 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">usage(); </code>
</div>
<div class="line number56 index55 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number57 index56 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number58 index57 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(!</code><code class="cpp functions bold">strncmp</code><code class="cpp plain">(</code><code class="cpp string">"-G"</code><code class="cpp plain">, argv, 2)) </code>
</div>
<div class="line number59 index58 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">type = HELLO_GET; </code>
</div>
<div class="line number60 index59 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">else</code> <code class="cpp keyword bold">if</code><code class="cpp plain">(!</code><code class="cpp functions bold">strncmp</code><code class="cpp plain">(</code><code class="cpp string">"-S"</code><code class="cpp plain">, argv, 2)) </code>
</div>
<div class="line number61 index60 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">type = HELLO_SET; </code>
</div>
<div class="line number62 index61 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number63 index62 alt2">
<code class="cpp spaces"> </code><code class="cpp functions bold">strcpy</code><code class="cpp plain">(sbuf, argv); </code>
</div>
<div class="line number64 index63 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">slen = </code><code class="cpp functions bold">strlen</code><code class="cpp plain">(sbuf); </code>
</div>
<div class="line number65 index64 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">ret = netlink_send(&h_sock, type, sbuf, slen, rbuf, &rlen); </code>
</div>
<div class="line number66 index65 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(NET_OK != parse_ret(ret)) </code>
</div>
<div class="line number67 index66 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">exit_p; </code>
</div>
<div class="line number68 index67 alt1">
<code class="cpp spaces"> </code>
</div>
<div class="line number69 index68 alt2">
<code class="cpp spaces"> </code><code class="cpp keyword bold">if</code><code class="cpp plain">(rlen > 0) </code>
</div>
<div class="line number70 index69 alt1">
<code class="cpp spaces"> </code><code class="cpp plain">{ </code>
</div>
<div class="line number71 index70 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">rbuf = </code><code class="cpp string">''</code><code class="cpp plain">; </code>
</div>
<div class="line number72 index71 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"K rep :%s "</code><code class="cpp plain">, rlen, rbuf); </code>
</div>
<div class="line number73 index72 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">} </code>
</div>
<div class="line number74 index73 alt1">
<code class="cpp spaces"> </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"K: %s "</code><code class="cpp plain">, rlen, rbuf); </code>
</div>
<div class="line number75 index74 alt2">
<code class="cpp spaces"> </code>
</div>
<div class="line number76 index75 alt1">
<code class="cpp plain">exit_p: </code>
</div>
<div class="line number77 index76 alt2">
<code class="cpp spaces"> </code><code class="cpp plain">netlink_sock_deinit(&h_sock); </code>
</div>
<div class="line number78 index77 alt1">
<code class="cpp spaces"> </code><code class="cpp keyword bold">return</code> <code class="cpp plain">0; </code>
</div>
<div class="line number79 index78 alt2">
<code class="cpp plain">}</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p class="maodian"></p><h2>
<span><strong>总结</strong></span>
</h2>
<p>
以上就是本文关于linux下用户程序同内核通信详解(netlink机制)的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!</p>
<p>
原文链接:http://blog.csdn.net/daydring/article/details/24000081</p>
頁:
[1]