[Crash-utility] [PATCH] crash: add dev_base_head support for net command
Dave Anderson
anderson at redhat.com
Mon Mar 17 14:14:25 UTC 2008
Eugene Teo wrote:
> Hi Dave,
>
> I found that the net command in crash 4.0-6.1 does not work with Fedora
> kernel 2.6.23.14-115.fc8. There was a rework on dev_base[1] to replace
> the use of dev_base variable, and dev->next pointer with for_each_netdev
> loop. This patch fixes this problem.
>
Thanks Eugene -- queued for the next release.
BTW, the patch looks to have a short shelf-life. In 2.6.24, the
new dev_base_head list_head that your patch looks for no longer
exists. So for now I've also updated the error message in
show_net_devices() to complain if both dev_base and dev_base_head
don't exist.
I'll update the TODO list with the newer net command issue
if anybody wants to take a shot at fixing it.
Thanks,
Dave
> $ uname -rm
> 2.6.23.14-115.fc8 i686
> $ sudo ./crash
> [...]
> crash> net
> net: dev_base does not exist!
>
> With the patch,
>
> $ sudo ./crash
> [...]
> crash> net
> NET_DEVICE NAME IP ADDRESS(ES)
> c0714480 lo 127.0.0.1
> f7031000 wmaster0
> f7031800 wlan0
> f775c000 eth0 a.b.c.d
> f6d3a000 redhat0 w.x.y.z
>
> [1] linux-2.6 commit: 7562f876cd93800f2f8c89445f2a563590b24e09
> [NET]: Rework dev_base via list_head (v3)
>
> Signed-off-by: Eugene Teo <eugeneteo at kernel.sg>
>
> diff -uprN crash-4.0-6.1.default/defs.h crash-4.0-6.1/defs.h
> --- crash-4.0-6.1.default/defs.h 2008-02-29 00:09:10.000000000 +0800
> +++ crash-4.0-6.1/defs.h 2008-03-16 13:51:32.000000000 +0800
> @@ -1234,6 +1234,7 @@ struct offset_table {
> long net_device_type;
> long net_device_addr_len;
> long net_device_ip_ptr;
> + long net_device_dev_list;
> long device_next;
> long device_name;
> long device_type;
> diff -uprN crash-4.0-6.1.default/net.c crash-4.0-6.1/net.c
> --- crash-4.0-6.1.default/net.c 2008-02-29 00:09:10.000000000 +0800
> +++ crash-4.0-6.1/net.c 2008-03-16 14:01:39.000000000 +0800
> @@ -65,6 +65,7 @@ struct devinfo {
> #define BYTES_IP_TUPLE (BYTES_IP_ADDR + BYTES_PORT_NUM + 1)
>
> static void show_net_devices(void);
> +static void show_net_devices_v2(void);
> static void print_neighbour_q(ulong, int);
> static void get_netdev_info(ulong, struct devinfo *);
> static void get_device_name(ulong, char *);
> @@ -111,6 +112,7 @@ net_init(void)
> "net_device", "addr_len");
> net->dev_ip_ptr = MEMBER_OFFSET_INIT(net_device_ip_ptr,
> "net_device", "ip_ptr");
> + MEMBER_OFFSET_INIT(net_device_dev_list, "net_device", "dev_list");
> ARRAY_LENGTH_INIT(net->net_device_name_index,
> net_device_name, "net_device.name", NULL, sizeof(char));
> net->flags |= (NETDEV_INIT|STRUCT_NET_DEVICE);
> @@ -355,6 +357,11 @@ show_net_devices(void)
> long flen;
> char buf[BUFSIZE];
>
> + if (symbol_exists("dev_base_head")) {
> + show_net_devices_v2();
> + return;
> + }
> +
> if (!symbol_exists("dev_base"))
> error(FATAL, "dev_base does not exist!\n");
>
> @@ -384,6 +391,58 @@ show_net_devices(void)
> } while (next);
> }
>
> +static void
> +show_net_devices_v2(void)
> +{
> + struct list_data list_data, *ld;
> + char *net_device_buf;
> + char buf[BUFSIZE];
> + ulong *ndevlist;
> + int ndevcnt, i;
> + long flen;
> +
> + if (!net->netdevice) /* initialized in net_init() */
> + return;
> +
> + flen = MAX(VADDR_PRLEN, strlen(net->netdevice));
> +
> + fprintf(fp, "%s NAME IP ADDRESS(ES)\n",
> + mkstring(upper_case(net->netdevice, buf),
> + flen, CENTER|LJUST, NULL));
> +
> + net_device_buf = GETBUF(SIZE(net_device));
> +
> + ld = &list_data;
> + BZERO(ld, sizeof(struct list_data));
> + get_symbol_data("dev_base_head", sizeof(void *), &ld->start);
> + ld->end = symbol_value("dev_base_head");
> + ld->list_head_offset = OFFSET(net_device_dev_list);
> +
> + hq_open();
> + ndevcnt = do_list(ld);
> + ndevlist = (ulong *)GETBUF(ndevcnt * sizeof(ulong));
> + ndevcnt = retrieve_list(ndevlist, ndevcnt);
> + hq_close();
> +
> + for (i = 0; i < ndevcnt; ++i) {
> + readmem(ndevlist[i], KVADDR, net_device_buf,
> + SIZE(net_device), "net_device buffer",
> + FAULT_ON_ERROR);
> +
> + fprintf(fp, "%s ",
> + mkstring(buf, flen, CENTER|RJUST|LONG_HEX,
> + MKSTR(ndevlist[i])));
> +
> + get_device_name(ndevlist[i], buf);
> + fprintf(fp, "%-6s ", buf);
> +
> + get_device_address(ndevlist[i], buf);
> + fprintf(fp, "%s\n", buf);
> + }
> +
> + FREEBUF(ndevlist);
> + FREEBUF(net_device_buf);
> +}
>
> /*
> * Perform the actual work of dumping the ARP table...
>
> --
> Crash-utility mailing list
> Crash-utility at redhat.com
> https://www.redhat.com/mailman/listinfo/crash-utility
More information about the Crash-utility
mailing list