diff options
author | hunt <hunt> | 2005-04-07 21:48:47 +0000 |
---|---|---|
committer | hunt <hunt> | 2005-04-07 21:48:47 +0000 |
commit | 655ee2825121e149a9976e562946892efb20aea1 (patch) | |
tree | 91b9b4cc46aeee50e9d789689bea0b96e11ceba1 /runtime/docs/html/test4_2dtr_8c-source.html | |
parent | 3d4bc8bea6b45893bd4b49f44df26bd602b4cba5 (diff) | |
download | systemtap-steved-655ee2825121e149a9976e562946892efb20aea1.tar.gz systemtap-steved-655ee2825121e149a9976e562946892efb20aea1.tar.xz systemtap-steved-655ee2825121e149a9976e562946892efb20aea1.zip |
*** empty log message ***
Diffstat (limited to 'runtime/docs/html/test4_2dtr_8c-source.html')
-rw-r--r-- | runtime/docs/html/test4_2dtr_8c-source.html | 385 |
1 files changed, 137 insertions, 248 deletions
diff --git a/runtime/docs/html/test4_2dtr_8c-source.html b/runtime/docs/html/test4_2dtr_8c-source.html index af19db1a..c3d65197 100644 --- a/runtime/docs/html/test4_2dtr_8c-source.html +++ b/runtime/docs/html/test4_2dtr_8c-source.html @@ -4,260 +4,149 @@ <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.1 --> -<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div> +<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div> <div class="nav"> <a class="el" href="dir_000000.html">probes</a> / <a class="el" href="dir_000003.html">test4</a></div> <h1>dtr.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#define HASH_TABLE_BITS 8</span> 00002 <span class="preprocessor"></span><span class="preprocessor">#define HASH_TABLE_SIZE (1<<HASH_TABLE_BITS)</span> 00003 <span class="preprocessor"></span><span class="preprocessor">#define BUCKETS 16 </span><span class="comment">/* largest histogram width */</span> -00004 <span class="preprocessor">#include <linux/module.h></span> -00005 <span class="preprocessor">#include <linux/interrupt.h></span> -00006 <span class="preprocessor">#include <net/sock.h></span> -00007 <span class="preprocessor">#include <linux/netlink.h></span> -00008 -00009 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span> -00010 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span> -00011 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span> -00012 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span> -00013 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span> -00014 -00015 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>); -00016 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>); +00004 +00005 <span class="preprocessor">#define STP_NETLINK_ONLY</span> +00006 <span class="preprocessor"></span><span class="preprocessor">#define STP_NUM_STRINGS 1</span> +00007 <span class="preprocessor"></span> +00008 <span class="preprocessor">#include <linux/module.h></span> +00009 <span class="preprocessor">#include <linux/interrupt.h></span> +00010 <span class="preprocessor">#include <net/sock.h></span> +00011 <span class="preprocessor">#include <linux/netlink.h></span> +00012 +00013 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span> +00014 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span> +00015 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span> +00016 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span> 00017 -00018 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000]; -00019 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *); -00020 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer); +00018 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>); +00019 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt <hunt@redhat.com>"</span>); +00020 00021 -00022 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces; -00023 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0; -00024 -00025 <span class="comment">/* netlink control channel */</span> -00026 <span class="keyword">static</span> <span class="keyword">struct </span>sock *control; -00027 <span class="keyword">static</span> <span class="keywordtype">int</span> seq = 0; -00028 -00029 <span class="keywordtype">int</span> pid; -00030 <span class="comment">/*</span> -00031 <span class="comment"> * send_reply - send reply to userspace over netlink control channel</span> -00032 <span class="comment"> */</span> -00033 <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply(<span class="keywordtype">int</span> type, <span class="keywordtype">void</span> *reply, <span class="keywordtype">int</span> len, <span class="keywordtype">int</span> pid) -00034 { -00035 <span class="keyword">struct </span>sk_buff *skb; -00036 <span class="keyword">struct </span>nlmsghdr *nlh; -00037 <span class="keywordtype">void</span> *data; -00038 <span class="keywordtype">int</span> size; -00039 <span class="keywordtype">int</span> err; -00040 -00041 size = NLMSG_SPACE(len); -00042 skb = alloc_skb(size, GFP_KERNEL); -00043 <span class="keywordflow">if</span> (!skb) -00044 return -1; -00045 nlh = NLMSG_PUT(skb, pid, seq++, type, size - sizeof(*nlh)); -00046 nlh->nlmsg_flags = 0; -00047 data = NLMSG_DATA(nlh); -00048 memcpy(data, reply, len); -00049 err = netlink_unicast(control, skb, pid, MSG_DONTWAIT); -00050 -00051 return 0; -00052 -00053 nlmsg_failure: -00054 if (skb) -00055 kfree_skb(skb); -00056 -00057 return -1; -00058 } +00022 <a class="code" href="group__maps.html#ga1">MAP</a> opens, reads, writes, traces; +00023 +00024 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode) +00025 { +00026 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm); +00027 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1); +00028 jprobe_return(); +00029 <span class="keywordflow">return</span> 0; +00030 } +00031 +00032 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count) +00033 { +00034 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm); +00035 <a class="code" href="group__maps.html#ga24">_stp_map_stat_add</a> (reads, count); +00036 jprobe_return(); +00037 <span class="keywordflow">return</span> 0; +00038 } +00039 +00040 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count) +00041 { +00042 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm); +00043 <a class="code" href="group__maps.html#ga24">_stp_map_stat_add</a> (writes, count); +00044 jprobe_return(); +00045 <span class="keywordflow">return</span> 0; +00046 } +00047 +00048 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v) +00049 { +00050 String str = <a class="code" href="group__string.html#ga2">_stp_string_init</a> (0); +00051 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0); +00052 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0); +00053 <a class="code" href="group__lists.html#ga6">_stp_list_add</a> (traces, <a class="code" href="group__stack.html#ga7">_stp_stack_sprint</a>(str, 0, 0)); +00054 +00055 jprobe_return(); +00056 <span class="keywordflow">return</span> 0; +00057 } +00058 00059 -00060 static <span class="keywordtype">char</span> pbuff[1024]; -00061 -00062 <span class="keywordtype">void</span> nlog (const <span class="keywordtype">char</span> *fmt, ...) -00063 { -00064 <span class="keywordtype">int</span> len; -00065 va_list args; -00066 va_start(args, fmt); -00067 len = vscnprintf (pbuff, <span class="keyword">sizeof</span>(pbuff), fmt, args) + 1; -00068 va_end(args); -00069 send_reply (42, pbuff, len, pid); -00070 } -00071 -00072 <span class="comment">/*</span> -00073 <span class="comment"> * msg_rcv_skb - dispatch userspace requests from netlink control channel</span> -00074 <span class="comment"> */</span> -00075 <span class="keyword">static</span> <span class="keywordtype">void</span> msg_rcv_skb(<span class="keyword">struct</span> sk_buff *skb) -00076 { -00077 <span class="keyword">struct </span>nlmsghdr *nlh = NULL; -00078 <span class="keywordtype">int</span> flags; -00079 <span class="keywordtype">int</span> nlmsglen, skblen; -00080 <span class="keywordtype">void</span> *data; -00081 -00082 skblen = skb->len; -00083 <span class="comment">// dlog ("skblen = %d %d\n", skblen, sizeof(*nlh));</span> -00084 <span class="keywordflow">if</span> (skblen < <span class="keyword">sizeof</span> (*nlh)) -00085 return; -00086 -00087 nlh = (struct nlmsghdr *)skb->data; -00088 nlmsglen = nlh->nlmsg_len; -00089 -00090 <span class="comment">// dlog ("nlmsghlen=%d\n", nlmsglen);</span> -00091 if (nlmsglen < sizeof(*nlh) || skblen < nlmsglen) -00092 return; -00093 -00094 pid = nlh->nlmsg_pid; -00095 flags = nlh->nlmsg_flags; -00096 -00097 <span class="comment">// dlog ("pid=%d flags=%x %x %x %x\n", pid, flags, NLM_F_REQUEST, MSG_TRUNC, NLM_F_ACK);</span> -00098 if (pid <= 0 || !(flags & NLM_F_REQUEST)) { -00099 netlink_ack(skb, nlh, -EINVAL); -00100 <span class="keywordflow">return</span>; -00101 } -00102 -00103 <span class="keywordflow">if</span> (flags & MSG_TRUNC) { -00104 netlink_ack(skb, nlh, -ECOMM); -00105 <span class="keywordflow">return</span>; -00106 } -00107 -00108 data = NLMSG_DATA(nlh); -00109 -00110 <span class="comment">// dlog ("NETLINK: Got message \"%s\" of type %d from pid %d\n", data, nlh->nlmsg_type,pid);</span> -00111 -00112 <span class="keywordflow">if</span> (flags & NLM_F_ACK) -00113 netlink_ack(skb, nlh, 0); -00114 -00115 send_reply (42, "Howdy Partner", 14, pid); -00116 } -00117 -00118 static <span class="keywordtype">void</span> msg_rcv(struct sock *sk, <span class="keywordtype">int</span> len) -00119 { -00120 <span class="keyword">struct </span>sk_buff *skb; -00121 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"netlink message received\n"</span>); -00122 <span class="keywordflow">while</span> ((skb = skb_dequeue(&sk->sk_receive_queue))) { -00123 msg_rcv_skb(skb); -00124 kfree_skb(skb); -00125 } -00126 } -00127 -00128 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data) -00129 { -00130 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>); -00131 } -00132 -00133 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode) -00134 { -00135 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current->comm); -00136 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1); -00137 jprobe_return(); -00138 <span class="keywordflow">return</span> 0; -00139 } -00140 -00141 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count) -00142 { -00143 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current->comm); -00144 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count); -00145 jprobe_return(); -00146 <span class="keywordflow">return</span> 0; -00147 } -00148 -00149 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count) -00150 { -00151 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current->comm); -00152 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count); -00153 jprobe_return(); -00154 <span class="keywordflow">return</span> 0; -00155 } -00156 -00157 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v) -00158 { -00159 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0); -00160 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0); -00161 -00162 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>(); -00163 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0)); -00164 <span class="keywordflow">if</span> (bufcount++ == 0) -00165 schedule_work (&stp_work); -00166 -00167 jprobe_return(); -00168 return 0; -00169 } -00170 -00171 -00172 static struct jprobe dtr_probes[] = { -00173 { -00174 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>, -00175 .entry = (kprobe_opcode_t *) inst_sys_open -00176 }, -00177 { -00178 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>, -00179 .entry = (kprobe_opcode_t *) inst_sys_read -00180 }, -00181 { -00182 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>, -00183 .entry = (kprobe_opcode_t *) inst_sys_write -00184 }, -00185 { -00186 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>, -00187 .entry = (kprobe_opcode_t *) inst_show_cpuinfo, -00188 }, -00189 }; -00190 -00191 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span> -00192 <span class="preprocessor"></span> -00193 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>) -00194 { -00195 <span class="keywordtype">int</span> ret; -00196 -00197 control = netlink_kernel_create(31, msg_rcv); -00198 <span class="keywordflow">if</span> (!control) { -00199 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"Couldn't create netlink channel\n"</span>); -00200 <span class="keywordflow">return</span> -1; -00201 } -00202 -00203 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64); -00204 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); -00205 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT); -00206 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING); -00207 -00208 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); -00209 -00210 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>); -00211 <span class="keywordflow">return</span> ret; -00212 -00213 } -00214 -00215 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>) -00216 { -00217 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st; -00218 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr; -00219 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr; -00220 -00221 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); -00222 -00223 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr) -00224 nlog ("trace: %s\n", sptr->str); -00225 -00226 foreach (opens, ptr) -00227 nlog ("opens[%s] = %lld\n", key1str(ptr), ptr->val); -00228 nlog ("\n"); -00229 -00230 foreach (reads, st) -00231 nlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), -00232 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); -00233 nlog ("\n"); -00234 -00235 foreach (writes, st) -00236 nlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st), -00237 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); -00238 nlog ("\n"); -00239 -00240 _stp_map_del (opens); -00241 _stp_map_del (reads); -00242 _stp_map_del (writes); -00243 -00244 if (control) -00245 sock_release(control->sk_socket); -00246 -00247 dlog("EXIT\n"); -00248 } -00249 -00250 module_init(init_dtr); -00251 module_exit(cleanup_dtr); -00252 MODULE_LICENSE("GPL"); -00253 +00060 <span class="keyword">static</span> <span class="keyword">struct </span>jprobe dtr_probes[] = { +00061 { +00062 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>, +00063 .entry = (kprobe_opcode_t *) inst_sys_open +00064 }, +00065 { +00066 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>, +00067 .entry = (kprobe_opcode_t *) inst_sys_read +00068 }, +00069 { +00070 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>, +00071 .entry = (kprobe_opcode_t *) inst_sys_write +00072 }, +00073 { +00074 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>, +00075 .entry = (kprobe_opcode_t *) inst_show_cpuinfo, +00076 }, +00077 }; +00078 +00079 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span> +00080 <span class="preprocessor"></span> +00081 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>) +00082 { +00083 <span class="keywordtype">int</span> ret; +00084 +00085 <span class="keywordflow">if</span> (<a class="code" href="group__io.html#ga7">_stp_netlink_open</a>() < 0) +00086 return -1; +00087 +00088 opens = _stp_map_new (1000, INT64); +00089 reads = _stp_map_new (1000, STAT); +00090 writes = _stp_map_new (1000, STAT); +00091 traces = _stp_list_new (1000, STRING); +00092 +00093 ret = _stp_register_jprobes (dtr_probes, MAX_DTR_ROUTINE); +00094 +00095 _stp_log("instrumentation is enabled...\n"); +00096 return ret; +00097 } +00098 +00099 static <span class="keywordtype">void</span> probe_exit (<span class="keywordtype">void</span>) +00100 { +00101 <span class="keyword">struct </span>map_node_stat *st; +00102 <span class="keyword">struct </span>map_node_int64 *ptr; +00103 <span class="keyword">struct </span>map_node_str *sptr; +00104 +00105 <a class="code" href="probes_8c.html#a2">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE); +00106 +00107 <a class="code" href="group__maps.html#ga32">foreach</a> (traces, sptr) { +00108 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"trace: %s\n"</span>, sptr->str); +00109 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> (); +00110 } +00111 +00112 <a class="code" href="group__maps.html#ga32">foreach</a> (opens, ptr) { +00113 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"opens[%s] = %lld\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(ptr), ptr->val); +00114 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> (); +00115 } +00116 +00117 <a class="code" href="group__maps.html#ga32">foreach</a> (reads, st) { +00118 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(st), +00119 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); +00120 <a class="code" href="group__print.html#ga2">_stp_print_flush</a> (); +00121 } +00122 +00123 <a class="code" href="group__maps.html#ga32">foreach</a> (writes, st) { +00124 <a class="code" href="group__print.html#ga3">_stp_printf</a> (<span class="stringliteral">"writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n"</span>, <a class="code" href="group__maps.html#ga25">key1str</a>(st), +00125 st->stats.count, st->stats.sum, st->stats.min, st->stats.max); +00126 <a class="code" href="group__print.html#ga2">_stp_print_flush</a>(); +00127 } +00128 +00129 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (opens); +00130 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (reads); +00131 <a class="code" href="group__maps.html#ga7">_stp_map_del</a> (writes); +00132 } +00133 +00134 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>) +00135 { +00136 <a class="code" href="group__io.html#ga8">_stp_netlink_close</a>(); +00137 } +00138 +00139 module_init(init_dtr); +00140 module_exit(cleanup_dtr); +00141 MODULE_LICENSE(<span class="stringliteral">"GPL"</span>); +00142 </pre></div></body></html> |