add ltt-modules into svn
authorcompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 6 Apr 2006 23:10:53 +0000 (23:10 +0000)
committercompudj <compudj@04897980-b3bd-0310-b5e0-8ef037075253>
Thu, 6 Apr 2006 23:10:53 +0000 (23:10 +0000)
git-svn-id: http://ltt.polymtl.ca/svn@1757 04897980-b3bd-0310-b5e0-8ef037075253

ltt-modules/ltt-control.c [new file with mode: 0644]
ltt-modules/ltt-control.h [new file with mode: 0644]

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");
+
diff --git a/ltt-modules/ltt-control.h b/ltt-modules/ltt-control.h
new file mode 100644 (file)
index 0000000..430d5d1
--- /dev/null
@@ -0,0 +1,26 @@
+#ifndef _LTT_CONTROL_H
+#define _LTT_CONTROL_H
+
+
+//enum trace_mode {
+//     TRACE_NORMAL,
+//     TRACE_FLIGHT
+//};
+
+enum trace_op {
+  OP_CREATE,
+  OP_DESTROY,
+  OP_START,
+  OP_STOP,
+       OP_ALIGN,
+  OP_NONE
+};
+
+typedef struct lttctl_peer_msg {
+       char trace_name[NAME_MAX];
+       enum trace_op op;
+       union ltt_control_args args;
+} lttctl_peer_msg_t;
+
+#endif //_LTT_CONTROL_H
+
This page took 0.025408 seconds and 4 git commands to generate.