[dtrace-discuss] DTrace Network Providers, take 2
Brendan Gregg - Sun Microsystems
brendan at sun.com
Mon Jun 11 20:11:25 PDT 2007
G'Day Folks,
I'm restarting work on the proposed DTrace network providers. These are
the stable providers intended for use by Solaris end users for general
observability, similar to what the "io" provider achieves for disk I/O.
I have been busy on other projects during the last 6 months, so little has
progressed since the last (long) dtrace-discuss thread with the subject
"DTrace Network Provider".
I've just reread that thread - and I'm grateful to have had so much useful
feedback so far. I've reintegrated some feedback with what I've learnt
through using the network provider during the past 6 months, and I'm
considering some new changes - which would be take 2 of the prototype
network providers.
For now I'm sticking to just discussing the internet layer protocols.
Summary
Take 1 (current):
Probes Args
ip:::send ipstateinfo_t, ipinfo_t, ipv4info_t, ipv6info_t
ip:::receive ipstateinfo_t, ipinfo_t, ipv4info_t, ipv6info_t
more details: http://www.opensolaris.org/os/community/dtrace/NetworkProvider
This provider has been great to use in testing. A key issue is the
uglyness of having ipv4info_t and ipv6info_t as different args; although
this hasn't been much of a problem as ipinfo_t is usually used instead.
Take 2 (proposed):
Probes Args
ip:::send cstateinfo_t, ipinfo_t
ip:::receive cstateinfo_t, ipinfo_t
ipv4:::send cstateinfo_t, ipinfo_t, ipv4info_t
ipv4:::receive cstateinfo_t, ipinfo_t, ipv4info_t
ipv6:::send cstateinfo_t, ipinfo_t, ipv6info_t
ipv6:::receive cstateinfo_t, ipinfo_t, ipv6info_t
ipsec:::send cstateinfo_t, ipinfo_t, ipsecinfo_t
ipsec:::receive cstateinfo_t, ipinfo_t, ipsecinfo_t
icmp:::send cstateinfo_t, ipinfo_t, icmpinfo_t
icmp:::receive cstateinfo_t, ipinfo_t, icmpinfo_t
arp:::send cstateinfo_t, arpinfo_t
arp:::receive cstateinfo_t, arpinfo_t
rarp:::send cstateinfo_t, arpinfo_t
rarp:::receive cstateinfo_t, arpinfo_t
...
Providers such as "ipv4" and "ipv6" are for specific protocol analysis,
and their 3rd argument is an endian correct structure of the protocol
members (DTrace translator). A pointer to the raw protocol struct will
be provided. (this assumes that "ipv4" is an allowed provider name, as
it could potentially clash with a USDT provider called "ipv" that is
asked to trace PID 4).
Some discussion points about the new suggestions follow.
1) ipinfo_t
This provides common details from the IP protocols that we expect to
have available,
ipinfo_t,
ip_protocol int /* protocol */
ip_plength uint /* payload length */
ip_saddr string /* source address */
ip_daddr string /* destination address */
ip_protocol could be just the IP protocol number (4 or 6), or borrow existing
definitions such as AF_INET/AF_INET6, ETHERTYPE_IP/ETHERTYPE_IPV6 or use
/etc/protocols - as these may better accomodate future protocol additions.
Using the IP protocol number (4/6) would be the least suprising choice for
the end user.
2) cstateinfo_t
This provides connection state information if available,
cstateinfo_t,
cs_cid uint64_t /* connection ID (conn_t *) */
cs_loopback int /* loopback state */
and may be extended to include details such as,
cs_zoneid int /* zone ID */
cs_ip_stack uint64_t /* stack ID (ip_stack_t *) */
cs_cid isn't provided as a conn_t *, as that would expose an unstable
interface; instead it is provided as a uint64_t, as it can be useful as a
connection ID (and people can cast it as a conn_t * for raw debugging).
3) ip provider
"ip" is the internet protocol provider, which is a convience provider for
tracing all internet protocol traffic (anything with an IP header).
It may be expanded in the future to cover future internet layer data
protocols (protocols that serve the same purpose as IPv4/IPv6).
4) ip provider & ipsec
Since "ip" is a convience provider, we have the possibility of casting
data that is useful (for convience) rather than what is strictly in the
protocol. For example, IPSec, where packets have the tunnel source and dest
and the actual source and dest, could be traced as follows:
Probes Arguments contain
ipv4::: tunnel source and dest
ipv6::: tunnel source and dest
ipsec::: actual source and dest, and tunnel source and dest
ip::: actual source and dest
(assuming this is doable - I need to check if ip::: probes can be placed
so to not see duplicates of IPSec traffic).
This would allow the ipv4 provider to probe the IPv4 protocol, and the ip
provider to probe the actual end points of our communication.
5) ICMP
To stress the intent of these providers, an IPv4 ICMP send would fire,
ip:::send Generic info
ipv4:::send IPv4 packet info
icmp:::send ICMP details (type, code, ...)
perhaps snoop -V helps explain this,
192.168.1.109 -> 192.168.1.3 ETHER Type=0800 (IP), size=98 bytes
192.168.1.109 -> 192.168.1.3 IP D=192.168.1.3 S=192.168.1.109 LEN=84, ID=3232, TOS=0x0, TTL=255
192.168.1.109 -> 192.168.1.3 ICMP Echo request (ID: 20076 Sequence number: 0)
The ip and ipv4 providers will trace the "IP" line, and the icmp provider
will trace the "ICMP" line.
6) Nifty-IP (hypothetical)
In the distant future, Aliens from the Pleiades cluster make contact with
Earth. They have been searching the galaxy for a quality operating system
that they can install on their interstellar battleships, and are delighted
to have found this thing that Earth people call "Solaris". However, they
need to communicate with their own internet layer protocol, which roughly
translated into English is called "nifty-IP". Work begins to support
nifty-IP in Solaris 16, partly as a good jesture for our alien neighbours,
and partly because they aggreed to pay in tons of solid gold.
The following providers would trace nifty-IP,
ip::: Generic info
nifty-ip::: nifty-ip packet info (niftyipinfo_t)
An integration difficulty with ip::: is that of matching fields in ipinfo_t.
That should work as follows,
ip_protocol no problem - nifty-ip gets its own protocol number
ip_plength no problem - nifty-ip must move some length of data
ip_saddr no problem - although may be unintelligible
ip_daddr no problem - although may be unintelligible
The assumptions are that any future internet layer protocol will move
data from address A to address B, and that data will have a measurable
length.
The cstateinfo_t members shouldn't be a problem, as they are specific to
Solaris and not the protocol.
cheers,
Brendan
--
Brendan
[CA, USA]
More information about the dtrace-discuss
mailing list