6. #include 7. #include 8. #include 9. #include 10. #include 11. #include 12. #include
13.
14. MODULE_AUTHOR(\
15. MODULE_DESCRIPTION(\
e arp_process using jprobe and kretprobe\
16. MODULE_LICENSE(\
17.
18. static int j_arp_process(struct sk_buff *skb)
19. {
20. struct net_device *dev = skb->dev;
21. struct in_device *in_dev;
22. int no_addr, rpf;
23.
24. in_dev = in_dev_get(dev); 25. no_addr = ( in_dev->ifa_list == NULL ); 26. rpf = IN_DEV_RPFILTER(in_dev);
27. in_dev_put(in_dev);
28. printk(\no_addr=%d,rpf=%
d) \\n\>name, no_addr, rpf);
29. jprobe_return(); 30. return(0);
31. }; 32.
33. static int j_fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif, 34. struct net_device *dev, __be32 *spec_dst, u32 *itag, u32 mark)
35. 36. {
37. printk(\dst=0x%x, oif=%d \\n\
38. jprobe_return(); 39. return(0);
40. }; 41.
42. static struct jprobe my_jp1 = { 43. .entry = j_arp_process, 44. .kp.symbol_name = \
45. }; 46.
47. static struct jprobe my_jp2 = {
48. .entry = j_fib_validate_source, 49. .kp.symbol_name = \
50. }; 51.
52. static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
53. {
54. printk(\>rp->kp.symbol_name);
55. return(0);
56. }; 57.
58. static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
59. { 60. int eax;
61.
62. eax = regs->ax & 0xffff ;
63. printk(\>rp->kp.sy
mbol_name, regs->ax, eax);
64. 65. return(0);
66. }; 67.
68. static int fib_lookup_entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
69. {
70. struct fib_result *resp;
71.
72. resp = (struct fib_result *) regs->dx;
73. printk(\>rp->kp.symbol_name);
74. *((struct fib_result **)ri->data) = resp;
75. 76. return(0);
77. }; 78.
79. static int fib_lookup_return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
80. {
81. struct fib_result *resp;
82. int eax;
83.
84. eax = regs->ax & 0xffff ;
85. resp = *((struct fib_result **) ri->data);
86. printk(\>t
ype: %d\\n\>ax, eax, resp->type);
87.
88. return(0);
89. } 90.
91. static struct kretprobe my_rp1 = {
92. .handler = return_handler, 93. .entry_handler = entry_handler, 94. .kp.symbol_name = \
95. }; 96.
97. static struct kretprobe my_rp2 = {
98. .handler = return_handler, 99. .entry_handler = entry_handler, 100. .kp.symbol_name = \
101. }; 102.
103. static struct kretprobe my_rp3 = { 104. .handler = fib_lookup_return_handler, 105. .entry_handler = fib_lookup_entry_handler,
106. .kp.symbol_name = \, 107. .data_size = sizeof(struct fib_result *)
108. }; 109.
110. static int __init init_myprobe(void)
111. { 112. int ret;
113.
114. printk(\
115. if ( (ret = register_jprobe(&my_jp1)) < 0) {
116. printk(\
117. return(-1);
118. } 119.
120. if ( (ret = register_jprobe(&my_jp2)) < 0) {
121. printk(\
122. return(-1);
123. } 124.
125. if ( (ret = register_kretprobe(&my_rp1)) < 0 ) {
126. printk(\
127. unregister_jprobe(&my_jp1); 128. unregister_jprobe(&my_jp2);
129. return(-1);
130. }
131.
132. if ( (ret = register_kretprobe(&my_rp2)) < 0 ) {
133. printk(\
134. unregister_jprobe(&my_jp1); 135. unregister_jprobe(&my_jp2); 136. unregister_kretprobe(&my_rp1);
137. return(-1);
138. } 139.
140. if ( (ret = register_kretprobe(&my_rp3)) < 0 ) {
141. printk(\
142. unregister_jprobe(&my_jp1); 143. unregister_jprobe(&my_jp2); 144. unregister_kretprobe(&my_rp1); 145. unregister_kretprobe(&my_rp2);
146. return(-1);
147. } 148. 149. return 0;
150. } 151. 152.
153. static void __exit rel_myprobe(void)
154. {
155. unregister_jprobe(&my_jp1); 156. unregister_jprobe(&my_jp2); 157. unregister_kretprobe(&my_rp1); 158. unregister_kretprobe(&my_rp2); 159. unregister_kretprobe(&my_rp3);
160. } 161.
162. module_init(init_myprobe); 163. module_exit(rel_myprobe);
164.
165. Makefile obj-m += arp_probe.o
166. Making #> make -C /usr/src/kernels/2.6.32-71.el6.x86_64/ M=`pwd` modules
Linux故障定位技术详解与实例的内容介绍完了,希望通过本文红帽Linux故障定位技术的学习能对你有所帮助!