ラベル network の投稿を表示しています。 すべての投稿を表示
ラベル network の投稿を表示しています。 すべての投稿を表示

2008年6月17日火曜日

PACKET_MMAP #2

ごめんなさいっ。libpcap のパッチおかしかった。修正しましたので、以前のものを持って行った方は、取り直して下さい、すいません。でパッチのあて方ですが、debian 前提で etch lenny 共に
apt-get source libpcap0.8
して、ソースディレクトリに cd した後
etch
これ持って行って
patch -p1 < libpcap0.8-etch.patch
./debian/rules binary
で上位ディレクトリに deb パッケージが出来ます。

lenny
持って行くモノがこれ - libpcap0.8-lenny.patch 以外は etch と同じです。
以前も書きましたが configure で root 権限が必要なシステムコール使っていますので、fakeroot では無効のままです、ご注意下さい。生? の debian/patches はそれぞれ etch用lenny用にあります。また修正があったらお知らせしますし、おかしなトコがありましたら教えてやって下さい。

一つ (だけじゃないけど) イマイチなのが PACKET_RX_RING 使っているか使っていないかがわからない点。見栄えが悪いですが stderr に use PACKET_MMAP, ... なんて出力があれば PACKET_RX_RING 使っています。/proc/net/packet あたりでわかれば嬉しいけど、理解していない。

あぁ、また一つ。繰り返しになりますが、デフォルト 8Mbyte mmap します。1514 フルであれば 4096 パケットです。多すぎ? 環境変数 PCAP_MMAP_MEMSIZE をバイト単位で調節して下さい。tcpdump であれば
PCAP_MMAP_MEMSIZE=262144 tcpdump -nevi eth0 'ip and port...
あるいは
export PCAP_MMAP_MEMSIZE=524288
tcpdump ...
などなど。また ingnore や lprobe については後日、近日。と自分に言いきかせて、今日も夜が更けてくてくてく....

2008年6月10日火曜日

PACKET_MMAP #1

広告? チラシ? の裏よりタチが悪い。自分でも忘れない内にコンパイルや使い方書かないと....と思いながら、モチベーションというか忙しかったりする。で、チラシの裏。lenny 用も etch に準じないと...。あっ、./debian/rules binary する前に autoconf が必要。

2008年6月8日日曜日

netflow の exporter その 5

その後ですが、PF_RING を使わずに。と NetBSD のパッケージ? にある古い nprobe 持ってきて大幅ダーティハック。稚拙ですが
Netflow exporter もどき lprobe として ここ
に置いときます。パッチなど送っていただければ幸せです。

IPv4 だけだし、flow とは名ばかりで TCP のフラグ見ていないし、IP のフラグメンテーションも処理していません。ただノーマル? の libpcap 使った nprobe や fprobe よりはパケット落ちがありません。で、OpenMicroServer にて最高 25kpkt/s 程の中、何とかパケット落ちなく頑張って稼働している様です。

flow-tools の flow-capture で集めた後、flowscan-cuflow で RRD グラフを作ってみたのですが /24 とかのネットワークが混在しまくっていて、マスクの集合で in と out を追いきれず....utils の下にインターフェースで in out を区別する、ほんのちょっとだけ修正した CUFlow.pm がありますので、こちらも良ろしかったら。

drop, only drop ingress qdisc

例の PF_RING であったり、web を彷徨っていると NET_RX_CONSUMED なるパッチがあったり、キャプチャしている「だけ」のインターフェースでは PF_PACKET socket に届けた後は何もしなくて良いよ。vanilla カーネルに直接手を入れるのを避けるためには...とツラツラソース眺めたところ ingress qdisc の判断が良さげ。

で、tc で何とかならないか。と
tc qdisc add dev eth1 ingress handle ffff:
tc filter del dev eth1 parent ffff: protocol ip priority 10 u32 match u8 0 0 police mtu 1 drop flowid :1
試してみたところ、かえって遅くなってしまった。恐らく毎度の勉強不足。フィルタではなく、ただただ落とす方法を探せず....とは言え何とかならないか? とダーティハック
無視するだけの - いんぐのあ (ingnore)
ネーミングセンス無さすぎ? tc コマンドのソース持って来て ingress 該当部分を ingnore とすれば使えるけど面倒そうなので、ユーザスペースのコマンドは後日予定。

