[REFACTOR] redesing swap_message_parser_module.c
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Thu, 4 Jul 2013 08:05:10 +0000 (12:05 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Thu, 4 Jul 2013 08:05:10 +0000 (12:05 +0400)
and rename:
swap_message_parser_module.c --> swap_msg_parser.c

parser/swap_message_parser_module.c [deleted file]
parser/swap_msg_parser.c [new file with mode: 0644]

diff --git a/parser/swap_message_parser_module.c b/parser/swap_message_parser_module.c
deleted file mode 100644 (file)
index 4db839f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <linux/module.h>
-
-#include "parser_defs.h"
-#include "message_handler.h"
-#include "swap_message_parser_errors.h"
-
-#include <driver_new/swap_driver_module.h>
-#include <driver_new/ioctl_commands.h>
-
-
-int swap_message_parser_handler(unsigned int cmd, void __user *msg)
-{
-    int result;
-
-    switch(cmd) {
-        case SWAP_DRIVER_MSG_START:
-        {
-            result = message_start(msg);
-            break;
-        }
-        case SWAP_DRIVER_MSG_STOP:
-        {
-            result = message_stop();
-            break;
-        }
-        case SWAP_DRIVER_MSG_CONFIG:
-        {
-            result = message_config(msg);
-            break;
-        }
-        case SWAP_DRIVER_MSG_SWAP_INST_ADD:
-        {
-            result = message_swap_inst_add(msg);
-            break;
-        }
-        case SWAP_DRIVER_MSG_SWAP_INST_REMOVE:
-        {
-            result = message_swap_inst_remove(msg);
-            break;
-        }
-        default:
-        {
-            result = -E_SMP_UNKNOWN_MESSAGE;
-            break;
-        }
-    }
-
-    return result;
-}
-
-static int register_swap_message_parser(void)
-{
-    int result;
-
-    result = register_swap_message_parser_handler(swap_message_parser_handler);
-
-    return result;
-}
-
-
-static int __init swap_message_parser_init(void)
-{
-    int result;
-
-    result = register_swap_message_parser();
-    if (result != 0) {
-        print_err("SWAP Message Parser handler was not registered! Message parser won't work!\n");
-        return result;
-    }
-
-    print_msg("Module init\n");
-
-    return result;
-}
-
-static void __exit swap_message_parser_exit(void)
-{
-    print_msg("Module exit\n");
-}
-
-module_init(swap_message_parser_init);
-module_exit(swap_message_parser_exit);
-
-MODULE_LICENSE("GPL");
diff --git a/parser/swap_msg_parser.c b/parser/swap_msg_parser.c
new file mode 100644 (file)
index 0000000..53a730d
--- /dev/null
@@ -0,0 +1,107 @@
+#include <linux/module.h>
+#include <linux/vmalloc.h>
+#include <asm/uaccess.h>
+
+#include "parser_defs.h"
+#include "msg_buf.h"
+#include "msg_cmd.h"
+
+#include <driver_new/device_driver.h>
+#include <driver_new/swap_ioctl.h>
+
+enum MSG_ID {
+       MSG_KEEP_ALIVE          = 0x0001,
+       MSG_START               = 0x0002,
+       MSG_STOP                = 0x0003,
+       MSG_CONFIG              = 0x0004,
+       MSG_SWAP_INST_ADD       = 0x0008,
+       MSG_SWAP_INST_REMOVE    = 0x0009
+};
+
+struct basic_msg_fmt {
+       u32 msg_id;
+       u32 len;
+} __attribute__((packed));
+
+static int msg_handler(void __user *msg)
+{
+       int ret;
+       u32 size;
+       enum MSG_ID msg_id;
+       struct msg_buf mb;
+       void __user *payload;
+       struct basic_msg_fmt bmf;
+
+       ret = copy_from_user(&bmf, (void*)msg, sizeof(bmf));
+       if (ret)
+               return ret;
+
+       size = bmf.len;
+       ret = init_mb(&mb, size);
+       if (ret)
+               return ret;
+
+       payload = msg + sizeof(bmf);
+       if (size) {
+               ret = copy_from_user(mb.begin, (void*)payload, size);
+               if (ret)
+                       goto uninit;
+       }
+
+       msg_id = bmf.msg_id;
+       switch (msg_id) {
+       case MSG_KEEP_ALIVE:
+               ret = msg_keep_alive(&mb);
+               break;
+       case MSG_START:
+               ret = msg_start(&mb);
+               break;
+       case MSG_STOP:
+               ret = msg_stop(&mb);
+               break;
+       case MSG_CONFIG:
+               ret = msg_config(&mb);
+               break;
+       case MSG_SWAP_INST_ADD:
+               ret = msg_swap_inst_add(&mb);
+               break;
+       case MSG_SWAP_INST_REMOVE:
+               ret = msg_swap_inst_remove(&mb);
+               break;
+       default:
+               print_err("incorrect message ID [%u]\n", msg_id);
+               ret = -EINVAL;
+               break;
+       }
+
+uninit:
+       uninit_mb(&mb);
+       return ret;
+}
+
+static void register_msg_handler(void)
+{
+       set_msg_handler(msg_handler);
+}
+
+static void unregister_msg_handler(void)
+{
+       set_msg_handler(NULL);
+}
+
+static int __init swap_parser_init(void)
+{
+       register_msg_handler();
+
+       return 0;
+}
+
+static void __exit swap_parser_exit(void)
+{
+       unregister_msg_handler();
+}
+
+module_init(swap_parser_init);
+module_exit(swap_parser_exit);
+
+MODULE_LICENSE("GPL");