Time Sensitive Networkとか

フィールドネットワークというかIoTの世界では、ここ数年Time Sensitive Network (TSN)が盛り上がっている。TSNの狙いは、端的に言うと、ITとOTのネットワークを融合することで、技術的にはEthernetベースで時間同期を保証できるネットワークを実現しようというものである。この辺でERTと交わりそうな話があるんだなという話を書きたいと思う。

commit 80b14dee2bea128928537d61c333f24cb8cbb62f
Author: Richard Cochran <rcochran@linutronix.de>
Date:   Tue Jul 3 15:42:48 2018 -0700

   net: Add a new socket option for a future transmit time.
(...)
clock_gettime(CLOCK_REALTIME, &ts);
__u64 txtime = ts.tv_sec * 1000000000ULL + ts.tv_nsec;
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_TXTIME;
cmsg->cmsg_len = CMSG_LEN(sizeof(__u64));
*((__u64 *) CMSG_DATA(cmsg)) = txtime;
cmsg = CMSG_NXTHDR(&msg, cmsg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_DROP_IF_LATE;
cmsg->cmsg_len = CMSG_LEN(sizeof(uint8_t));
*((uint8_t *) CMSG_DATA(cmsg)) = 1;

(...)

const int on = 1;
setsockopt(fd, SOL_SOCKET, SO_TXTIME, &on, sizeof(on))

バージョン4.19にて、SO_TXTIMEというソケットオプションが追加された。上のサンプルコードを見てもらうのが早いが、ユーザアプリが指定した時刻にパケットを送信する仕組みである。これを使えばユーザレベルでペーシングを実装できるが、効率的ではない。

commit 25db26a91364db00f5a30da2fea8e9afe14a163c
Author: Vinicius Costa Gomes <vinicius.gomes@intel.com>
Date:   Tue Jul 3 15:42:53 2018 -0700

   net/sched: Introduce the ETF Qdisc

Earliest TxTime Firstパケットスケジューラも実装されている。なお、カーネルにマージされる前はTime-Based Scheduling (TBS)と呼ばれていたようだ。このへんの概要を知りたければ、「The Road Towards a
Linux TSN Infrastructure
」が良い。

commit 3048cf84d152344f874e993558770bba73a65c8f
Author: Jesus Sanchez-Palencia <jesus.sanchez-palencia@intel.com>
Date:   Tue Jul 3 15:42:59 2018 -0700

   igb: Add support for ETF offload

ただし、このようなソフトウェア実装はおまけで、本命はハードウェア実装、つまりNICに実装されていくべきなのだと思う。実際、Intel igbドライバはそのような機能があるようだ。これはTSNを想定した機能なのだと思う。

蛇足になるが、igbにはフレーム間ギャップ(IFG)を調整できるレジスタが備わっていた。通常IFGは8バイトであるが、これを増やすことでペーシングを実装できる。最大IFGはそれほど大きくないので、絞れる帯域に制限はあるが、昔評価したことを思い出した。

この記事が気に入ったらサポートをしてみませんか?