2020-06-12 tcprivのユーザランド設計整理

  • 今日は頭痛気味であまり集中できずぼんやりしていることが多かった
  • 今週はかなり集中してコードよんだり関連ドキュメントを読み漁ったので集中力を使い切ったかな

  • 来週から取り組むtcprivのユーザランド設計についてまとめておく
  • tcprviがenableになっているパケットがきたら、それをtcprivモジュールで定義する構造体に関連情報(src-port, ipadressなど)に保存
  • それをセッション単位でのプロセスに渡される単位でstruct sockのユーザデータにそれぞれポインタを保存
    • これでTCP接続単位で情報をカーネルでskおよびskbとして保持できる
  • tcprivモジュールロード時に/proc/netコンテキストを利用して/proc/net/tcprivファイルをproc_createしておく
  • その上でnetのpernet_operationsフックを利用して、skおよびskbをprivate dataとして引き出せるようにproc_create_net_dataを利用してseq_operationsをコールバックする
  • さらにseq_operationsではseq_fileのフレームワークを利用してshow時のコールバックでtcp_seq_showを使ってskの情報を受け取りつつそれを加工したデータをuser側のprocI/Fへコピーする
  • その際にtcpriv経由で保存している構造体の内容も表示することでTCPのセッション単位でのクライアントのオーナ情報等も表示する
  • これら/proc/net/tcprivをopenするたびに実行するようにすれば良い
    • いやしかしこのあたりカーネルのバージョン次第、特に4系か5系かでnet周りのAPIが随分と変わっているので読み分けが大変だった
    • 4.18系以上はfile_operatioonsじゃなくてseq_operationsを使えば便利とか

  • 今日はスター・ウォーズの最終エピソードのUHDが届くはずなので楽しみ

  • しかし今日も眠い~~~