kamaboko123 / salacia-forwarder

Packet forwarder with Linux raw socket.
MIT License
2 stars 0 forks source link

NetIf::recv()にIFTYPEに応じて受信するパケットフィルタする機能を実装する #2

Open kamaboko123 opened 6 years ago

kamaboko123 commented 6 years ago

現在、NetIf::recv()はraw packetを受信し、引数で受けたEthernetオブジェクトにset()する。 そのため、実際にこのクラスを利用する場合、 不要なパケットをdropするようなフィルタすらも呼び出し元で実装する必要がある。

ここではIfType及びVLAN_IDにもとづいてフィルタすべきである。 現在、パケットパースを提供しているのはEthernet classである。 しかし、Ethernet classではまずパース対象のパケットをコピーする必要がある。(set()関数)

そのため、パースのために1500byte(正確にはフレームサイズ依存)のコピーが毎回発生することになる。 そもそもパケットのパーサ自体はEthernet classから切り離すべきかもしれない。 (現在パフォーマンスに対する不満はないので、一旦は簡単な実装でいくが、将来的な設計として要検討)

上記のパケットフィルタ対応以降、 もしraw packetを受信したい場合、それ専用のIfTypeを定義するか、recv_raw()を利用するべきである。 前者のようなIfTypeは現在使う予定がないため、まずはすでに実装のある後者を利用することとする。