chapter 08-03

使用方式 (核心端)

此章節說明如何在核心端程式使用資料檔案的錯誤檢查.


可用的函式

mcm_lklib_check_store_file
檢查資料檔案是否有錯誤.
參數 說明
struct mcm_lklib_lib_t *
this_lklib
紀錄 mcm_lklib_api 所需要的資料
char *
file_path
要檢查的資料檔案的路徑
絕對路徑或是相對於 mcm_daemon 所在位置的相對路徑
MCM_DTYPE_LIST_TD *
store_result_buf
紀錄資料檔案的檢查結果的緩衝
>= MCM_RCODE_PASS : 資料檔案正常
 < MCM_RCODE_PASS : 資料檔案損毀
char *
store_version_buf
紀錄資料檔案內的版本資訊的值的緩衝 [詳細]
MCM_DTYPE_USIZE_TD
store_version_size
紀錄資料檔案內的版本資訊的值的緩衝的大小
回傳 說明
>= MCM_RCODE_PASS 成功
 < MCM_RCODE_PASS 錯誤

注意事項 :
01.  資料存取模式可以是 MCM_SPERMISSION_RO 或 MCM_SPERMISSION_RW.

範例 :
資料值檔案, 放在 mcm_daemon 所在的目錄, 檔名為 mcm_store_upload.txt

$version 1.1
device descript:Wireless%20Device serial_number:0022E5A1CC9F00000000
device.system date:2015/06/07 ip_addr:192.168.10.254 uptime:0 loading:45.678000
device.vap.#8 ssid:open-1 channel:10
device.vap.#8.extra hidden:1 tx_power:9
device.vap.#8.station.#20 mac_addr:00:11:22:33:44:55 rule:3
device.vap.#15 ssid:radius-2 channel:44
device.vap.#15.extra hidden:0 tx_power:10
device.vap.#15.station.#30 mac_addr:00:aa:bb:cc:dd:ee rule:5
device.vap.#15.station.#33 mac_addr:00:aa:bb:cc:dd:ff rule:6
device.vap.#23 ssid:wap2-3 channel:0
device.vap.#23.extra hidden:0 tx_power:3
device.limit.#3 name:normal priority:10
device.limit.#5 name:height priority:15
device.limit.#6 name:low priority:5

外部程式

#include <linux/init.h>
#include <linux/slab.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include "mcm_lib/mcm_lheader/mcm_type.h"
#include "mcm_lib/mcm_lheader/mcm_size.h"
#include "mcm_lib/mcm_lheader/mcm_connect.h"
#include "mcm_lib/mcm_lheader/mcm_return.h"
#include "mcm_lib/mcm_lheader/mcm_data_exinfo_auto.h"
#include "mcm_lib/mcm_lklib/mcm_lklib_api.h"

#define DMSG(msg_fmt, msgs...) \
    printk(KERN_INFO "%s(%04u): " msg_fmt "\n", \
           strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__, __LINE__, ##msgs)

static int __init main_init(
    void)
{
    char *path1, store_version[MCM_BASE_VERSION_BUFFER_SIZE];
    struct mcm_lklib_lib_t self_lklib;
    MCM_DTYPE_LIST_TD store_result;

    self_lklib.socket_path = "@mintcm";
    self_lklib.call_from = MCM_CFROM_KERNEL;
    self_lklib.session_permission = MCM_SPERMISSION_RO;
    self_lklib.session_stack_size = 0;
    if(mcm_lklib_init(&self_lklib) < MCM_RCODE_PASS)
    {
        DMSG("call mcm_lklib_init() fail");
        goto FREE_01;
    }

    path1 = "mcm_store_upload.txt";
    if(mcm_lklib_check_store_file(&self_lklib, path1, &store_result,
                                  store_version, sizeof(store_version)) < MCM_RCODE_PASS)
    {
        DMSG("call mcm_lklib_check_store_file(%s) fail", path1);
        goto FREE_02;
    }
    DMSG("[%s][%s][%s]", path1, store_version, store_result < MCM_RCODE_PASS ? "fail" : "pass");

FREE_02:
    mcm_lklib_exit(&self_lklib);
FREE_01:
    return 0;
}

static void __exit main_exit(
    void)
{
    return;
}

module_init(main_init);
module_exit(main_exit);

MODULE_LICENSE("GPL");


封裝的函式

mcm_lklib_do_...
此類函式是 mcm_lklib_init, mcm_lklib_..., mcm_lklib_exit 的封裝, 如果只需要處理一件事情可使用此類函式.

mcm_lklib_do_check_store_file
等同 mcm_lklib_check_store_file


範例程式的使用

01.  範例程式目錄在 mint_cm/usage/example/0803.


02.  下面關於 make 的操作沒有特別註明的話都是在 mint_cm 目錄.


03.  第一次使用, 使用 make example_add KEY=0803 載入範例並編譯.


04.  kernel_app/kernel_app_0803 是範例程式,
必須先在目錄內使用 make all 進行編譯.

使用方式 :
echo <test_item> > /proc/kernel_app_0803
<test_item> 列表 :
check-store-file mcm_lklib_check_store_file() 範例


05.  先載入 mcm_lklib_api.ko, 接著執行 mcm_daemon, 再載入 kernel_app_0803 做測試.


06.  測試完畢不使用後, 使用 make example_del KEY=0803 將範例移除.


07.  範例程式目錄下的檔案在做完 make example_add 後會複製到真正使用的位置, 要修改做測試的話要改在複製後的.
來源 profile/mcm_data_profile_0803.xml
目地 mint_cm/mcm_build/mcm_data_profile.xml
資料模型範例
有修改要使用 make all 重新編譯
來源 profile/mcm_store_profile_default_0803.txt
目地 mint_cm/mcm_build/mcm_store_profile_default.txt
資料預設值範例
使用 make all 後會再複製到 mint_cm/run
來源 profile/mcm_store_upload_0803.txt
目地 mint_cm/run/mcm_store_upload.txt
要檢查的資料檔案範例