diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-02-24 18:18:35 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-03-04 05:51:28 +0900 |
commit | 353887831b20d0fbd500da9e9f30b048e391305f (patch) | |
tree | 1e4613ad2ace7670126ba98b8670762ee97dc97e /src/libsystemd-network/ndisc-router.c | |
parent | 61a9fa8f0cb6eb75a0d5add82b1f5e9eeb932222 (diff) | |
download | systemd-353887831b20d0fbd500da9e9f30b048e391305f.tar.gz |
libsystemd-network: make log_dhcp_client() or friends include interface name
Diffstat (limited to 'src/libsystemd-network/ndisc-router.c')
-rw-r--r-- | src/libsystemd-network/ndisc-router.c | 107 |
1 files changed, 46 insertions, 61 deletions
diff --git a/src/libsystemd-network/ndisc-router.c b/src/libsystemd-network/ndisc-router.c index c88293a923..46f30332bb 100644 --- a/src/libsystemd-network/ndisc-router.c +++ b/src/libsystemd-network/ndisc-router.c @@ -43,7 +43,7 @@ _public_ int sd_ndisc_router_from_raw(sd_ndisc_router **ret, const void *raw, si return -ENOMEM; memcpy(NDISC_ROUTER_RAW(rt), raw, raw_size); - r = ndisc_router_parse(rt); + r = ndisc_router_parse(NULL, rt); if (r < 0) return r; @@ -87,7 +87,7 @@ _public_ int sd_ndisc_router_get_raw(sd_ndisc_router *rt, const void **ret, size return 0; } -int ndisc_router_parse(sd_ndisc_router *rt) { +int ndisc_router_parse(sd_ndisc *nd, sd_ndisc_router *rt) { struct nd_router_advert *a; const uint8_t *p; bool has_mtu = false, has_flag_extension = false; @@ -95,23 +95,20 @@ int ndisc_router_parse(sd_ndisc_router *rt) { assert(rt); - if (rt->raw_size < sizeof(struct nd_router_advert)) { - log_ndisc("Too small to be a router advertisement, ignoring."); - return -EBADMSG; - } + if (rt->raw_size < sizeof(struct nd_router_advert)) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Too small to be a router advertisement, ignoring."); /* Router advertisement packets are neatly aligned to 64bit boundaries, hence we can access them directly */ a = NDISC_ROUTER_RAW(rt); - if (a->nd_ra_type != ND_ROUTER_ADVERT) { - log_ndisc("Received ND packet that is not a router advertisement, ignoring."); - return -EBADMSG; - } + if (a->nd_ra_type != ND_ROUTER_ADVERT) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Received ND packet that is not a router advertisement, ignoring."); - if (a->nd_ra_code != 0) { - log_ndisc("Received ND packet with wrong RA code, ignoring."); - return -EBADMSG; - } + if (a->nd_ra_code != 0) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Received ND packet with wrong RA code, ignoring."); rt->hop_limit = a->nd_ra_curhoplimit; rt->flags = a->nd_ra_flags_reserved; /* the first 8bit */ @@ -131,36 +128,31 @@ int ndisc_router_parse(sd_ndisc_router *rt) { if (left == 0) break; - if (left < 2) { - log_ndisc("Option lacks header, ignoring datagram."); - return -EBADMSG; - } + if (left < 2) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Option lacks header, ignoring datagram."); type = p[0]; length = p[1] * 8; - if (length == 0) { - log_ndisc("Zero-length option, ignoring datagram."); - return -EBADMSG; - } - if (left < length) { - log_ndisc("Option truncated, ignoring datagram."); - return -EBADMSG; - } + if (length == 0) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Zero-length option, ignoring datagram."); + if (left < length) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Option truncated, ignoring datagram."); switch (type) { case SD_NDISC_OPTION_PREFIX_INFORMATION: - if (length != 4*8) { - log_ndisc("Prefix option of invalid size, ignoring datagram."); - return -EBADMSG; - } + if (length != 4*8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Prefix option of invalid size, ignoring datagram."); - if (p[2] > 128) { - log_ndisc("Bad prefix length, ignoring datagram."); - return -EBADMSG; - } + if (p[2] > 128) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Bad prefix length, ignoring datagram."); break; @@ -168,14 +160,13 @@ int ndisc_router_parse(sd_ndisc_router *rt) { uint32_t m; if (has_mtu) { - log_ndisc("MTU option specified twice, ignoring."); + log_ndisc(nd, "MTU option specified twice, ignoring."); break; } - if (length != 8) { - log_ndisc("MTU option of invalid size, ignoring datagram."); - return -EBADMSG; - } + if (length != 8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "MTU option of invalid size, ignoring datagram."); m = be32toh(*(uint32_t*) (p + 4)); if (m >= IPV6_MIN_MTU) /* ignore invalidly small MTUs */ @@ -186,37 +177,32 @@ int ndisc_router_parse(sd_ndisc_router *rt) { } case SD_NDISC_OPTION_ROUTE_INFORMATION: - if (length < 1*8 || length > 3*8) { - log_ndisc("Route information option of invalid size, ignoring datagram."); - return -EBADMSG; - } + if (length < 1*8 || length > 3*8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Route information option of invalid size, ignoring datagram."); - if (p[2] > 128) { - log_ndisc("Bad route prefix length, ignoring datagram."); - return -EBADMSG; - } + if (p[2] > 128) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Bad route prefix length, ignoring datagram."); break; case SD_NDISC_OPTION_RDNSS: - if (length < 3*8 || (length % (2*8)) != 1*8) { - log_ndisc("RDNSS option has invalid size."); - return -EBADMSG; - } + if (length < 3*8 || (length % (2*8)) != 1*8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), "RDNSS option has invalid size."); break; case SD_NDISC_OPTION_FLAGS_EXTENSION: if (has_flag_extension) { - log_ndisc("Flags extension option specified twice, ignoring."); + log_ndisc(nd, "Flags extension option specified twice, ignoring."); break; } - if (length < 1*8) { - log_ndisc("Flags extension option has invalid size."); - return -EBADMSG; - } + if (length < 1*8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "Flags extension option has invalid size."); /* Add in the additional flags bits */ rt->flags |= @@ -231,10 +217,9 @@ int ndisc_router_parse(sd_ndisc_router *rt) { break; case SD_NDISC_OPTION_DNSSL: - if (length < 2*8) { - log_ndisc("DNSSL option has invalid size."); - return -EBADMSG; - } + if (length < 2*8) + return log_ndisc_errno(nd, SYNTHETIC_ERRNO(EBADMSG), + "DNSSL option has invalid size."); break; } @@ -437,7 +422,7 @@ _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret) flags = pi->nd_opt_pi_flags_reserved; if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) { - log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration."); + log_ndisc(NULL, "Invalid prefix length, ignoring prefix for stateless autoconfiguration."); flags &= ~ND_OPT_PI_FLAG_AUTO; } |