X-Git-Url: http://git.annexia.org/?p=virt-mem.git;a=blobdiff_plain;f=lib%2Fvirt_mem_net_devices.ml;fp=lib%2Fvirt_mem_net_devices.ml;h=0000000000000000000000000000000000000000;hp=f4e3ee74ec6599081253bad23b3205849de49afa;hb=82201a5312c3582daeb7215efd731f7e784d9edf;hpb=d2a3a6758dca234d0b201e8e965c0861517d37bb diff --git a/lib/virt_mem_net_devices.ml b/lib/virt_mem_net_devices.ml deleted file mode 100644 index f4e3ee7..0000000 --- a/lib/virt_mem_net_devices.ml +++ /dev/null @@ -1,160 +0,0 @@ -(* Memory info command for virtual domains. - (C) Copyright 2008 Richard W.M. Jones, Red Hat Inc. - http://libvirt.org/ - - 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 2 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, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - *) - -open Printf - -open Virt_mem_gettext.Gettext -open Virt_mem_utils -open Virt_mem_types - -(* -open Kernel_net_device -open Kernel_net - -let max_net_devices = 10000 - -let rec find_net_devices debug image ksymmap kernel_version = - if not (net_device_known kernel_version) then ( - eprintf (f_"%s: %s: unknown kernel version -Try a newer version of virt-mem, or if the guest is not from a -supported Linux distribution, see this page about adding support: - http://et.redhat.com/~rjones/virt-mem/faq.html\n") - image.domname kernel_version; - image, None - ) else ( - (* In kernels < ~ 2.6.22, this is a simple linked list: - * dev_base -> next -> next - * In kernels >= 2.6.23, this is a list_head: - * dev_base_head -> list_head dev_list -> ... - *) - let map = - let { field_available = available } = - field_signature_of_net_device_next kernel_version in - if available then - Some map_next - else ( - let { field_available = available } = - field_signature_of_net_device_dev_list'next kernel_version in - if available then - Some map_dev_list - else ( - eprintf (f_"%s: kernel net_device table is not linked through either next pointer or dev_list list_head. Cannot read net devices.\n") image.domname; - None - ) - ) in - - match map with - | None -> image, None - - | Some map -> - (* What is the starting point for iteration? In older kernels - * it was the symbol 'dev_base'. Then briefly (2.6.22-2.6.24) - * it became 'struct list_head dev_base_head'. Then when net - * namespaces were introduced (>= 2.6.25) it became 'struct - * list_head init_net.dev_base_head'. - *) - let addr = - try Some (Ksymmap.find "dev_base" ksymmap) - with Not_found -> - try - let addr = Ksymmap.find "dev_base_head" ksymmap in - Some addr - with Not_found -> - try - let addr = Ksymmap.find "init_net" ksymmap in - if not (net_known kernel_version) then ( - eprintf (f_"%s: struct net not available in this kernel version.\n") image.domname; - raise Not_found - ); - let { field_offset = offset } = - field_signature_of_net_dev_base_head'next kernel_version in - let addr = addr +^ Int64.of_int offset in - Some addr - with Not_found -> - eprintf (f_"%s: cannot find dev_base, dev_base_head or init_net symbols in kernel image.\n") image.domname; - None in - - match addr with - | None -> image, None - - | Some addr -> - (* Map over the structure using previously defined map function. *) - let image, netdevs = - map kernel_version image addr ( - fun netdev -> - { netdev_name = truncate_c_string netdev.net_device_name; - netdev_flags = netdev.net_device_flags; - netdev_operstate = netdev.net_device_operstate; - netdev_mtu = netdev.net_device_mtu; - netdev_perm_addr = netdev.net_device_perm_addr; - netdev_addr_len = netdev.net_device_addr_len; - } - ) in - - image, Some netdevs - ) - -(* Map dev_base_head -> list_head dev_list -> ... *) -and map_dev_list kernel_version image lh_addr f = - let { field_offset = offset } = - field_signature_of_net_device_dev_list'next kernel_version in - let lh = Virt_mem_list_head.create image lh_addr offset in - - let size = net_device_size kernel_version in - let image, lh = Virt_mem_list_head.load_all lh size in - - let net_devices, _ = - Virt_mem_list_head.fold lh ([], 0) ( - fun (net_devices, i) addr -> - if i > max_net_devices then - failwith (sprintf (f_"%s: too many network devices") image.domname); - - let net_device = get_net_device kernel_version image.mem addr in - let net_devices = f net_device :: net_devices in - (net_devices, i+1) - ) in - - image, net_devices - -(* Iterate dev_base -> next -> next ... *) -and map_next kernel_version image addr f = - let size = net_device_size kernel_version in - - let rec loop i image acc addr = - if i <= max_net_devices then ( - if addr <> 0L then ( - let mapped = Virt_mem_mmap.is_mapped_range image.mem addr size in - let image = - if not mapped then - Virt_mem_types.load_memory image addr size - else - image in - let dev = get_net_device kernel_version image.mem addr in - let acc = f dev :: acc in - let addr = - match dev.net_device_next with - | None -> assert false | Some addr -> addr in - loop (i+1) image acc addr - ) else - image, acc - ) else - failwith (sprintf (f_"%s: too many network devices") image.domname); - in - loop 0 image [] addr -*)