aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2021-02-23 15:41:42 -0800
committerDoug Evans <dje@google.com>2021-03-03 21:34:36 -0800
commit6a0176df1e0ed17868528e2745bfda246fbbfcce (patch)
tree053af7359d162b7f3a0d0cce0a4cecbda9200e73
parentac00ba460e101bbce0a167b4f0517378a0fbe6b8 (diff)
downloadslirp-6a0176df1e0ed17868528e2745bfda246fbbfcce.zip
slirp-6a0176df1e0ed17868528e2745bfda246fbbfcce.tar.gz
slirp-6a0176df1e0ed17868528e2745bfda246fbbfcce.tar.bz2
New API routine slirp_neighbor_info
This will be called from QEMU to dump the ARP/NDP tables. ndpentry.eth_addr type changed from unsigned char to uint8_t to be consistent with other macaddr objects. Ditto for slirp_arphdr.{ar_sha,ar_tha}. Signed-off-by: Doug Evans <dje@google.com>
-rw-r--r--src/libslirp.h3
-rw-r--r--src/libslirp.map1
-rw-r--r--src/misc.c44
-rw-r--r--src/slirp.h6
4 files changed, 50 insertions, 4 deletions
diff --git a/src/libslirp.h b/src/libslirp.h
index 4afb7d6..b52b63d 100644
--- a/src/libslirp.h
+++ b/src/libslirp.h
@@ -205,6 +205,9 @@ int slirp_remove_guestfwd(Slirp *slirp, struct in_addr guest_addr,
/* Return a human-readable state of the slirp stack */
char *slirp_connection_info(Slirp *slirp);
+/* Return a human-readable state of the NDP/ARP tables */
+char *slirp_neighbor_info(Slirp *slirp);
+
/* Save the slirp state through the write_cb. The opaque pointer is passed as
* such to the write_cb. */
void slirp_state_save(Slirp *s, SlirpWriteCb write_cb, void *opaque);
diff --git a/src/libslirp.map b/src/libslirp.map
index c0113c9..20a17ac 100644
--- a/src/libslirp.map
+++ b/src/libslirp.map
@@ -32,4 +32,5 @@ SLIRP_4.2 {
SLIRP_4.5 {
slirp_add_ipv6_hostfwd;
slirp_remove_ipv6_hostfwd;
+ slirp_neighbor_info;
} SLIRP_4.2;
diff --git a/src/misc.c b/src/misc.c
index 12487b2..48f180b 100644
--- a/src/misc.c
+++ b/src/misc.c
@@ -377,6 +377,48 @@ char *slirp_connection_info(Slirp *slirp)
return g_string_free(str, FALSE);
}
+char *slirp_neighbor_info(Slirp *slirp)
+{
+ GString *str = g_string_new(NULL);
+ ArpTable *arp_table = &slirp->arp_table;
+ NdpTable *ndp_table = &slirp->ndp_table;
+ char ip_addr[INET6_ADDRSTRLEN];
+ char eth_addr[ETH_ADDRSTRLEN];
+ const char *ip;
+
+ g_string_append_printf(str, " %5s %-17s %s\n",
+ "Table", "MacAddr", "IP Address");
+
+ for (int i = 0; i < ARP_TABLE_SIZE; ++i) {
+ struct in_addr addr;
+ addr.s_addr = arp_table->table[i].ar_sip;
+ if (!addr.s_addr) {
+ continue;
+ }
+ ip = inet_ntop(AF_INET, &addr, ip_addr, sizeof(ip_addr));
+ g_assert(ip != NULL);
+ g_string_append_printf(str, " %5s %-17s %s\n", "ARP",
+ slirp_ether_ntoa(arp_table->table[i].ar_sha,
+ eth_addr, sizeof(eth_addr)),
+ ip);
+ }
+
+ for (int i = 0; i < NDP_TABLE_SIZE; ++i) {
+ if (in6_zero(&ndp_table->table[i].ip_addr)) {
+ continue;
+ }
+ ip = inet_ntop(AF_INET6, &ndp_table->table[i].ip_addr, ip_addr,
+ sizeof(ip_addr));
+ g_assert(ip != NULL);
+ g_string_append_printf(str, " %5s %-17s %s\n", "NDP",
+ slirp_ether_ntoa(ndp_table->table[i].eth_addr,
+ eth_addr, sizeof(eth_addr)),
+ ip);
+ }
+
+ return g_string_free(str, FALSE);
+}
+
int slirp_bind_outbound(struct socket *so, unsigned short af)
{
int ret = 0;
@@ -395,4 +437,4 @@ int slirp_bind_outbound(struct socket *so, unsigned short af)
ret = bind(so->s, addr, addr_size);
}
return ret;
-} \ No newline at end of file
+}
diff --git a/src/slirp.h b/src/slirp.h
index 4f8b133..80f6ac6 100644
--- a/src/slirp.h
+++ b/src/slirp.h
@@ -85,9 +85,9 @@ struct slirp_arphdr {
/*
* Ethernet looks like this : This bit is variable sized however...
*/
- unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */
+ uint8_t ar_sha[ETH_ALEN]; /* sender hardware address */
uint32_t ar_sip; /* sender IP address */
- unsigned char ar_tha[ETH_ALEN]; /* target hardware address */
+ uint8_t ar_tha[ETH_ALEN]; /* target hardware address */
uint32_t ar_tip; /* target IP address */
} SLIRP_PACKED;
@@ -105,7 +105,7 @@ bool arp_table_search(Slirp *slirp, uint32_t ip_addr,
uint8_t out_ethaddr[ETH_ALEN]);
struct ndpentry {
- unsigned char eth_addr[ETH_ALEN]; /* sender hardware address */
+ uint8_t eth_addr[ETH_ALEN]; /* sender hardware address */
struct in6_addr ip_addr; /* sender IP address */
};