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:
# 早い時間の帰宅って嬉しいなぁ....

0 件のコメント: