LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Kernel (https://www.linuxquestions.org/questions/linux-kernel-70/)
-   -   netlink question in kernel space. (https://www.linuxquestions.org/questions/linux-kernel-70/netlink-question-in-kernel-space-4175511251/)

poplinux 07-16-2014 03:35 AM

netlink question in kernel space.
 
3 Attachment(s)
Dear Sir.

Now, I'm try to study netlink subsystem in linux kernel.(Ver 2.6.32.27)

And, I'm found very useful size, See below.

http://www.linuxfoundation.org/colla..._netlink_howto

So. I'm create two kernel module.

new_netlink_family.ko : add new netlink family to kernel.
example_on_kernel.ko : Send netlink msg to new netlink family.

When insmod example_on_kernel.ko, I'm want to see "doc_exmpl_echo() : called"

But, I'm can't see this message.

Please help me.


file name : new_netlink_family.c
Code:

  1 #include <linux/kernel.h>
  2 #include <linux/init.h>
  3 #include <net/genetlink.h>
  4 #include "new_netlink_family.h"
  5
  6
  7 /* handler */
  8 static int doc_exmpl_echo(struct sk_buff *skb,
  9                          struct genl_info *info)
 10 {
 11  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
 12  return 0;
 13 };
 14
 15 /* Operation definition */
 16 static struct genl_ops doc_exmpl_gnl_ops_echo = {
 17  .cmd = DOC_EXMPL_C_ECHO,
 18  .flags = 0,
 19  .policy = doc_exmpl_genl_policy,
 20  .doit = doc_exmpl_echo,
 21  .dumpit = NULL,
 22 };
 23
 24
 25 static int new_netlink_family_init(void)
 26 {
 27  int ret;
 28
 29  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
 30
 31  ret = genl_register_family(&doc_exmpl_gnl_family);
 32  if (ret != 0){
 33    printk(KERN_ALERT "%s() : genl_register_family() fail\n", __FUNCTION__);
 34    goto FAILURE;
 35  }
 36
 37  ret = genl_register_ops(&doc_exmpl_gnl_family, &doc_exmpl_gnl_ops_echo);
 38  if (ret != 0){
 39    printk(KERN_ALERT "%s() : genl_register_ops() fail\n", __FUNCTION__);
 40
 41    ret = genl_unregister_family(&doc_exmpl_gnl_family);
 42    goto FAILURE;
 43  }
 44
 45  return 0;
 46
 47 FAILURE:
 48  return -ENOMEM;
 49 }
 50
 51 void example_netlink_exit(void)
 52 {
 53  int ret;
 54
 55  ret = genl_unregister_ops(&doc_exmpl_gnl_family, &doc_exmpl_gnl_ops_echo);
 56  ret = genl_unregister_family(&doc_exmpl_gnl_family);
 57 }
58
 59
 60
 61 module_init(new_netlink_family_init);
 62 module_exit(example_netlink_exit);
 63 MODULE_LICENSE("Dual BSD/GPL");


file name : new_netlink_family.h
Code:

  1 #ifndef __NEW_NETLINK_FAMILY_H__
  2 #define __NEW_NETLINK_FAMILY_H__
  3
  4 /* attributes */
  5 enum {                   
  6  DOC_EXMPL_A_UNSPEC,
  7  DOC_EXMPL_A_MSG,
  8  __DOC_EXMPL_A_MAX,
  9 };
 10
 11 #define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX-1)
 12
 13 /* attribute policy */
 14 static struct nla_policy doc_exmpl_genl_policy[DOC_EXMPL_A_MAX+1] = {
 15  [DOC_EXMPL_A_MSG] = {.type = NLA_NUL_STRING},
 16 };
 17 
 18
 19 /* family defination */
 20 static struct genl_family doc_exmpl_gnl_family = {
 21  .id = GENL_ID_GENERATE,
 22  .hdrsize = 0,
 23  .name = "DOC_EXMPL",
 24  .version = 1,
 25  .maxattr = DOC_EXMPL_A_MAX,
 26 };
 27 
 28 
 29 /* commands */
 30 enum {
 31  DOC_EXMPL_C_UNSPEC,
 32  DOC_EXMPL_C_ECHO,
 33  __DOC_EXMPL_C_MAX,
 34 };
 35   
 36 #define DOC_EXMPL_C_MAX (__DOC_EXMPL_C_MAX -1)
 37   
 38 #endif /* __NEW_NETLINK_FAMILY_H__ */


file name : example_on_kernel.c
Code:

1 #include <net/netlink.h>
  2 #include <net/genetlink.h>
  3
  4 #include "new_netlink_family.h"
  5
  6 #if 0
  7 /* family defination */
  8 static struct genl_family doc_exmpl_gnl_family = {
  9  .id = GENL_ID_GENERATE,
 10  .hdrsize = 0,
 11  .name = "DOC_EXMPL",
 12  .version = 1,
 13  .maxattr = DOC_EXMPL_A_MAX,
 14 };
 15 #endif
 16
 17 static int __msg_test(const char *msg)
 18 {
 19  int rc;
 20  void *msg_head = NULL;
 21  struct sk_buff *skb = NULL;
 22
 23  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
 24
 25  skb = genlmsg_new(NLMSG_GOODSIZE, GFP_KERNEL);
 26  if (skb == NULL){
 27    printk(KERN_ALERT "%s() : genlmsg_new() fail\n", __FUNCTION__);
 28    rc = -ENOMEM;
 29    goto FAILURE;
 30  }
 31
 32  /* Create the message headers */
 33  msg_head = genlmsg_put(skb, 0, 0, &doc_exmpl_gnl_family, 0, DOC_EXMPL_C_ECHO);
 34  if (msg_head == NULL){
 35    printk(KERN_ALERT "%s() : genlmsg_put() fail\n", __FUNCTION__);
 36    rc = -ENOMEM;
 37    goto FAILURE;
 38  }
 39
 40  /* add a DOC_EXMPL_A_MSG attribute */
 41  rc = nla_put_string(skb, DOC_EXMPL_A_MSG, msg);
 42  if (rc != 0){
 43    printk(KERN_ALERT "%s() : nla_put_string() fail\n", __FUNCTION__);
 44    rc = -ENOMEM;
 45    goto FAILURE;
 46  }
 47
 48  /* finalize the message */
 49  rc = genlmsg_end(skb, msg_head);
 50  if (rc < 0){
 51    printk(KERN_ALERT "%s() : genlmsg_end() fail\n", __FUNCTION__);
 52    rc = -ENOMEM;
 53    goto FAILURE;
 54  }
 55
 56  rc = genlmsg_unicast(&init_net, skb, 0);
 57  if (rc != 0){
 58    printk(KERN_ALERT "%s() : genlmsg_unicast() fail\n", __FUNCTION__);
 59    rc = -ENOMEM;
 60    goto FAILURE;
 61  }
 62
 63  return 0;
 64
 65 FAILURE:
 66  /* skb free api 필요함 */
 67  nlmsg_free(skb);
 68  return rc;
 69 };
 70
 71 int example_on_kernel_init(void)
 72 {
 73  int ret = 0;
 74
 75  printk(KERN_ALERT "%s() : called\n", __FUNCTION__);
 76
 77  ret = __msg_test("BABO");
 78  if (ret < 0){
 79    printk(KERN_ALERT "%s() : __msg_test is fail [ %d ]\n", __FUNCTION__, ret);
 80    return -ENOMEM;
 81  }
 82
 83  return 0;
 84 }
 85
 86 void example_on_kernel_exit(void)
 87 {
 88 }
 89
 90 module_init(example_on_kernel_init);
 91 module_exit(example_on_kernel_exit);
 92
 93 MODULE_LICENSE("Dual BSD/GPL");


Mara 07-20-2014 02:21 PM

Moved: This thread is more suitable in Linux-Kernel and has been moved accordingly to help your thread/question get the exposure it deserves.


All times are GMT -5. The time now is 06:11 AM.