docs: def ParseIfaddrs(ifaddrs):
    """Parses contents of the intrusive linked list of `ifaddrs`.
  
    Args:
      ifaddrs: A pointer to the first node of `ifaddrs` linked list. Can be NULL.
  
    Returns:
      An iterator over instances of `rdf_client_network.Interface`.
    """
    precondition.AssertOptionalType(ifaddrs, ctypes.POINTER(Ifaddrs))
  
    ifaces = {}
  
    for ifaddr in IterIfaddrs(ifaddrs):
      ifname = ctypes.string_at(ifaddr.ifa_name).decode("utf-8")
      iface = ifaces.setdefault(ifname, rdf_client_network.Interface())
      iface.ifname = ifname
  
      if not ifaddr.ifa_addr:
        continue
  
      sockaddr = ctypes.cast(ifaddr.ifa_addr, ctypes.POINTER(Sockaddr))
      iffamily = sockaddr.contents.sa_family
      if iffamily == AF_INET:
        sockaddrin = ctypes.cast(ifaddr.ifa_addr, ctypes.POINTER(Sockaddrin))
  
        address = rdf_client_network.NetworkAddress()
        address.address_type = rdf_client_network.NetworkAddress.Family.INET
        address.packed_bytes = struct.pack("=L", sockaddrin.contents.sin_addr)
        iface.addresses.append(address)
      elif iffamily == AF_INET6:
        sockaddrin = ctypes.cast(ifaddr.ifa_addr, ctypes.POINTER(Sockaddrin6))
  
        address = rdf_client_network.NetworkAddress()
        address.address_type = rdf_client_network.NetworkAddress.Family.INET6
        address.packed_bytes = bytes(list(sockaddrin.contents.sin6_addr))
        iface.addresses.append(address)
      elif iffamily == AF_LINK:
        sockaddrdl = ctypes.cast(ifaddr.ifa_addr, ctypes.POINTER(Sockaddrdl))
  
        nlen = sockaddrdl.contents.sdl_nlen
        alen = sockaddrdl.contents.sdl_alen
        iface.mac_address = bytes(sockaddrdl.contents.sdl_data[nlen:nlen + alen])
      else:
        raise ValueError("Unexpected socket address family: %s" % iffamily)
  
    return itervalues(ifaces)