void getStatusValue(char *type, char *retvalue) { if (!safe_strcmp(type, "ethmac")) { getMacByIntf("eth0", retvalue); } else if (!safe_strcmp(type, "wlan0")) { getMacByIntf("wlan0-va0", retvalue); } else if (!safe_strcmp(type, "wlan1")) { getMacByIntf("wlan1-va0", retvalue); } else if (!safe_strcmp(type, "mocamac")) { getMacByIntf("eth0", retvalue); } else if (!safe_strcmp(type, "version")) { strcpy(retvalue, "10.1.1"); } else if (!safe_strcmp(type, "ipv6addr")) { getIPv6Addr("br0", retvalue); } kinfo("%s -> %s", type, retvalue); }
/** * virSocketCheckNetmask: * @addr1: a first network address * @addr2: a second network address * @netmask: the netmask address * * Check that @addr1 and @addr2 pertain to the same @netmask address * range and returns the size of the range * * Returns 1 in case of success and 0 in case of failure and * -1 in case of error */ int virSocketCheckNetmask(virSocketAddrPtr addr1, virSocketAddrPtr addr2, virSocketAddrPtr netmask) { int i; if ((addr1 == NULL) || (addr2 == NULL) || (netmask == NULL)) return(-1); if ((addr1->data.stor.ss_family != addr2->data.stor.ss_family) || (addr1->data.stor.ss_family != netmask->data.stor.ss_family)) return(-1); if (virSocketAddrIsNetmask(netmask) != 0) return(-1); if (addr1->data.stor.ss_family == AF_INET) { virIPv4Addr t1, t2, tm; if ((getIPv4Addr(addr1, &t1) < 0) || (getIPv4Addr(addr2, &t2) < 0) || (getIPv4Addr(netmask, &tm) < 0)) return(-1); for (i = 0;i < 4;i++) { if ((t1[i] & tm[i]) != (t2[i] & tm[i])) return(0); } } else if (addr1->data.stor.ss_family == AF_INET6) { virIPv6Addr t1, t2, tm; if ((getIPv6Addr(addr1, &t1) < 0) || (getIPv6Addr(addr2, &t2) < 0) || (getIPv6Addr(netmask, &tm) < 0)) return(-1); for (i = 0;i < 8;i++) { if ((t1[i] & tm[i]) != (t2[i] & tm[i])) return(0); } } else { return(-1); } return(1); }
/** * virSocketGetRange: * @start: start of an IP range * @end: end of an IP range * * Check the order of the 2 addresses and compute the range, this * will return 1 for identical addresses. Errors can come from incompatible * addresses type, excessive range (>= 2^^16) where the two addresses are * unrelated or inverted start and end. * * Returns the size of the range or -1 in case of failure */ int virSocketGetRange(virSocketAddrPtr start, virSocketAddrPtr end) { int ret = 0, i; if ((start == NULL) || (end == NULL)) return(-1); if (start->data.stor.ss_family != end->data.stor.ss_family) return(-1); if (start->data.stor.ss_family == AF_INET) { virIPv4Addr t1, t2; if ((getIPv4Addr(start, &t1) < 0) || (getIPv4Addr(end, &t2) < 0)) return(-1); for (i = 0;i < 2;i++) { if (t1[i] != t2[i]) return(-1); } ret = (t2[2] - t1[2]) * 256 + (t2[3] - t1[3]); if (ret < 0) return(-1); ret++; } else if (start->data.stor.ss_family == AF_INET6) { virIPv6Addr t1, t2; if ((getIPv6Addr(start, &t1) < 0) || (getIPv6Addr(end, &t2) < 0)) return(-1); for (i = 0;i < 7;i++) { if (t1[i] != t2[i]) return(-1); } ret = t2[7] - t1[7]; if (ret < 0) return(-1); ret++; } else { return(-1); } return(ret); }
void net_IP_data (int v, u_char *b, int len) { int ip_version; int protocol = -1; // print_databytes (v, "IP_datagram_bytes", b, len); out_NL (v); out_nl (v,"IP_datagram_bytes:"); indent (+1); ip_version = outBit_Sx_NL (v, "Version: ", b, 0, 4); if (ip_version == 4) { // -- RFC 791 IPv4 int header_len; int ip; header_len = outBit_Sx_NL (v, "IP header length: ", b, 4, 4); outBit_Sx_NL (v, "Type of service: ", b, 8, 8); outBit_Sx_NL (v, "Total length: ", b, 16, 16); outBit_Sx_NL (v, "Identification: ", b, 32, 16); outBit_Sx_NL (v, "Reserved: ", b, 48, 1); outBit_Sx_NL (v, "DF: ", b, 49, 1); outBit_Sx_NL (v, "MF: ", b, 50, 1); outBit_Sx_NL (v, "Fragment offset: ", b, 51, 13); outBit_Sx_NL (v, "Time to live: ", b, 64, 8); protocol = outBit_S2x_NL(v, "Protocol: ", b, 72, 8, (char *(*)(u_long))netStr_RFC790_protocol_nr ); outBit_Sx_NL (v, "Header checksum: ", b, 80, 16); ip = getBits (b, 0, 96, 32); out (v,"Source address: %08lx [= ", ip); displ_IPv4_addr (v, ip); out_nl (v,"]"); ip = getBits (b, 0, 128, 32); out (v,"Destination address: %08lx [= ", ip); displ_IPv4_addr (v, ip); out_nl (v,"]"); b += (5*4); // 5*4 = header length len -= (5*4); // -- IPv4 Options & Padding // --- n = number of options // --- Total bit length: ( ( 5+n ) * 32 ), 5 is minimum header if (header_len > 5) { // -- TODO Options & Padding print_databytes (v, "Options & Padding ", b, len); b += (header_len-5)*4; len -= (header_len-5)*4; } } else if (ip_version == 6) { // -- RFC 2460 for IPv6 struct IPv6ADDR x; outBit_Sx_NL (v, "Traffic class: ", b, 4, 8); outBit_Sx_NL (v, "Flow label: ", b, 12, 20); outBit_Sx_NL (v, "Payload length: ", b, 32, 16); protocol = outBit_Sx_NL (v, "Next header: ", b, 48, 16); outBit_Sx_NL (v, "Hop limit: ", b, 64, 16); getIPv6Addr (b+8, &x); out (v, "Source address: %08lx%08lx%08lx%08lx [= ", x.ip[0], x.ip[1], x.ip[2], x.ip[3] ); displ_IPv6_addr (4, &x); out_nl (v,"]"); getIPv6Addr (b+24, &x); out (v, "Destination address: %08lx%08lx%08lx%08lx [= ", x.ip[0], x.ip[1], x.ip[2], x.ip[3] ); displ_IPv6_addr (4, &x); out_nl (v,"]"); b += 40; len -= 40; } // -- ICMP, RFC 792 if (protocol == 1) { out_NL (v); out_nl (v,"ICMP_data: "); indent (+1); print_databytes (v, "Data", b, len); // $$$ TODO b += len; len = 0; indent (-1); } // -- TCP, RFC 793 if (protocol == 6) { out_NL (v); out_nl (v,"TCP_data: "); indent (+1); print_databytes (v, "Data", b, len); // $$$ TODO b += len; len = 0; indent (-1); } // -- UDP datagram, RFC 768 if (protocol == 17) { int udp_header_len; out_NL (v); out_nl (v,"UDP_datagram: "); indent (+1); outBit_Sx_NL (v, "Source port: ", b, 0, 16); outBit_Sx_NL (v, "Destination port: ", b, 16, 16); udp_header_len = outBit_Sx_NL (v, "Length: ", b, 32, 16); outBit_Sx_NL (v, "Checksum: ", b, 48, 16); print_databytes (v, "Data", b+8, udp_header_len-8); b += udp_header_len; // -- length is complete header + data len -= udp_header_len; indent (-1); } if (len > 0) { print_databytes (v, "Unknown Data / Padding", b, len); b += len; len -= len; } out_NL (v); indent (-1); }