diff options
author | Doug Evans <dje@google.com> | 2021-02-23 15:41:42 -0800 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2021-03-03 21:34:36 -0800 |
commit | 6a0176df1e0ed17868528e2745bfda246fbbfcce (patch) | |
tree | 053af7359d162b7f3a0d0cce0a4cecbda9200e73 | |
parent | ac00ba460e101bbce0a167b4f0517378a0fbe6b8 (diff) | |
download | slirp-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.h | 3 | ||||
-rw-r--r-- | src/libslirp.map | 1 | ||||
-rw-r--r-- | src/misc.c | 44 | ||||
-rw-r--r-- | src/slirp.h | 6 |
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; @@ -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 */ }; |