Page MenuHomeFreeBSD

D24203.id69987.diff
No OneTemporary

D24203.id69987.diff

Index: contrib/tcpdump/README
===================================================================
--- contrib/tcpdump/README
+++ contrib/tcpdump/README
@@ -1 +1,225 @@
-link README.md
\ No newline at end of file
+# tcpdump
+
+[![Build
+Status](https://travis-ci.org/the-tcpdump-group/tcpdump.png)](https://travis-ci.org/the-tcpdump-group/tcpdump)
+
+To report a security issue please send an e-mail to security@tcpdump.org.
+
+To report bugs and other problems, contribute patches, request a
+feature, provide generic feedback etc please see the file
+CONTRIBUTING in the tcpdump source tree root.
+
+TCPDUMP 4.x.y
+Now maintained by "The Tcpdump Group"
+See www.tcpdump.org
+
+Anonymous Git is available via:
+
+ git clone git://bpf.tcpdump.org/tcpdump
+
+formerly from Lawrence Berkeley National Laboratory
+ Network Research Group <tcpdump@ee.lbl.gov>
+ ftp://ftp.ee.lbl.gov/old/tcpdump.tar.Z (3.4)
+
+This directory contains source code for tcpdump, a tool for network
+monitoring and data acquisition. This software was originally
+developed by the Network Research Group at the Lawrence Berkeley
+National Laboratory. The original distribution is available via
+anonymous ftp to `ftp.ee.lbl.gov`, in `tcpdump.tar.Z`. More recent
+development is performed at tcpdump.org, http://www.tcpdump.org/
+
+Tcpdump uses libpcap, a system-independent interface for user-level
+packet capture. Before building tcpdump, you must first retrieve and
+build libpcap, also originally from LBL and now being maintained by
+tcpdump.org; see http://www.tcpdump.org/ .
+
+Once libpcap is built (either install it or make sure it's in
+`../libpcap`), you can build tcpdump using the procedure in the `INSTALL.txt`
+file.
+
+The program is loosely based on SMI's "etherfind" although none of the
+etherfind code remains. It was originally written by Van Jacobson as
+part of an ongoing research project to investigate and improve tcp and
+internet gateway performance. The parts of the program originally
+taken from Sun's etherfind were later re-written by Steven McCanne of
+LBL. To insure that there would be no vestige of proprietary code in
+tcpdump, Steve wrote these pieces from the specification given by the
+manual entry, with no access to the source of tcpdump or etherfind.
+
+Over the past few years, tcpdump has been steadily improved by the
+excellent contributions from the Internet community (just browse
+through the `CHANGES` file). We are grateful for all the input.
+
+Richard Stevens gives an excellent treatment of the Internet protocols
+in his book *"TCP/IP Illustrated, Volume 1"*. If you want to learn more
+about tcpdump and how to interpret its output, pick up this book.
+
+Some tools for viewing and analyzing tcpdump trace files are available
+from the Internet Traffic Archive:
+
+* http://www.sigcomm.org/ITA/
+
+Another tool that tcpdump users might find useful is tcpslice:
+
+* https://github.com/the-tcpdump-group/tcpslice
+
+It is a program that can be used to extract portions of tcpdump binary
+trace files. See the above distribution for further details and
+documentation.
+
+Current versions can be found at www.tcpdump.org.
+
+ - The TCPdump team
+
+original text by: Steve McCanne, Craig Leres, Van Jacobson
+
+-------------------------------------
+```
+This directory also contains some short awk programs intended as
+examples of ways to reduce tcpdump data when you're tracking
+particular network problems:
+
+send-ack.awk
+ Simplifies the tcpdump trace for an ftp (or other unidirectional
+ tcp transfer). Since we assume that one host only sends and
+ the other only acks, all address information is left off and
+ we just note if the packet is a "send" or an "ack".
+
+ There is one output line per line of the original trace.
+ Field 1 is the packet time in decimal seconds, relative
+ to the start of the conversation. Field 2 is delta-time
+ from last packet. Field 3 is packet type/direction.
+ "Send" means data going from sender to receiver, "ack"
+ means an ack going from the receiver to the sender. A
+ preceding "*" indicates that the data is a retransmission.
+ A preceding "-" indicates a hole in the sequence space
+ (i.e., missing packet(s)), a "#" means an odd-size (not max
+ seg size) packet. Field 4 has the packet flags
+ (same format as raw trace). Field 5 is the sequence
+ number (start seq. num for sender, next expected seq number
+ for acks). The number in parens following an ack is
+ the delta-time from the first send of the packet to the
+ ack. A number in parens following a send is the
+ delta-time from the first send of the packet to the
+ current send (on duplicate packets only). Duplicate
+ sends or acks have a number in square brackets showing
+ the number of duplicates so far.
+
+ Here is a short sample from near the start of an ftp:
+ 3.00 0.20 send . 512
+ 3.20 0.20 ack . 1024 (0.20)
+ 3.20 0.00 send P 1024
+ 3.40 0.20 ack . 1536 (0.20)
+ 3.80 0.40 * send . 0 (3.80) [2]
+ 3.82 0.02 * ack . 1536 (0.62) [2]
+ Three seconds into the conversation, bytes 512 through 1023
+ were sent. 200ms later they were acked. Shortly thereafter
+ bytes 1024-1535 were sent and again acked after 200ms.
+ Then, for no apparent reason, 0-511 is retransmitted, 3.8
+ seconds after its initial send (the round trip time for this
+ ftp was 1sec, +-500ms). Since the receiver is expecting
+ 1536, 1536 is re-acked when 0 arrives.
+
+packetdat.awk
+ Computes chunk summary data for an ftp (or similar
+ unidirectional tcp transfer). [A "chunk" refers to
+ a chunk of the sequence space -- essentially the packet
+ sequence number divided by the max segment size.]
+
+ A summary line is printed showing the number of chunks,
+ the number of packets it took to send that many chunks
+ (if there are no lost or duplicated packets, the number
+ of packets should equal the number of chunks) and the
+ number of acks.
+
+ Following the summary line is one line of information
+ per chunk. The line contains eight fields:
+ 1 - the chunk number
+ 2 - the start sequence number for this chunk
+ 3 - time of first send
+ 4 - time of last send
+ 5 - time of first ack
+ 6 - time of last ack
+ 7 - number of times chunk was sent
+ 8 - number of times chunk was acked
+ (all times are in decimal seconds, relative to the start
+ of the conversation.)
+
+ As an example, here is the first part of the output for
+ an ftp trace:
+
+ # 134 chunks. 536 packets sent. 508 acks.
+ 1 1 0.00 5.80 0.20 0.20 4 1
+ 2 513 0.28 6.20 0.40 0.40 4 1
+ 3 1025 1.16 6.32 1.20 1.20 4 1
+ 4 1561 1.86 15.00 2.00 2.00 6 1
+ 5 2049 2.16 15.44 2.20 2.20 5 1
+ 6 2585 2.64 16.44 2.80 2.80 5 1
+ 7 3073 3.00 16.66 3.20 3.20 4 1
+ 8 3609 3.20 17.24 3.40 5.82 4 11
+ 9 4097 6.02 6.58 6.20 6.80 2 5
+
+ This says that 134 chunks were transferred (about 70K
+ since the average packet size was 512 bytes). It took
+ 536 packets to transfer the data (i.e., on the average
+ each chunk was transmitted four times). Looking at,
+ say, chunk 4, we see it represents the 512 bytes of
+ sequence space from 1561 to 2048. It was first sent
+ 1.86 seconds into the conversation. It was last
+ sent 15 seconds into the conversation and was sent
+ a total of 6 times (i.e., it was retransmitted every
+ 2 seconds on the average). It was acked once, 140ms
+ after it first arrived.
+
+stime.awk
+atime.awk
+ Output one line per send or ack, respectively, in the form
+ <time> <seq. number>
+ where <time> is the time in seconds since the start of the
+ transfer and <seq. number> is the sequence number being sent
+ or acked. I typically plot this data looking for suspicious
+ patterns.
+
+
+The problem I was looking at was the bulk-data-transfer
+throughput of medium delay network paths (1-6 sec. round trip
+time) under typical DARPA Internet conditions. The trace of the
+ftp transfer of a large file was used as the raw data source.
+The method was:
+
+ - On a local host (but not the Sun running tcpdump), connect to
+ the remote ftp.
+
+ - On the monitor Sun, start the trace going. E.g.,
+ tcpdump host local-host and remote-host and port ftp-data >tracefile
+
+ - On local, do either a get or put of a large file (~500KB),
+ preferably to the null device (to minimize effects like
+ closing the receive window while waiting for a disk write).
+
+ - When transfer is finished, stop tcpdump. Use awk to make up
+ two files of summary data (maxsize is the maximum packet size,
+ tracedata is the file of tcpdump tracedata):
+ awk -f send-ack.awk packetsize=avgsize tracedata >sa
+ awk -f packetdat.awk packetsize=avgsize tracedata >pd
+
+ - While the summary data files are printing, take a look at
+ how the transfer behaved:
+ awk -f stime.awk tracedata | xgraph
+ (90% of what you learn seems to happen in this step).
+
+ - Do all of the above steps several times, both directions,
+ at different times of day, with different protocol
+ implementations on the other end.
+
+ - Using one of the Unix data analysis packages (in my case,
+ S and Gary Perlman's Unix|Stat), spend a few months staring
+ at the data.
+
+ - Change something in the local protocol implementation and
+ redo the steps above.
+
+ - Once a week, tell your funding agent that you're discovering
+ wonderful things and you'll write up that research report
+ "real soon now".
+```
Index: sbin/nvmecontrol/comnd.h
===================================================================
--- sbin/nvmecontrol/comnd.h
+++ sbin/nvmecontrol/comnd.h
@@ -96,6 +96,7 @@
int arg_parse(int argc, char * const *argv, const struct cmd *f);
void arg_help(int argc, char * const *argv, const struct cmd *f);
void cmd_init(void);
+void cmd_unload_shlibs(void);
void cmd_load_dir(const char *dir, cmd_load_cb_t *cb, void *argp);
int cmd_dispatch(int argc, char *argv[], const struct cmd *);
Index: sbin/nvmecontrol/comnd.c
===================================================================
--- sbin/nvmecontrol/comnd.c
+++ sbin/nvmecontrol/comnd.c
@@ -47,6 +47,13 @@
#include "comnd.h"
+struct shlib {
+ SLIST_ENTRY(shlib) link;
+ void *handle;
+};
+
+static SLIST_HEAD(, shlib) shlibs = SLIST_HEAD_INITIALIZER(shlibs);
+
static struct cmd top;
static void
@@ -283,6 +290,22 @@
}
/*
+ * Unloads all the .so's.
+ */
+void
+cmd_unload_shlibs(void)
+{
+ struct shlib *ent;
+ struct shlib *tmp;
+
+ SLIST_FOREACH_SAFE(ent, &shlibs, link, tmp) {
+ SLIST_REMOVE_HEAD(&shlibs, link);
+ dlclose(ent->handle);
+ free(ent);
+ }
+}
+
+/*
* Loads all the .so's from the specified directory.
*/
void
@@ -292,6 +315,7 @@
struct dirent *dent;
char *path = NULL;
void *h;
+ struct shlib *libent;
d = opendir(dir);
if (d == NULL)
@@ -302,12 +326,20 @@
asprintf(&path, "%s/%s", dir, dent->d_name);
if (path == NULL)
err(1, "Can't malloc for path, giving up.");
+ libent = (struct shlib *)malloc(sizeof(struct shlib));
+ if (libent == NULL)
+ err(1, "Can't malloc for libent, giving up.");
if ((h = dlopen(path, RTLD_NOW | RTLD_GLOBAL)) == NULL)
warnx("Can't load %s: %s", path, dlerror());
else {
+ libent->handle = h;
+ SLIST_INSERT_HEAD(&shlibs, libent, link);
+ /* libent is saved; prevent from being freed below. */
+ libent = NULL;
if (cb != NULL)
cb(argp, h);
}
+ free(libent);
free(path);
path = NULL;
}
Index: sbin/nvmecontrol/firmware.c
===================================================================
--- sbin/nvmecontrol/firmware.c
+++ sbin/nvmecontrol/firmware.c
@@ -151,6 +151,7 @@
errx(1,
"error reading '%s' (read %d bytes, requested %d bytes)",
path, *size, filesize);
+ close(fd);
}
static void
@@ -188,6 +189,7 @@
resid -= size;
off += size;
}
+ free(chunk);
}
static int
Index: sbin/nvmecontrol/identify.c
===================================================================
--- sbin/nvmecontrol/identify.c
+++ sbin/nvmecontrol/identify.c
@@ -94,7 +94,7 @@
NVME_NS_DATA_DPC_PIT3_MASK) ? "Type 3, " : "",
((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_SHIFT) &
NVME_NS_DATA_DPC_PIT2_MASK) ? "Type 2, " : "",
- ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT2_MASK) &
+ ((nsdata->dpc >> NVME_NS_DATA_DPC_PIT1_SHIFT) &
NVME_NS_DATA_DPC_PIT1_MASK) ? "Type 1" : "");
printf("Data Protection Settings: ");
ptype = (nsdata->dps >> NVME_NS_DATA_DPS_PIT_SHIFT) &
@@ -238,7 +238,8 @@
int fd;
uint32_t nsid;
- arg_parse(argc, argv, f);
+ if (arg_parse(argc, argv, f))
+ return;
open_dev(opt.dev, &fd, 1, 1);
get_nsid(fd, &path, &nsid);
Index: sbin/nvmecontrol/logpage.c
===================================================================
--- sbin/nvmecontrol/logpage.c
+++ sbin/nvmecontrol/logpage.c
@@ -570,11 +570,11 @@
printf("Unknown");
break;
}
- p = (ss->sstat & NVME_SS_PAGE_SSTAT_PASSES_SHIFT) >>
+ p = (ss->sstat >> NVME_SS_PAGE_SSTAT_PASSES_SHIFT) &
NVME_SS_PAGE_SSTAT_PASSES_MASK;
if (p > 0)
printf(", %d passes", p);
- if ((ss->sstat & NVME_SS_PAGE_SSTAT_GDE_SHIFT) >>
+ if ((ss->sstat >> NVME_SS_PAGE_SSTAT_GDE_SHIFT) &
NVME_SS_PAGE_SSTAT_GDE_MASK)
printf(", Global Data Erased");
printf("\n");
Index: sbin/nvmecontrol/modules/wdc/wdc.c
===================================================================
--- sbin/nvmecontrol/modules/wdc/wdc.c
+++ sbin/nvmecontrol/modules/wdc/wdc.c
@@ -275,7 +275,7 @@
wsp++; /* Flags, just ignore */
plen = *wsp++;
param = 0;
- for (i = 0; i < plen; i++)
+ for (i = 0; i < plen && wsp < esp; i++)
param |= (uint64_t)*wsp++ << (i * 8);
printf(" %-30s: %jd\n", kv_lookup(kv, kv_count, ptype), (uintmax_t)param);
}
Index: sbin/nvmecontrol/nsid.c
===================================================================
--- sbin/nvmecontrol/nsid.c
+++ sbin/nvmecontrol/nsid.c
@@ -70,7 +70,8 @@
int fd;
uint32_t nsid;
- arg_parse(argc, argv, f);
+ if (arg_parse(argc, argv, f))
+ return;
open_dev(nsid_opt.dev, &fd, 1, 1);
get_nsid(fd, &path, &nsid);
Index: sbin/nvmecontrol/nvmecontrol.c
===================================================================
--- sbin/nvmecontrol/nvmecontrol.c
+++ sbin/nvmecontrol/nvmecontrol.c
@@ -184,5 +184,6 @@
cmd_dispatch(argc, argv, NULL);
+ cmd_unload_shlibs();
return (0);
}
Index: sbin/nvmecontrol/passthru.c
===================================================================
--- sbin/nvmecontrol/passthru.c
+++ sbin/nvmecontrol/passthru.c
@@ -158,10 +158,12 @@
passthru(const struct cmd *f, int argc, char *argv[])
{
int fd = -1, ifd = -1;
+ size_t bytes_read;
void *data = NULL, *metadata = NULL;
struct nvme_pt_command pt;
- arg_parse(argc, argv, f);
+ if (arg_parse(argc, argv, f))
+ return;
open_dev(argv[optind], &fd, 1, 1);
if (opt.read && opt.write)
@@ -189,8 +191,12 @@
goto cleanup;
}
memset(data, opt.prefill, opt.data_len);
- if (opt.write && read(ifd, data, opt.data_len) < 0) {
- warn("read %s", *opt.ifn ? opt.ifn : "stdin");
+ if (opt.write &&
+ (bytes_read = read(ifd, data, opt.data_len)) !=
+ opt.data_len) {
+ warn("read %s; expected %zd bytes; got %zd",
+ *opt.ifn ? opt.ifn : "stdin",
+ opt.data_len, bytes_read);
goto cleanup;
}
}
@@ -249,6 +255,11 @@
}
}
cleanup:
+ free(data);
+ if (fd > -1)
+ close(fd);
+ if (ifd > -1)
+ close(ifd);
if (errno)
exit(1);
}
Index: sbin/nvmecontrol/power.c
===================================================================
--- sbin/nvmecontrol/power.c
+++ sbin/nvmecontrol/power.c
@@ -145,7 +145,8 @@
struct nvme_controller_data cdata;
int fd;
- arg_parse(argc, argv, f);
+ if (arg_parse(argc, argv, f))
+ return;
if (opt.list && opt.power != POWER_NONE) {
fprintf(stderr, "Can't set power and list power states\n");
Index: sbin/nvmecontrol/reset.c
===================================================================
--- sbin/nvmecontrol/reset.c
+++ sbin/nvmecontrol/reset.c
@@ -57,7 +57,8 @@
{
int fd;
- arg_parse(argc, argv, f);
+ if (arg_parse(argc, argv, f))
+ return;
open_dev(opt.dev, &fd, 1, 1);
if (ioctl(fd, NVME_RESET_CONTROLLER) < 0)

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 5, 3:22 PM (19 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28442892
Default Alt Text
D24203.id69987.diff (16 KB)

Event Timeline