Some Information for Contributors --------------------------------- You want to contribute to Tcpdump, Thanks! Please, read these lines. 1) Fork the Tcpdump repository on GitHub from https://github.com/the-tcpdump-group/tcpdump (See https://help.github.com/articles/fork-a-repo/) 2) Setup an optional Travis-CI build You can setup a travis build for your fork. So, you can test your changes on Linux and OSX before sending pull requests. (See http://docs.travis-ci.com/user/getting-started/) 3) Clone your repository git clone https://github.com//tcpdump.git 4) Do a 'touch .devel' in your working directory. Currently, the effect is a) add (via configure, in Makefile) some warnings options ( -Wall -Wmissing-prototypes -Wstrict-prototypes, ...) to the compiler if it supports these options, b) have the Makefile support "make depend" and the configure script run it. 5) Configure and build ./configure && make -s && make check 6) Add/update sample.pcap files We use tests directory to do regression tests on the dissection of captured packets, by running tcpdump against a savefile sample.pcap, created with -w option and comparing the results with a text file sample.out giving the expected results. Any new/updated fields in a dissector must be present in a sample.pcap file and the corresponding output file. Configuration is set in tests/TESTLIST. Each line in this file has the following format: test-name sample.pcap sample.out tcpdump-options the sample.out file can be build by: (cd tests && ../tcpdump -n -r sample.pcap tcpdump-options > sample.out) It is often useful to have test outputs with different verbosity levels (none, -v, -vv, -vvv, etc.) depending on the code. 7) Test with 'make check' Don't send a pull request if 'make check' gives failed tests. 8) Rebase your commits against upstream/master (To keep linearity) 9) Initiate and send a pull request (See https://help.github.com/articles/using-pull-requests/) Some remarks ------------ a) A thorough reading of some other printers code is useful. b) Put the normative reference if any as comments (RFC, etc.). c) Put the format of packets/headers/options as comments. d) The printer may receive incomplete packet in the buffer, truncated at any random position, for example by capturing with '-s size' option. Thus use ND_TTEST, ND_TTEST2, ND_TCHECK or ND_TCHECK2 for bound checking. For ND_TCHECK2: Define : static const char tstr[] = " [|protocol]"; Define a label: trunc Print with: ND_PRINT((ndo, "%s", tstr)); You can test the code via: sudo ./tcpdump -s snaplen [-v][v][...] -i lo # in a terminal sudo tcpreplay -i lo sample.pcap # in another terminal You should try several values for snaplen to do various truncation. e) Do invalid packet checks in code: Think that your code can receive in input not only a valid packet but any arbitrary random sequence of octets (packet - built malformed originally by the sender or by a fuzz tester, - became corrupted in transit). Print with: ND_PRINT((ndo, "%s", istr)); /* to print " (invalid)" */ f) Use 'struct tok' for indexed strings and print them with tok2str() or bittok2str() (for flags). g) Avoid empty lines in output of printers. h) A commit message must have: First line: Capitalized short summary in the imperative (70 chars or less) Body: Detailed explanatory text, if necessary. Fold it to approximately 72 characters. There must be an empty line separating the summary from the body. i) Avoid non-ASCII characters in code and commit messages. j) Use the style of the modified sources. k) Don't mix declarations and code l) Don't use // for comments Not all C compilers accept C++/C99 comments by default. m) Avoid trailing tabs/spaces