add ltt-modules into svn
[ltt-control.git] / ltt-modules / ltt-control.c
diff --git a/ltt-modules/ltt-control.c b/ltt-modules/ltt-control.c
new file mode 100644 (file)
index 0000000..45b44f0
--- /dev/null
@@ -0,0 +1,115 @@
+/* ltt-control.c
+ *
+ * LTT control module over a netlink socket.
+ *
+ * Inspired from Relay Apps, by Tom Zanussi and iptables
+ *
+ * Copyright 2005 -
+ * Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/ltt-core.h>
+#include <linux/netlink.h>
+#include <linux/inet.h>
+#include <linux/ip.h>
+#include <linux/security.h>
+#include <linux/skbuff.h>
+#include <linux/types.h>
+#include <net/sock.h>
+#include "ltt-control.h"
+
+
+#define LTTCTLM_BASE   0x10
+#define LTTCTLM_CONTROL        (LTTCTLM_BASE + 1)      /* LTT control message */
+
+static struct sock *socket;
+
+void ltt_control_input(struct sock *sk, int len)
+{
+       struct sk_buff *skb;
+       struct nlmsghdr *nlh = NULL;
+       u8 *payload = NULL;
+       lttctl_peer_msg_t *msg;
+       int err;
+
+       printk(KERN_ALERT "ltt-control ltt_control_input\n");
+
+       while ((skb = skb_dequeue(&sk->sk_receive_queue)) 
+                                       != NULL) {
+    
+               nlh = (struct nlmsghdr *)skb->data;
+
+    if(security_netlink_recv(skb)) {
+                       netlink_ack(skb, nlh, EPERM);
+                       kfree_skb(skb);
+                       continue;
+    }
+    
+               /* process netlink message pointed by skb->data */
+               err = EINVAL;
+               payload = NLMSG_DATA(nlh);
+               /* process netlink message with header pointed by 
+                * nlh and payload pointed by payload
+                */
+               if(nlh->nlmsg_len != sizeof(lttctl_peer_msg_t) + sizeof(struct nlmsghdr)) {
+                       printk(KERN_ALERT "ltt-control bad message length\n");
+                       netlink_ack(skb, nlh, EINVAL);
+                       kfree_skb(skb);
+                       continue;
+               }
+               msg = (lttctl_peer_msg_t*)payload;
+
+               switch(msg->op) {
+                       case OP_CREATE:
+                               err = ltt_control(LTT_CONTROL_CREATE_TRACE, msg->trace_name,
+                                                                                                                       msg->args);
+                               break;
+                       case OP_DESTROY:
+                               err = ltt_control(LTT_CONTROL_DESTROY_TRACE, msg->trace_name,
+                                               msg->args);
+                               break;
+                       case OP_START:
+                               err = ltt_control(LTT_CONTROL_START, msg->trace_name,
+                                               msg->args);
+                               break;
+                       case OP_STOP:
+                               err = ltt_control(LTT_CONTROL_STOP, msg->trace_name,
+                                               msg->args);
+                               break;
+                       default:
+                               err = EBADRQC;
+                               printk(KERN_INFO "ltt-control invalid operation\n");
+               }
+               netlink_ack(skb, nlh, err);
+               kfree_skb(skb);
+       }
+}
+
+
+static int ltt_control_init(void)
+{
+       printk(KERN_ALERT "ltt-control init\n");
+
+       socket = netlink_kernel_create(NETLINK_LTT, 1,
+                       ltt_control_input, THIS_MODULE);
+       if(socket == NULL) return -EPERM;
+       else return 0;
+}
+
+static void ltt_control_exit(void)
+{
+       printk(KERN_ALERT "ltt-control exit\n");
+
+       sock_release(socket->sk_socket);
+}
+
+
+module_init(ltt_control_init)
+module_exit(ltt_control_exit)
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mathieu Desnoyers");
+MODULE_DESCRIPTION("Linux Trace Toolkit Controller");
+
This page took 0.023277 seconds and 4 git commands to generate.