sd-ndisc: improve debugging logs

This commit is contained in:
Yu Watanabe
2024-04-17 13:02:26 +09:00
parent 31db4c1bd5
commit 238ed432c3
3 changed files with 98 additions and 21 deletions

View File

@@ -32,3 +32,6 @@ struct sd_ndisc_router {
sd_ndisc_router* ndisc_router_new(ICMP6Packet *packet);
int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt);
int ndisc_router_flags_to_string(uint64_t flags, char **ret);
const char* ndisc_router_preference_to_string(int s) _const_;

View File

@@ -10,6 +10,7 @@
#include "alloc-util.h"
#include "ndisc-internal.h"
#include "ndisc-router-internal.h"
#include "string-table.h"
static sd_ndisc_router* ndisc_router_free(sd_ndisc_router *rt) {
if (!rt)
@@ -163,6 +164,27 @@ int sd_ndisc_router_get_flags(sd_ndisc_router *rt, uint64_t *ret) {
return 0;
}
int ndisc_router_flags_to_string(uint64_t flags, char **ret) {
_cleanup_free_ char *s = NULL;
assert(ret);
if (FLAGS_SET(flags, ND_RA_FLAG_MANAGED) &&
!strextend_with_separator(&s, ", ", "managed"))
return -ENOMEM;
if (FLAGS_SET(flags, ND_RA_FLAG_OTHER) &&
!strextend_with_separator(&s, ", ", "other"))
return -ENOMEM;
if (FLAGS_SET(flags, ND_RA_FLAG_HOME_AGENT) &&
!strextend_with_separator(&s, ", ", "home-agent"))
return -ENOMEM;
*ret = TAKE_PTR(s);
return 0;
}
int sd_ndisc_router_get_lifetime(sd_ndisc_router *rt, uint64_t *ret) {
assert_return(rt, -EINVAL);
@@ -180,6 +202,14 @@ int sd_ndisc_router_get_preference(sd_ndisc_router *rt, uint8_t *ret) {
return 0;
}
static const char* const ndisc_router_preference_table[] = {
[SD_NDISC_PREFERENCE_LOW] = "low",
[SD_NDISC_PREFERENCE_MEDIUM] = "medium",
[SD_NDISC_PREFERENCE_HIGH] = "high",
};
DEFINE_STRING_TABLE_LOOKUP_TO_STRING(ndisc_router_preference, int);
int sd_ndisc_router_get_sender_mac(sd_ndisc_router *rt, struct ether_addr *ret) {
assert_return(rt, -EINVAL);

View File

@@ -221,10 +221,40 @@ static int ndisc_handle_router(sd_ndisc *nd, ICMP6Packet *packet) {
(void) event_source_disable(nd->timeout_event_source);
(void) event_source_disable(nd->timeout_no_ra);
log_ndisc(nd, "Received Router Advertisement: flags %s preference %s lifetime %s",
rt->flags & ND_RA_FLAG_MANAGED ? "MANAGED" : rt->flags & ND_RA_FLAG_OTHER ? "OTHER" : "none",
rt->preference == SD_NDISC_PREFERENCE_HIGH ? "high" : rt->preference == SD_NDISC_PREFERENCE_LOW ? "low" : "medium",
FORMAT_TIMESPAN(rt->lifetime_usec, USEC_PER_SEC));
if (DEBUG_LOGGING) {
_cleanup_free_ char *s = NULL;
struct in6_addr a;
uint64_t flags;
uint8_t pref;
usec_t lifetime;
r = sd_ndisc_router_get_sender_address(rt, &a);
if (r < 0)
return r;
r = sd_ndisc_router_get_flags(rt, &flags);
if (r < 0)
return r;
r = ndisc_router_flags_to_string(flags, &s);
if (r < 0)
return r;
r = sd_ndisc_router_get_preference(rt, &pref);
if (r < 0)
return r;
r = sd_ndisc_router_get_lifetime(rt, &lifetime);
if (r < 0)
return r;
log_ndisc(nd, "Received Router Advertisement from %s: flags=0x%0*"PRIx64"%s%s%s, preference=%s, lifetime=%s",
IN6_ADDR_TO_STRING(&a),
flags & UINT64_C(0x00ffffffffffff00) ? 14 : 2, flags, /* suppress too many zeros if no extension */
s ? " (" : "", s, s ? ")" : "",
ndisc_router_preference_to_string(pref),
FORMAT_TIMESPAN(lifetime, USEC_PER_SEC));
}
ndisc_callback(nd, SD_NDISC_EVENT_ROUTER, rt);
return 0;
@@ -232,7 +262,6 @@ static int ndisc_handle_router(sd_ndisc *nd, ICMP6Packet *packet) {
static int ndisc_handle_neighbor(sd_ndisc *nd, ICMP6Packet *packet) {
_cleanup_(sd_ndisc_neighbor_unrefp) sd_ndisc_neighbor *na = NULL;
struct in6_addr a;
int r;
assert(nd);
@@ -246,15 +275,19 @@ static int ndisc_handle_neighbor(sd_ndisc *nd, ICMP6Packet *packet) {
if (r < 0)
return r;
r = sd_ndisc_neighbor_get_sender_address(na, &a);
if (r < 0)
return r;
if (DEBUG_LOGGING) {
struct in6_addr a;
log_ndisc(nd, "Received Neighbor Advertisement from %s: Router=%s, Solicited=%s, Override=%s",
IN6_ADDR_TO_STRING(&a),
yes_no(sd_ndisc_neighbor_is_router(na) > 0),
yes_no(sd_ndisc_neighbor_is_solicited(na) > 0),
yes_no(sd_ndisc_neighbor_is_override(na) > 0));
r = sd_ndisc_neighbor_get_sender_address(na, &a);
if (r < 0)
return r;
log_ndisc(nd, "Received Neighbor Advertisement from %s: Router=%s, Solicited=%s, Override=%s",
IN6_ADDR_TO_STRING(&a),
yes_no(sd_ndisc_neighbor_is_router(na) > 0),
yes_no(sd_ndisc_neighbor_is_solicited(na) > 0),
yes_no(sd_ndisc_neighbor_is_override(na) > 0));
}
ndisc_callback(nd, SD_NDISC_EVENT_NEIGHBOR, na);
return 0;
@@ -262,7 +295,6 @@ static int ndisc_handle_neighbor(sd_ndisc *nd, ICMP6Packet *packet) {
static int ndisc_handle_redirect(sd_ndisc *nd, ICMP6Packet *packet) {
_cleanup_(sd_ndisc_redirect_unrefp) sd_ndisc_redirect *rd = NULL;
struct in6_addr a;
int r;
assert(nd);
@@ -276,14 +308,26 @@ static int ndisc_handle_redirect(sd_ndisc *nd, ICMP6Packet *packet) {
if (r < 0)
return r;
r = sd_ndisc_redirect_get_sender_address(rd, &a);
if (r < 0)
return r;
if (DEBUG_LOGGING) {
struct in6_addr sender, target, dest;
log_ndisc(nd, "Received Redirect message from %s: Target=%s, Destination=%s",
IN6_ADDR_TO_STRING(&a),
IN6_ADDR_TO_STRING(&rd->target_address),
IN6_ADDR_TO_STRING(&rd->destination_address));
r = sd_ndisc_redirect_get_sender_address(rd, &sender);
if (r < 0)
return r;
r = sd_ndisc_redirect_get_target_address(rd, &target);
if (r < 0)
return r;
r = sd_ndisc_redirect_get_destination_address(rd, &dest);
if (r < 0)
return r;
log_ndisc(nd, "Received Redirect message from %s: Target=%s, Destination=%s",
IN6_ADDR_TO_STRING(&sender),
IN6_ADDR_TO_STRING(&target),
IN6_ADDR_TO_STRING(&dest));
}
ndisc_callback(nd, SD_NDISC_EVENT_REDIRECT, rd);
return 0;