こちらも毎度正確な測定はしていないけど、こちらの linpcap.c にて表示せず、送信側は pktgen で試してみたところ、数パーセントだけど確実に取得量は増えている模様。

2008年5月6日火曜日

PF_RING のパッチ

2004年 3月と結構以前の話だけど、こんなやりとりがあったらしい。jamal さんとしては PACKET_MMAP (と NAPI) で充分。でないならばプロファイル基に相談しましょ。といったところ。確かに大枠の仕組としてはソケットのバッファを mmap するという点で同じ。何が違うのか...

例のごとく読んでいないが、net/core/dev.cnetif_receive_skb() の初っ端で、ハンドラ呼び出して...む〜ん、わからん...で return(NET_RX_SUCCESS); してる。fragmentation 処理入れたり、forwarding の場合はもう一度 queue に入れたり? わからんのに、こんなことゆーと叱られそうだが、何よりソースが見難い...ごめんなさい。

という何となくの経過を経て、やっぱ使うの止めた。vanilla にある CONFIG_PACKET_MMAP で戦ってみようと思う今日この頃。こっちも聞きかじっただけだが、キャプチャではなくパケット転送するのであれば NF_CT_ACCT - この PDF辺りから始まったお話? とかどうかしら?

2008年4月24日木曜日

netflow の exporter その 4

その 5 はその後で...測定せず多々感覚的だけど、いったん自分の中ではオチをつけよう。

きっかけは....良くある話かわからないけどアカウンティングを取ることができないルータ、スイッチでアカウントを取りたかったと。でインターフェースのミラーをして、キャプチャするんだけど送信、受信で 2つのインターフェースの面倒を見なくちゃイカンと。100Mbit 全二重に流れるパケットをロス少なく (古い) nprobe とぷらっとホームさんの OpenMicroServer で取ろう。ってトコ。

新しい nprobe も購入してみたが netflow の v9 や VLAN MPLS などが不要であれば古いものでも、まぁ。加えて正確なフローというより、どこと、どこの、どのポート使った通信が多いか。程度がわかれば十分だし。

MMAPed な libpcap (って言うのかな?) と PF_RING な libpcap では、PF_RING の方が少し良さげ。ただしデバイスに NULL あるいは any を指定することができず、カーネルパッチも必要。また pcap_hoge を pfring_hoge で実装しているのだけど、何となく pcap_loop に重きを置いて、他が足りない感アリ。

PF_RING で二つのインターフェースを一つの (nprobe) プロセスで面倒見ようとこんなパッチ眺めながら epollで実装してみたが、一つのインターフェースで二つプロセス稼働させた方が全く良い。PF_RING のカーネルパッチ眺めると epoll ではなく poll の方が良い? 試しておらず。

むーん。と悩んだ結果....ifenslave で二つのインターフェースをバンディングして、これをデバイスと指定することで良しとした。ring.ko をロードする時に受信のみとするのと ethtool の -G で デバイスの rx ring を大きめに設定してみる。

で結果は 100M全二重はチト辛い。上下合わせてピーク 150M程度のトラヒックで /proc/net/pf_ring/<プロセスID>-<デバイス名>- みたいなエントリを覗くと 6〜7% ロスしてる。

何とかできるか...と無い知恵を絞って画策してみたが nprobe の商用サイト? で販売している筐体 nBox のスペック眺めたところ、OpenMicroServer では難かしいカモ。と弱気になったところで...オチ。

2008年4月16日水曜日

netflow の exporter その 3

先日書き綴ったものの修正。
>Documentation/networking/packet_mmap.txt のサイトはアクセスできず
>ここからソース持ってきてみたものの x86 のみ? で早々にあきらめ。
mb() でアセンブラがあったが、使っておらず、またこれら PACKET_MMAP な libpcap を参考にした lincap.c についても mb() についてはカーネルヘッダから、それなりのものを持って来れば良さげ。また
>PF_RING に挑戦したが...扱っている量がそーとーなレベルという事に気付く。
なんて書いたが、少々試したところ歴然たる差があった。当初試したときには pcap_open() での *device に NULL あるいは any が指定できるものと思い込んでいたが、指定して PF_RING が feature されずに動いてしまったため差が無いと思い込んでいた。この any が指定できないのが少々辛かったりするので PACKET_MMAP の libpcap も作成して試してみよう。

