Hi All, First post here; any pointers or improvements for bug reporting are welcome.
[1.] One line summary of the problem: sendmsg() with ancillary data of type IPV6_PKTINFO fails with invalid argument and further possible memory corruption. --------------------------------- [2.] Full description of the problem/report: As part of my project I am attempting to perform IPv6 neighbour solicitations to discover the MAC address of my local neighbours. In the included test code link-local src and dst addresses are used to send neighbour solicitations along with specifying the network interface in IPV6_PKTINFO ancillary data. In my test environment I have a Ubuntu 16.04 LTS Server/Router and a Ubuntu 16.04 LTS Desktop. These are both hosted on a Windows 10 Host as Virtual Guests. Router/Server Interfaces: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:c5:0e:76 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fec5:e76/64 scope link valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:0a:c1:80 brd ff:ff:ff:ff:ff:ff inet6 2001:db8:1000:baba::1/64 scope global valid_lft forever preferred_lft forever inet6 fe80::a00:27ff:fe0a:c180/64 scope link valid_lft forever preferred_lft forever Eth0 is set up for NAT to a physical IPv4 network but is unused in this test setup. Eth1 is IPv6 and is the radvd interface attatched to an internal virtual box network interface. In my client environment I have three network interfaces: 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:b9:42:47 brd ff:ff:ff:ff:ff:ff inet 192.168.100.121/24 brd 192.168.100.255 scope global dynamic enp0s3 valid_lft 79320sec preferred_lft 79320sec inet6 fe80::5523:e7df:d12c:681/64 scope link valid_lft forever preferred_lft forever 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:1a:a7:22 brd ff:ff:ff:ff:ff:ff 4: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:35:13:22 brd ff:ff:ff:ff:ff:ff inet6 2001:db8:1000:baba:b30a:ed85:8568:cc66/64 scope global noprefixroute dynamic valid_lft 86389sec preferred_lft 14389sec inet6 fe80::cffe:e7ef:a03a:34cb/64 scope link valid_lft forever preferred_lft forever enp0s3 is a bridged physical wired connection on the host to an ipv4 network with router / gateway, ipv6 is active but not used. enp0s8 is a bridged physical wifi connection on the host to another ipv4 subnet within the same network on the same router / gateway ipv6 is active but not used . enp0d9 is an internal virtual box network connected directly to another Ubuntu guest as an IPv6 stateless router (the neighbour I am solicitating) this interfaces is ipv4 enabled but not used. The expected behaviour is to use the sendmsg() system call and specify the outgoing interface for the neighbour sonication message using the IPV6_PKTINFO ancillary data as detailed in the RFC3542 links below. 6.1. Specifying/Receiving the Interface https://tools.ietf.org/html/rfc3542.html#section-6.1 6.7 Summary of Outgoing Interface Selection https://tools.ietf.org/html/rfc3542.html#section-6.7 The actual behaviour is for the sendmsg() system call to fail with errno set to 22, Invalid Argument. A note of interest is that if a perror() call is made to report this problem a seg fault in mallo.c is encountered. I have not performed further investigation. You can see this has been commented after the sendmsg() system call in the demo code. Warning: In my testing I have removed the IPV6_PKTINFO ancillary data and have found that if the IPv6 router is not available at boot by default enp0s3 is used to send the packet. I will send another e-mail further describing the behaviour with the subject: [PROBLEM]: IPv6 Link-Local Routing through wrong interface --------------------------------- [3.] Keywords (i.e., modules, networking, kernel): networking, ipv6, link-local, ancillary --------------------------------- [4.] Kernel version (from /proc/version): Linux version 4.4.0-51-generic (buildd@lcy01-08) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #72-Ubuntu SMP Thu Nov 24 18:29:54 UTC 2016 Linux version 4.8.11-1-ARCH (builduser@tobias) (gcc version 6.2.1 20160830 (GCC) ) #1 SMP PREEMPT Sun Nov 27 09:26:14 CET 2016 --------------------------------- [5.] Output of Oops.. message (if applicable) with symbolic information resolved (see Documentation/oops-tracing.txt) --------------------------------- [6.] A small shell script or example program which triggers the problem (if possible) /* Copyright (C) 2011-2015 P.D. Buchan (mailto:pdbuc...@yahoo.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ // Send an IPv6 ICMP neighbor solicitation packet. // Change hoplimit and specify interface using ancillary // data method. #define _GNU_SOURCE #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> // close() #include <string.h> // strcpy, memset(), and memcpy() #include <netinet/icmp6.h> // struct nd_neighbor_solicit, which contains icmp6_hdr, ND_NEIGHBOR_SOLICIT #include <netinet/in.h> // IPPROTO_IPV6, IPPROTO_ICMPV6, INET6_ADDRSTRLEN #include <netinet/ip.h> // IP_MAXPACKET (65535) #include <arpa/inet.h> // inet_ntop() #include <netdb.h> // struct addrinfo #include <sys/ioctl.h> // macro ioctl is defined #include <bits/ioctls.h> // defines values for argument "request" of ioctl. Here, we need SIOCGIFHWADDR #include <bits/socket.h> // structs msghdr and cmsghdr #include <net/if.h> // struct ifreq #include <linux/ipv6.h> #include <stdint.h> #include <errno.h> // errno, perror() // Definition of pktinfo6 created from definition of in6_pktinfo in netinet/in.h. // This should remove "redefinition of in6_pktinfo" errors in some linux variants. typedef struct _pktinfo6 pktinfo6; struct _pktinfo6 { struct in6_addr ipi6_addr; int ipi6_ifindex; }; // Function prototypes uint16_t checksum (uint16_t *, int); char *allocate_strmem (int); uint8_t *allocate_ustrmem (int); int main (int argc, char **argv) { int NS_HDRLEN = sizeof (struct nd_neighbor_solicit); // Length of NS message header int optlen = 8; // Option Type (1 byte) + Length (1 byte) + Length of MAC address (6 bytes) int i, sd, status, ifindex, cmsglen, psdhdrlen; struct addrinfo hints; struct addrinfo *res; struct sockaddr_in6 *ipv6, src, dst, dstsnmc; struct nd_neighbor_solicit *ns; socklen_t srclen; uint8_t *outpack, *options, *psdhdr, hoplimit; struct msghdr msghdr, msghdr2 ; struct ifreq ifr; struct cmsghdr *cmsghdr1, *cmsghdr2; pktinfo6 *pktinfo; struct iovec iov[2]; char *target, *source, *interface; void *tmp; // Allocate memory for various arrays. interface = allocate_strmem (40); target = allocate_strmem (INET6_ADDRSTRLEN); source = allocate_strmem (INET6_ADDRSTRLEN); outpack = allocate_ustrmem (IP_MAXPACKET); options = allocate_ustrmem (optlen); psdhdr = allocate_ustrmem (IP_MAXPACKET); // Interface to send packet through. strcpy (interface, "enp0s9"); // Source (node sending solicitation) IPv6 unicast address, or // the IPv6 unspecified address (:: // You need to fill this out. //strcpy (source, "fe80::cffe:e7ef:a03a:34cb"); strcpy (source, "::"); // Target (which must be link-local) hostname or IPv6 address (node we're requesting an advertisement from). // You need to fill this out. strcpy (target, "fe80::a00:27ff:fe0a:c180"); // Fill out hints for getaddrinfo(). memset (&hints, 0, sizeof (struct addrinfo)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = hints.ai_flags | AI_CANONNAME; // Resolve source using getaddrinfo(). if ((status = getaddrinfo (source, NULL, &hints, &res)) != 0) { fprintf (stderr, "getaddrinfo() failed: %s\n", gai_strerror (status)); return (EXIT_FAILURE); } memset (&src, 0, sizeof (src)); memcpy (&src, res->ai_addr, res->ai_addrlen); srclen = res->ai_addrlen; memcpy (psdhdr, src.sin6_addr.s6_addr, 16 * sizeof (uint8_t)); // Copy to checksum pseudo-header freeaddrinfo (res); // Resolve target using getaddrinfo(). if ((status = getaddrinfo (target, NULL, &hints, &res)) != 0) { fprintf (stderr, "getaddrinfo() failed: %s\n", gai_strerror (status)); return (EXIT_FAILURE); } memset (&dst, 0, sizeof (dst)); memset (&dstsnmc, 0, sizeof (dstsnmc)); memcpy (&dst, res->ai_addr, res->ai_addrlen); memcpy (&dstsnmc, res->ai_addr, res->ai_addrlen); // Report target's unicast address. ipv6 = (struct sockaddr_in6 *) res->ai_addr; tmp = &(ipv6->sin6_addr); memset (target, 0, INET6_ADDRSTRLEN * sizeof (char)); if (inet_ntop (AF_INET6, tmp, target, INET6_ADDRSTRLEN) == NULL) { status = errno; fprintf (stderr, "inet_ntop() failed.\nError message: %s", strerror (status)); exit (EXIT_FAILURE); } printf ("Target unicast IPv6 address: %s\n", target); freeaddrinfo (res); // Convert target's IPv6 unicast address to solicited-node multicast address. // Section 2.7.1 of RFC 4291. dstsnmc.sin6_addr.s6_addr[0]= 255; dstsnmc.sin6_addr.s6_addr[1]=2; for (i=2; i<11; i++) { dstsnmc.sin6_addr.s6_addr[i] = 0; } dstsnmc.sin6_addr.s6_addr[11]=1; dstsnmc.sin6_addr.s6_addr[12]=255; // Report target's solicited-node multicast address. ipv6 = (struct sockaddr_in6 *) &dstsnmc; tmp = &(ipv6->sin6_addr); memset (target, 0, INET6_ADDRSTRLEN * sizeof (char)); if (inet_ntop (AF_INET6, tmp, target, INET6_ADDRSTRLEN) == NULL) { status = errno; fprintf (stderr, "inet_ntop() failed.\nError message: %s", strerror (status)); exit (EXIT_FAILURE); } printf ("Target solicited-node multicast address: %s\n", target); memcpy (psdhdr + 16, dstsnmc.sin6_addr.s6_addr, 16 * sizeof (uint8_t)); // Solicited-node multicast address goes into pseudo-header // Request a socket descriptor sd. if ((sd = socket (AF_INET6, SOCK_RAW, IPPROTO_ICMPV6)) < 0) { perror ("Failed to get socket descriptor "); exit (EXIT_FAILURE); } // Use ioctl() to look up soliciting node's (i.e., source's) interface name and get its MAC address. memset (&ifr, 0, sizeof (ifr)); snprintf (ifr.ifr_name, sizeof (ifr.ifr_name), "%s", interface); if (ioctl (sd, SIOCGIFHWADDR, &ifr) < 0) { perror ("ioctl() failed to get source MAC address "); return (EXIT_FAILURE); } // Copy source MAC address into options buffer. options[0] = 1; // Option Type - "source link layer address" (Section 4.6 of RFC 4861) options[1] = optlen / 8; // Option Length - units of 8 octets (RFC 4861) for (i=0; i<6; i++) { options[i+2] = (uint8_t) ifr.ifr_addr.sa_data[i]; } // Report soliciting node MAC address to stdout. printf ("MAC address for interface %s is ", interface); for (i=0; i<5; i++) { printf ("%02x:", options[i+2]); } printf ("%02x\n", options[5+2]); // Always bind otherwise the packet will be sent out on the first active site-local or link-local interface. // Bind the socket descriptor to the source address if not site-local or link-local. if (!(psdhdr[0] == 0xfe)) { if (bind (sd, (struct sockaddr *) &src, srclen) < 0) { perror ("Failed to bind the socket descriptor to the source address "); exit (EXIT_FAILURE); } } // Find interface index from interface name. // This will be put in cmsghdr data in order to specify the interface we want to use. if ((ifindex = if_nametoindex (interface)) == 0) { perror ("if_nametoindex() failed to obtain interface index "); exit (EXIT_FAILURE); } printf ("Soliciting node's index for interface %s is %i\n", interface, ifindex); // Define first part of buffer outpack to be a neighbor solicit struct. ns = (struct nd_neighbor_solicit *) outpack; memset (ns, 0, sizeof (*ns)); // Populate icmp6_hdr portion of neighbor solicit struct. ns->nd_ns_hdr.icmp6_type = ND_NEIGHBOR_SOLICIT; // 135 (RFC 4861) ns->nd_ns_hdr.icmp6_code = 0; // zero for neighbor solicitation (RFC 4861) ns->nd_ns_hdr.icmp6_cksum = htons(0); // zero when calculating checksum ns->nd_ns_reserved = htonl(0); // Reserved - must be set to zero (RFC 4861) ns->nd_ns_target = dst.sin6_addr; // Target address (NOT MULTICAST) (as type in6_addr) // Append options to end of neighbor solicit struct. memcpy (outpack + NS_HDRLEN, options, optlen * sizeof (uint8_t)); // Need a pseudo-header for checksum calculation. Define length. (RFC 2460) // Length = source IP (16 bytes) + destination IP (16 bytes) // + upper layer packet length (4 bytes) + zero (3 bytes) // + next header (1 byte) psdhdrlen = 16 + 16 + 4 + 3 + 1 + NS_HDRLEN + optlen; // Prepare msghdr for sendmsg(). memset (&msghdr, 0, sizeof (msghdr)); msghdr.msg_name = &dstsnmc; // Destination IPv6 address (solicited node multicast) (as struct sockaddr_in6) msghdr.msg_namelen = sizeof (dstsnmc); memset (&iov, 0, sizeof (iov)); iov[0].iov_base = (uint8_t *) outpack; // Point msghdr to buffer outpack iov[0].iov_len = NS_HDRLEN + optlen; msghdr.msg_iov = iov; // scatter/gather array msghdr.msg_iovlen = 1; // number of elements in scatter/gather array // Tell msghdr we're adding cmsghdr data to change hop limit and specify interface. // Allocate some memory for our cmsghdr data. cmsglen = CMSG_SPACE (sizeof (int)) + CMSG_SPACE (sizeof (pktinfo)); msghdr.msg_control = allocate_ustrmem (cmsglen); msghdr.msg_controllen = cmsglen; // Change hop limit to 255 as required for neighbor solicitation (RFC 4861). hoplimit = 255u; cmsghdr1 = CMSG_FIRSTHDR (&msghdr); if(NULL == cmsghdr1) { fprintf (stderr, "NULL Returned out of Memory"); exit (EXIT_FAILURE); } cmsghdr1->cmsg_level = IPPROTO_IPV6; cmsghdr1->cmsg_type = IPV6_HOPLIMIT; // We want to change hop limit cmsghdr1->cmsg_len = CMSG_LEN (sizeof (int)); *(CMSG_DATA (cmsghdr1)) = hoplimit; // Specify source interface index for this packet via cmsghdr data. cmsghdr2 = CMSG_NXTHDR (&msghdr, cmsghdr1); if(NULL == cmsghdr2) { fprintf (stderr, "NULL Returned out of Memory"); exit (EXIT_FAILURE); } cmsghdr2->cmsg_level = IPPROTO_IPV6; cmsghdr2->cmsg_type = IPV6_PKTINFO; // We want to specify interface here cmsghdr2->cmsg_len = CMSG_LEN (sizeof (pktinfo)); pktinfo = (pktinfo6 *) CMSG_DATA (cmsghdr2); pktinfo->ipi6_ifindex = ifindex; pktinfo->ipi6_ifindex = 0; // Compute ICMPv6 checksum (RFC 2460). // psdhdr[0 to 15] = source IPv6 address, set earlier. // psdhdr[16 to 31] = destination IPv6 address, set earlier. psdhdr[32] = 0; // Length should not be greater than 65535 (i.e., 2 bytes) psdhdr[33] = 0; // Length should not be greater than 65535 (i.e., 2 bytes) psdhdr[34] = (NS_HDRLEN + optlen) / 256; // Upper layer packet length psdhdr[35] = (NS_HDRLEN + optlen) % 256; // Upper layer packet length psdhdr[36] = 0; // Must be zero psdhdr[37] = 0; // Must be zero psdhdr[38] = 0; // Must be zero psdhdr[39] = IPPROTO_ICMPV6; memcpy (psdhdr + 40, outpack, (NS_HDRLEN + optlen) * sizeof (uint8_t)); ns->nd_ns_hdr.icmp6_cksum = checksum ((uint16_t *) psdhdr, psdhdrlen); printf ("Checksum: %x\n", ntohs (ns->nd_ns_hdr.icmp6_cksum)); if (sendmsg (sd, &msghdr, 0) < 0) { // perror ("sendmsg() failed "); fprintf (stderr,"[%d] %s\n", errno, strerror(errno)); exit (EXIT_FAILURE); } close (sd); // Free allocated memory. free (interface); free (target); free (source); free (outpack); free (options); free (psdhdr); free (msghdr.msg_control); return (EXIT_SUCCESS); } // Computing the internet checksum (RFC 1071). // Note that the internet checksum does not preclude collisions. uint16_t checksum (uint16_t *addr, int len) { int count = len; register uint32_t sum = 0; uint16_t answer = 0; // Sum up 2-byte values until none or only one byte left. while (count > 1) { sum += *(addr++); count -= 2; } // Add left-over byte, if any. if (count > 0) { sum += *(uint8_t *) addr; } // Fold 32-bit sum into 16 bits; we lose information by doing this, // increasing the chances of a collision. // sum = (lower 16 bits) + (upper 16 bits shifted right 16 bits) while (sum >> 16) { sum = (sum & 0xffff) + (sum >> 16); } // Checksum is one's compliment of sum. answer = ~sum; return (answer); } // Allocate memory for an array of chars. char * allocate_strmem (int len) { void *tmp; if (len <= 0) { fprintf (stderr, "ERROR: Cannot allocate memory because len = %i in allocate_strmem().\n", len); exit (EXIT_FAILURE); } tmp = (char *) malloc (len * sizeof (char)); if (tmp != NULL) { memset (tmp, 0, len * sizeof (char)); return (tmp); } else { fprintf (stderr, "ERROR: Cannot allocate memory for array allocate_strmem().\n"); exit (EXIT_FAILURE); } } // Allocate memory for an array of unsigned chars. uint8_t * allocate_ustrmem (int len) { void *tmp; if (len <= 0) { fprintf (stderr, "ERROR: Cannot allocate memory because len = %i in allocate_ustrmem().\n", len); exit (EXIT_FAILURE); } tmp = (uint8_t *) malloc (len * sizeof (uint8_t)); if (tmp != NULL) { memset (tmp, 0, len * sizeof (uint8_t)); return (tmp); } else { fprintf (stderr, "ERROR: Cannot allocate memory for array allocate_ustrmem().\n"); exit (EXIT_FAILURE); } } --------------------------------- [7.] Environment Host -> Windows 10 - VirtualBox Version 5.1.10 r112026 (Qt5.6.2) Guest -> Ubuntu 16.04 (Up to date) Guest -> Arch Linux (Latest) ------------- [7.1] Software Linux tom-VirtualBox 4.4.0-51-generic #72-Ubuntu SMP Thu Nov 24 18:29:54 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux GNU C 5.4.0 GNU Make 4.1 Binutils 2.26.1 Util-linux 2.27.1 Mount 2.27.1 Module-init-tools 22 E2fsprogs 1.42.13 Pcmciautils 018 PPP 2.4.7 Linux C Library 2.23 Dynamic linker (ldd) 2.23 Linux C++ Library 6.0.21 Procps 3.3.10 Net-tools 1.60 Kbd 1.15.5 Console-tools 1.15.5 Sh-utils 8.25 Udev 229 Wireless-tools 30 Modules Loaded 8250_fintek ablk_helper aesni_intel aes_x86_64 ahci autofs4 binfmt_misc crc32_pclmul crct10dif_pclmul cryptd drm drm_kms_helper e1000 fb_sys_fops fjes gf128mul ghash_clmulni_intel glue_helper hid hid_generic i2c_piix4 input_leds joydev libahci lp lrw mac_hid parport parport_pc pata_acpi ppdev psmouse serio_raw syscopyarea sysfillrect sysimgblt ttm usbhid vboxguest vboxsf vboxvideo video Linux archbox 4.8.11-1-ARCH #1 SMP PREEMPT Sun Nov 27 09:26:14 CET 2016 x86_64 GNU/Linux GNU C 6.2.1 GNU Make 4.2.1 Binutils 2.27 Util-linux 2.28.2 Mount 2.28.2 Module-init-tools 23 E2fsprogs 1.43.3 Jfsutils 1.1.15 Reiserfsprogs 3.6.25 Xfsprogs 4.8.0 Pcmciautils 018 Linux C Library 2.24 Dynamic linker (ldd) 2.24 Linux C++ Library 6.0.22 Kbd 2.0.3 Console-tools 2.0.3 Sh-utils 8.25 Udev 232 Modules Loaded ablk_helper ac ac97_bus acpi_cpufreq aesni_intel aes_x86_64 ata_generic ata_piix atkbd battery button cdrom cfg80211 crc16 crc32c_intel crc32_pclmul crct10dif_pclmul cryptd e1000 ehci_hcd ehci_pci evdev ext4 fjes fscrypto gf128mul ghash_clmulni_intel glue_helper hid hid_generic i2c_piix4 i8042 input_leds intel_agp intel_gtt intel_rapl_perf ip_tables jbd2 joydev led_class libata libps2 lrw mac_hid mbcache mousedev ohci_hcd ohci_pci parport parport_pc pata_acpi pcspkr ppdev psmouse rfkill sch_fq_codel scsi_mod sd_mod serio serio_raw snd snd_ac97_codec snd_intel8x0 snd_pcm snd_timer soundcore sr_mod tpm tpm_tis tpm_tis_core usb_common usbcore usbhid video x_tables ------------- [7.2.] Processor information (Ubuntu) processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 94 model name : Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz stepping : 3 cpu MHz : 2591.818 cache size : 6144 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc pni pclmulqdq monitor ssse3 cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx rdrand lahf_lm abm 3dnowprefetch rdseed clflushopt bugs : bogomips : 5183.63 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: (Arch) processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 94 model name : Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz stepping : 3 cpu MHz : 2591.998 cache size : 6144 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch rdseed clflushopt bugs : bogomips : 5186.99 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 94 model name : Intel(R) Core(TM) i7-6700HQ CPU @ 2.60GHz stepping : 3 cpu MHz : 2591.998 cache size : 6144 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fpu : yes fpu_exception : yes cpuid level : 22 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc eagerfpu pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx rdrand hypervisor lahf_lm abm 3dnowprefetch rdseed clflushopt bugs : bogomips : 5186.99 clflush size : 64 cache_alignment : 64 address sizes : 39 bits physical, 48 bits virtual power management: ------------- [7.3.] Module information (Ubuntu) vboxsf 45056 0 - Live 0x0000000000000000 (OE) binfmt_misc 20480 1 - Live 0x0000000000000000 crct10dif_pclmul 16384 0 - Live 0x0000000000000000 crc32_pclmul 16384 0 - Live 0x0000000000000000 ghash_clmulni_intel 16384 0 - Live 0x0000000000000000 vboxvideo 49152 2 - Live 0x0000000000000000 (OE) ttm 94208 1 vboxvideo, Live 0x0000000000000000 aesni_intel 167936 0 - Live 0x0000000000000000 aes_x86_64 20480 1 aesni_intel, Live 0x0000000000000000 lrw 16384 1 aesni_intel, Live 0x0000000000000000 drm_kms_helper 155648 1 vboxvideo, Live 0x0000000000000000 gf128mul 16384 1 lrw, Live 0x0000000000000000 glue_helper 16384 1 aesni_intel, Live 0x0000000000000000 ablk_helper 16384 1 aesni_intel, Live 0x0000000000000000 cryptd 20480 3 ghash_clmulni_intel,aesni_intel,ablk_helper, Live 0x0000000000000000 drm 364544 5 vboxvideo,ttm,drm_kms_helper, Live 0x0000000000000000 joydev 20480 0 - Live 0x0000000000000000 fb_sys_fops 16384 1 drm_kms_helper, Live 0x0000000000000000 input_leds 16384 0 - Live 0x0000000000000000 serio_raw 16384 0 - Live 0x0000000000000000 syscopyarea 16384 2 vboxvideo,drm_kms_helper, Live 0x0000000000000000 sysfillrect 16384 2 vboxvideo,drm_kms_helper, Live 0x0000000000000000 sysimgblt 16384 2 vboxvideo,drm_kms_helper, Live 0x0000000000000000 vboxguest 282624 6 vboxsf,vboxvideo, Live 0x0000000000000000 (OE) i2c_piix4 24576 0 - Live 0x0000000000000000 8250_fintek 16384 0 - Live 0x0000000000000000 mac_hid 16384 0 - Live 0x0000000000000000 parport_pc 32768 0 - Live 0x0000000000000000 ppdev 20480 0 - Live 0x0000000000000000 lp 20480 0 - Live 0x0000000000000000 parport 49152 3 parport_pc,ppdev,lp, Live 0x0000000000000000 autofs4 40960 2 - Live 0x0000000000000000 hid_generic 16384 0 - Live 0x0000000000000000 usbhid 49152 0 - Live 0x0000000000000000 hid 118784 2 hid_generic,usbhid, Live 0x0000000000000000 psmouse 131072 0 - Live 0x0000000000000000 ahci 36864 3 - Live 0x0000000000000000 libahci 32768 1 ahci, Live 0x0000000000000000 fjes 28672 0 - Live 0x0000000000000000 video 40960 0 - Live 0x0000000000000000 e1000 135168 0 - Live 0x0000000000000000 pata_acpi 16384 0 - Live 0x0000000000000000 (Arch) cfg80211 495616 0 - Live 0xffffffffa0416000 rfkill 20480 2 cfg80211, Live 0xffffffffa0394000 ppdev 20480 0 - Live 0xffffffffa0410000 crct10dif_pclmul 16384 0 - Live 0xffffffffa040b000 crc32_pclmul 16384 0 - Live 0xffffffffa0406000 crc32c_intel 24576 0 - Live 0xffffffffa03fb000 ghash_clmulni_intel 16384 0 - Live 0xffffffffa03f6000 aesni_intel 167936 0 - Live 0xffffffffa03c3000 aes_x86_64 20480 1 aesni_intel, Live 0xffffffffa03bd000 lrw 16384 1 aesni_intel, Live 0xffffffffa03b8000 gf128mul 16384 1 lrw, Live 0xffffffffa03b3000 glue_helper 16384 1 aesni_intel, Live 0xffffffffa03a3000 ablk_helper 16384 1 aesni_intel, Live 0xffffffffa039e000 cryptd 20480 3 ghash_clmulni_intel,aesni_intel,ablk_helper, Live 0xffffffffa03a8000 intel_rapl_perf 16384 0 - Live 0xffffffffa0387000 input_leds 16384 0 - Live 0xffffffffa0382000 pcspkr 16384 0 - Live 0xffffffffa031f000 evdev 24576 3 - Live 0xffffffffa038d000 psmouse 126976 0 - Live 0xffffffffa0362000 led_class 16384 1 input_leds, Live 0xffffffffa0359000 joydev 20480 0 - Live 0xffffffffa0335000 mousedev 20480 0 - Live 0xffffffffa02f8000 mac_hid 16384 0 - Live 0xffffffffa02dd000 parport_pc 28672 0 - Live 0xffffffffa02e8000 parport 40960 2 ppdev,parport_pc, Live 0xffffffffa032a000 acpi_cpufreq 20480 0 - Live 0xffffffffa0324000 fjes 28672 0 - Live 0xffffffffa028a000 battery 20480 0 - Live 0xffffffffa0306000 tpm_tis 16384 0 - Live 0xffffffffa02e3000 intel_agp 20480 0 - Live 0xffffffffa0315000 tpm_tis_core 20480 1 tpm_tis, Live 0xffffffffa030f000 ac 16384 0 - Live 0xffffffffa0301000 button 16384 0 - Live 0xffffffffa02f3000 tpm 36864 2 tpm_tis,tpm_tis_core, Live 0xffffffffa02d3000 video 36864 0 - Live 0xffffffffa02c9000 e1000 131072 0 - Live 0xffffffffa02a8000 i2c_piix4 24576 0 - Live 0xffffffffa0232000 intel_gtt 20480 1 intel_agp, Live 0xffffffffa02a2000 snd_intel8x0 36864 0 - Live 0xffffffffa0293000 snd_ac97_codec 118784 1 snd_intel8x0, Live 0xffffffffa026c000 ac97_bus 16384 1 snd_ac97_codec, Live 0xffffffffa0098000 snd_pcm 90112 2 snd_intel8x0,snd_ac97_codec, Live 0xffffffffa0249000 snd_timer 28672 1 snd_pcm, Live 0xffffffffa023c000 snd 69632 4 snd_intel8x0,snd_ac97_codec,snd_pcm,snd_timer, Live 0xffffffffa0220000 soundcore 16384 1 snd, Live 0xffffffffa0080000 sch_fq_codel 20480 2 - Live 0xffffffffa021a000 ip_tables 28672 0 - Live 0xffffffffa0145000 x_tables 28672 1 ip_tables, Live 0xffffffffa0150000 ext4 524288 1 - Live 0xffffffffa0199000 crc16 16384 1 ext4, Live 0xffffffffa00a9000 jbd2 90112 1 ext4, Live 0xffffffffa00f9000 fscrypto 24576 1 ext4, Live 0xffffffffa00f2000 mbcache 16384 2 ext4, Live 0xffffffffa0068000 hid_generic 16384 0 - Live 0xffffffffa006e000 usbhid 49152 0 - Live 0xffffffffa018c000 hid 114688 2 hid_generic,usbhid, Live 0xffffffffa016f000 sr_mod 24576 0 - Live 0xffffffffa00b4000 cdrom 53248 1 sr_mod, Live 0xffffffffa00e4000 sd_mod 36864 3 - Live 0xffffffffa005e000 ata_generic 16384 0 - Live 0xffffffffa001c000 pata_acpi 16384 0 - Live 0xffffffffa0017000 ohci_pci 16384 0 - Live 0xffffffffa0012000 serio_raw 16384 0 - Live 0xffffffffa00af000 atkbd 24576 0 - Live 0xffffffffa00a2000 libps2 16384 2 psmouse,atkbd, Live 0xffffffffa009d000 ata_piix 36864 2 - Live 0xffffffffa008e000 ehci_pci 16384 0 - Live 0xffffffffa0085000 ohci_hcd 49152 1 ohci_pci, Live 0xffffffffa0073000 ehci_hcd 73728 1 ehci_pci, Live 0xffffffffa015c000 libata 208896 3 ata_generic,pata_acpi,ata_piix, Live 0xffffffffa0111000 scsi_mod 159744 3 sr_mod,sd_mod,libata, Live 0xffffffffa00bc000 usbcore 208896 5 usbhid,ohci_pci,ohci_hcd,ehci_pci,ehci_hcd, Live 0xffffffffa002a000 usb_common 16384 1 usbcore, Live 0xffffffffa0022000 i8042 28672 0 - Live 0xffffffffa000a000 serio 20480 6 psmouse,serio_raw,atkbd,i8042, Live 0xffffffffa0000000 -- Registered Office: Actual Experience plc Quay House, The Ambury, Bath BA1 1UA, Registered No. 06838738, VAT No. 971 9696 56 The information transmitted is intended only for the person or entity to which it is addressed and may contain confidential and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and delete the material from any computer. Although we routinely screen for viruses, addressees should check this e-mail and any attachment for viruses. We make no warranty as to absence of viruses in this e-mail or any attachments.