sd_event *event;
int event_priority;
+ struct in6_addr link_local_addr;
struct ether_addr mac_addr;
sd_event_source *recv_event_source;
return 0;
}
+int sd_ndisc_set_link_local_address(sd_ndisc *nd, const struct in6_addr *addr) {
+ assert_return(nd, -EINVAL);
+ assert_return(!addr || in6_addr_is_link_local(addr), -EINVAL);
+
+ if (addr)
+ nd->link_local_addr = *addr;
+ else
+ zero(nd->link_local_addr);
+
+ return 0;
+}
+
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr) {
assert_return(nd, -EINVAL);
return 0;
}
+ if (in6_addr_equal(&packet->sender_address, &nd->link_local_addr)) {
+ log_ndisc(nd, "Received an ICMPv6 packet sent by the same interface, ignoring.");
+ return 0;
+ }
+
r = icmp6_packet_get_type(packet);
if (r < 0) {
log_ndisc_errno(nd, r, "Received an invalid ICMPv6 packet, ignoring: %m");
if (r < 0)
return log_link_warning_errno(link, r, "Failed to get gateway address from RA: %m");
- if (link_get_ipv6_address(link, &gateway, 0, NULL) >= 0) {
- if (DEBUG_LOGGING)
- log_link_debug(link, "No NDisc route added, gateway %s matches local address",
- IN6_ADDR_TO_STRING(&gateway));
- return 0;
- }
-
r = sd_ndisc_router_get_preference(rt, &preference);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to get router preference from RA: %m");
if (in6_addr_is_null(&link->ipv6ll_address))
return 0;
+ r = sd_ndisc_set_link_local_address(link->ndisc, &link->ipv6ll_address);
+ if (r < 0)
+ return r;
+
log_link_debug(link, "Discovering IPv6 routers");
r = sd_ndisc_start(link->ndisc);
int sd_ndisc_set_ifindex(sd_ndisc *nd, int interface_index);
int sd_ndisc_set_ifname(sd_ndisc *nd, const char *interface_name);
int sd_ndisc_get_ifname(sd_ndisc *nd, const char **ret);
+int sd_ndisc_set_link_local_address(sd_ndisc *nd, const struct in6_addr *addr);
int sd_ndisc_set_mac(sd_ndisc *nd, const struct ether_addr *mac_addr);
_SD_END_DECLARATIONS;