おまけと言っては失礼だけど環境変数設定すると様子が眺められたり、挙動を変更できるらしいのも、ちょと嬉し。

で、libpcap-0.9.8.20080206.tar.gz を持ってきて展開した後、debian lenny にて apt-get source libpcap0.8 この debian ディレクトリを丸ごとコピーして以下 debian/patches/10_shared_lib.diff を参考にした Makefile.in のパッチ。rules にて patch 当てないようにして
--- libpcap-0.9.8.20080206/Makefile.in  2008-02-08 08:49:02.000000000 +0900
+++ libpcap-0.9.8.20080206-deb/Makefile.in 2008-04-16 22:12:48.000000000 +0900
@@ -116,6 +116,17 @@
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libpcap_la_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@
+
+# some defines for shared library compilation
+MAJ=$(shell head -1 debian/changelog | perl -nle 'm/\S+(\d.\d)\s+\(\d\.\d\.\d+-\S+\)/ and print $$1')
+MIN=$(shell head -1 debian/changelog | perl -nle 'm/\S+\s+\(\d\.\d\.(\d+)-\S+\)/ and print $$1')
+LIBVERSION=$(shell head -1 debian/changelog | perl -nle 'm/\S+\s+\((\S+)-\S+\)/ and print $$1')
+VERSION=$(MAJ).$(MIN)
+LIBNAME=pcap
+LIBRARY=lib$(LIBNAME).a
+SOLIBRARY=lib$(LIBNAME).so
+SHAREDLIB=$(SOLIBRARY).$(LIBVERSION)
+
depcomp =
am__depfiles_maybe =
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -155,6 +166,7 @@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
+CFLAGS_SHARED = -shared -Wl,-soname,$(SOLIBRARY).$(MAJ)
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
@@ -278,7 +290,7 @@
LTRELEASE = $(RMAJOR).$(RMINOR).$(RREVISION)
LTVERSION = $(VCURRENT):$(VREVISION):$(VAGE)
PCAP = @V_PCAP@
-PSRC = pcap-@V_PCAP@.c
+PSRC = pcap-@V_PCAP@.c pcap-ring.c
FSRC = fad-@V_FINDALLDEVS@.c
FADS = @V_FADS@
LEX = @V_LEX@
@@ -298,7 +310,9 @@
MAINTAINERCLEANFILES = Makefile.in Makefile.am.bak configure.ac.bak aclocal.m4 configure config.h.in
MOSTLYCLEANFILES = bpf_filter.c scanner.c grammar.c version.c lex.yy.c \
tokdefs.h version.h os-proto.h \
- stamp-h stamp-h.in
+ stamp-h stamp-h.in $(OBJ_PIC) libpcap.so*
+
+OBJ_PIC = $(PSRC:.c=_pic.o) $(FSRC:.c=_pic.o) $(CSRC:.c=_pic.o) $(SSRC:.c=_pic.o) $(GENSRC:.c=_pic.o)

HDR = arcnet.h atmuni31.h config.h ethertype.h gencode.h \
llc.h nlpid.h pcap-bpf.h pcap-int.h pcap-namedb.h \
@@ -384,6 +398,9 @@
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
+ $(INSTALL_DATA) $(SHAREDLIB) $(DESTDIR)$(libdir)/
+ ln -sf $(SHAREDLIB) $(DESTDIR)$(libdir)/$(SOLIBRARY).$(MAJ)
+ ln -sf $(SOLIBRARY).$(MAJ) $(DESTDIR)$(libdir)/$(SOLIBRARY)

uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@@ -411,7 +428,12 @@
-rm -f *.tab.c

.c.o:
- $(COMPILE) -c $<
+ # $(COMPILE) -c $<
+ $(COMPILE) -c -o $@ $(srcdir)/$*.c
+
+%_pic.o: %.c
+ @rm -f $@
+ $(COMPILE) -fPIC $(CFLAGS) -c -o $@ $(srcdir)/$*.c

