def _read_routes_c_v1(): """Retrieve Windows routes through a GetIpForwardTable call. This is compatible with XP but won't get IPv6 routes.""" def _extract_ip(obj): return inet_ntop(socket.AF_INET, struct.pack("<I", obj)) routes = [] for route in GetIpForwardTable(): ifIndex = route['ForwardIfIndex'] dest = route['ForwardDest'] netmask = route['ForwardMask'] nexthop = _extract_ip(route['ForwardNextHop']) metric = route['ForwardMetric1'] # Build route try: iface = dev_from_index(ifIndex) if not iface.ip or iface.ip == "0.0.0.0": continue except ValueError: continue ip = iface.ip netw = network_name(iface) # RouteMetric + InterfaceMetric metric = metric + iface.ipv4_metric routes.append((dest, netmask, nexthop, netw, ip, metric)) return routes
def _read_routes_c(ipv6=False): """Retrieve Windows routes through a GetIpForwardTable2 call. This is not available on Windows XP !""" af = socket.AF_INET6 if ipv6 else socket.AF_INET sock_addr_name = 'Ipv6' if ipv6 else 'Ipv4' sin_addr_name = 'sin6_addr' if ipv6 else 'sin_addr' metric_name = 'ipv6_metric' if ipv6 else 'ipv4_metric' if ipv6: lifaddr = in6_getifaddr() routes = [] def _extract_ip(obj): ip = obj[sock_addr_name][sin_addr_name] ip = bytes(bytearray(ip['byte'])) # Build IP ip = inet_ntop(af, ip) return ip for route in GetIpForwardTable2(af): # Extract data ifIndex = route['InterfaceIndex'] dest = _extract_ip(route['DestinationPrefix']['Prefix']) netmask = route['DestinationPrefix']['PrefixLength'] nexthop = _extract_ip(route['NextHop']) metric = route['Metric'] # Build route try: iface = dev_from_index(ifIndex) if not iface.ip or iface.ip == "0.0.0.0": continue except ValueError: continue ip = iface.ip netw = network_name(iface) # RouteMetric + InterfaceMetric metric = metric + getattr(iface, metric_name) if ipv6: _append_route6(routes, dest, netmask, nexthop, netw, lifaddr, metric) else: routes.append( (atol(dest), itom(int(netmask)), nexthop, netw, ip, metric)) return routes