有些網卡會加入checksum offload的機制
所謂的checksum offlaod 就是讓硬體自己算完checksum後再加入packet中
像是IP header 的checksum, TCP/UDP的checksum 就看網卡硬體本身有實作哪些checksum的機制
在linux中 也有加入這些功能喔
再寫網卡driver的時候 linux net_device 的資料結構中 有features這個欄位
就是要讓你告訴linux 你的網卡有哪些功能
如果你的linux有checksum offload的功能 就必須把NETIF_F_IP_CSUM 這個flag給設起來
如此一來在linux網路架構中 checksum的這個欄位就會空下來給硬體去算囉
在tx的function裡 應當就會有判斷這筆packet的checksum有沒有計算的判斷式
像是這樣...
if (skb->ip_summed == CHECKSUM_PARTIAL)
另外 也可以加上 ethtool 的功能
類似這樣
static const struct ethtool_ops ethtool_ops_funcs = {
.set_tx_csum = ethtool_op_set_tx_csum,
};
其實你可以發現 ethtool_op_set_tx_csum裡做的事
也只是去設定NETIF_F_IP_CSUM 而已

請先 登入 以發表留言。