.c.obj:
$(COMPILE) -c `$(CYGPATH_W) '$<'`
@@ -767,7 +789,7 @@

#all-local:
# rm -f libpcap.a; $(LN_S) .libs/libpcap.a libpcap.a
-all-local: libpcap.a
+all-local: libpcap.a $(SHAREDLIB)

libpcap.a: .libs/libpcap.a
cp .libs/libpcap.a libpcap.a
@@ -792,6 +814,13 @@
yyy:
sh beenthere

+$(SHAREDLIB): $(OBJ_PIC)
+ -@rm -f $@
+ -@rm -f $(SOLIBRARY) $(SOLIBRARY).$(MAJ)
+ $(CC) $(CFLAGS_SHARED) -o $(SHAREDLIB) $(OBJ_PIC) -lc
+ ln -s $(SHAREDLIB) $(SOLIBRARY).$(MAJ)
+ ln -s $(SOLIBRARY).$(MAJ) $(SOLIBRARY)
+
# generated source
pcap.3.gz: pcap.3
gzip -c < pcap.3 > pcap.3.gz
@@ -800,12 +829,18 @@
rm -f bpf_filter.c
$(LN_S) $(srcdir)/bpf/net/bpf_filter.c bpf_filter.c

+bpf_filter_pic.o: bpf_filter.c
+ $(COMPILE) -fPIC $(CFLAGS) -c bpf_filter.c -o $@
+
scanner.o: scanner.c tokdefs.h

scanner.c: scanner.l tokdefs.h
@rm -f $@
$(V_LEX) -t scanner.l > $$$$.$@; mv $$$$.$@ $@

+scanner_pic.o: scanner.c tokdefs.h
+ $(COMPILE) -fPIC $(CFLAGS) -o $@ -c scanner.c
+
tokdefs.h:
rm -f grammar.c
make grammar.o
@@ -818,6 +853,10 @@
mv y.tab.c grammar.c
mv y.tab.h tokdefs.h

+grammar_pic.o: grammar.c
+ @rm -f $@
+ $(COMPILE) -fPIC $(CFLAGS) -Dyylval=pcap_lval -o $@ -c grammar.c
+
version.o: version.c

version.c: $(srcdir)/REVISION version.h
@@ -828,6 +867,13 @@
version.h: $(srcdir)/VERSION
@rm -f $@
sed -n -e 's/.*/static const char pcap_version_string[] = "libpcap version &";/p' $(srcdir)/VERSION > $@
+
+version_pic.o: version.c
+ $(COMPILE) -fPIC $(CFLAGS) -c version.c -o $@
+
+pcap-ring_pic.o: version.c
+ $(COMPILE) -fPIC $(CFLAGS) -c pcap-ring.c -o $@
+
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
# 早い時間の帰宅って嬉しいなぁ....

2008年4月10日木曜日

netflow の exporter その 2

Documentation/networking/packet_mmap.txt のサイトはアクセスできず、ここ からソース持ってきてみたものの x86 のみ? で早々にあきらめ。

nprobe って言っているなら気付けよっ。との事で、こちら をありがたく参考しつつ PF_RING に挑戦したが...扱っている量がそーとーなレベルという事に気付く。OpenMicroServer にて nprobe 稼働させてロスしまくっていても flow-capture でひろってみると 5分おきに 6M位 のファイルができてる...

# 参考にさせていただいたところ補足。libpfring でのコンパイルは -fPIC 入れた方が良さげ。
# また libpfring の so は単独ではなく libpcap の README 曰く libpcap 作る時に *.o 加えてあげるらしい。

2007年11月19日月曜日

XORP の ospf6

制約っぽいのですが XORP 1.4 の release notes
- The OSPFv3 configuration allows multiple instances to be configured however only one instance will be created. Configuring multiple OSPFv3 instances is guaranteed to cause problems.
なる記述あり。で config.boot
potocol ospf6 10
とすると? しても? instance ID を 0 として Hello を投げ、受け取った側は instance ID が 10 じゃない。といったログ....消してしまった.... が残る。なので
protocol ospf6 0
としたところ、まぁ、動いた。