IPMI和BMC 通訊的過程

2021-08-02 03:21:13 字數 2250 閱讀 5424

ipmi和bmc通訊可以從try_get_dev_id中看出

static int try_get_dev_id(struct smi_info *smi_info)

smi_info->handlers有三種實現,這裡以bt為例,bt是block transfer的意思

const struct si_sm_handlers bt_smi_handlers = ;

先看bt_start_transaction

static int bt_start_transaction(struct si_sm_data *bt,

unsigned char *data,

unsigned int size)

bt->write_data[0] = size + 1;    /* all data plus seq byte */

bt->write_data[1] = *data;    /* netfn/lun */

bt->write_data[2] = bt->seq++;

memcpy(bt->write_data + 3, data + 1, size - 1);

bt->write_count = size + 2;

bt->error_retries = 0;

bt->nonzero_status = 0;

bt->truncated = 0;

bt->state = bt_state_xaction_start;

bt->timeout = bt->bt_cap_req2rsp;

force_result(bt, ipmi_err_unspecified);

return 0;

}基本就是對si_sm_data *bt 賦值的過程。

static int wait_for_msg_done(struct smi_info *smi_info)

else if (smi_result == si_sm_call_without_delay) else

break;

}if (smi_result == si_sm_hosed)

/** we couldn't get the state machine to run, so whatever's at

* the port is probably not an ipmi smi inte***ce.

*/return -enodev;

return 0;

}原來wait_for_msg_done 中是通過event 來啟動傳送和接受bmc發回的結果啊,在bt_event中主要是處理各種命令。注意在bt_start_transaction中傳送的是bt_state_xaction_start命令

static enum si_sm_result bt_event(struct si_sm_data *bt, long time)

最終在bt_event中是通過bt_control來傳送命令

#define bt_control(x)    bt->io->outputb(bt->io, 0, x)

這裡的io是在port_setup中賦值

static int port_setup(struct smi_info *info)

}這裡以port_outb為例

static void port_outb(const struct si_sm_io *io, unsigned int offset,

unsigned char b)

static inline void outb(u8 value, unsigned long addr)

原來就是直接寫暫存器

最後通過bt_get_result 得到bmc返回的數值,可以看到主要是從si_sm_data *bt中的read_data的到其返回的值.

static int bt_get_result(struct si_sm_data *bt,

unsigned char *data,

unsigned int length)

data[0] = bt->read_data[1];

data[1] = bt->read_data[3];

if (length < msg_len || bt->truncated) else

memcpy(data + 2, bt->read_data + 4, msg_len - 2);

if (bt_debug & bt_debug_msg)

return msg_len;

}

HTTPS的基礎原理和通訊過程

二 https 當中的 s 代表的是 安全 secure 在登入銀行或電郵賬號時,你會常常看到它出現在瀏覽器位址列。不過,移動應用在網路連線安全性上面沒有那麼透明,使用者很難知道應用連線網路時使用的是 http 還是 https。ats 由此登場,它在 ios 9 當中是預設開啟的。然而,開發者仍然...

DDNS的通訊過程

ddns client和server之間的乙個互動過程是什麼樣的呢 是不是所有的server都遵循乙個協議還是有不同的實現?ddns3執行的時候需要輸入乙個handle,這個handle是什麼內容 是我們申請到的網域名稱嗎?主要是不明白傳送的命令和返回的結果 後來發現網上有這些內容,無非就是傳送ht...

socket 的通訊過程

1.建立套接字 linux在利用socket 系統呼叫建立新的套接字時,需要傳遞套接字的位址族識別符號 套接字型別以及協議,其函式定義於net socket.c中 asmlinkage long sys socket int family,int type,int protocol 實際上,套接字對...