Page History

Turn Off History

IPv6 in Condor, a developer's perspective

draft

See also HowToEnableIpvSix .

The Rules

The Big Picture

condor_sockaddr

/src/condor_includes/condor_sockaddr.h

The data structure holding information about a IP address/port pair is condor_sockaddr, which handles juggling sockaddr_in and sockaddr_in6. You shouldn't worry if a given address is IPv6 or IPv4, just use the condor_sockaddr opaquely. If you need a textual but still opaque representation, use condor_sockaddr::to_sinful and condor_sockaddr::from_sinful to create and parse sinful strings. Sinful string are human readable and thus appropriate to use in log messages.

IPv6 addresses require a scope id, identifying which network interface to use. This solves the problem of a single machine being part of two or more private ("link local") networks using the same address space. However, it just creates a new problem: if all you have is an IP address, how do you know which interface to use. The answer: we have no idea. Some tools allow the user to specify the scope ID in a variety of inconsistent ways. This is why NETWORK_INTERFACE is required for IPv6; we use the NETWORK_INTERFACE to identify the scope ID.

condor_netaddr

/src/condor_includes/condor_netaddr.h

condor_netaddr exists to encapsulate the idea of a subnet. It's built on top of condor_sockaddr, adding a count for how many bits to mask off. At the moment it's only being used to validate that a subset string can be parsed, but should eventually be used in any situation where Condor is checking that a given address is within a given subset (ie security).

Conversions

hostname to condor_sockaddr: resolve_hostname() in /src/condor_includes/ipv6_hostname.h takes a hostname (MyString or const char *), and returns a std::vector<condor_sockaddr>. Note that all off the returned condor_sockaddrs are correct! To be properly behaved, you should try them, in order, until you find one that works, or you run out of options.

condor_sockaddr to hostname: get_hostname() in /src/condor_includes/ipv6_hostname.h takes a condor_sockaddr and returns a hostname (MyString). If you want aliases as well, get_hostname_with_alias will return a std::vector<MyString> of hostnames.

condor_sockaddr to sinful string: condor_sockaddr::to_sinful() in /src/condor_includes/condor_sockaddr.h

sinful string to condor_sockaddr: condor_sockaddr::from_sinful() in /src/condor_includes/condor_sockaddr.h

IP address (as a string) to condor_sockaddr: resolve_hostname() in /src/condor_includes/ipv6_hostname.h can transform IPv4 and IPv6 addresses into condor_sockaddrs as well as looking up hostnames. Use these. Note that the parsing

condor_sockaddr to IP address (as a string): You almost certainly don't want this. If you're looking for something to pass between daemons, perhaps in a ClassAd or on a command line, use a sinful string. If you're looking for something to put into a log or error message, still use a sinful string. While officially opaque, they are also designed to be human readable enough to be useful in log messages, and using the sinful string ensures that no information is lost. If you absolutely must (perhaps to pass it to a non-Condor program) use condor_sockaddr::to_ip_string() and condor_sockaddr::to_ip_string() in /src/condor_includes/condor_sockaddr.h

Notes

- Getting hostnames and condor_sockaddrs.
./src/condor_includes/condor_sockfunc.h
- Use the condor_ wrappers (condor_accept, condor_bind, condor_inet_pton, etc) which take condor_sockaddrs.