be32_t claimed_address;
sd_ipv4ll_callback_t callback;
- void* userdata;
+ void *userdata;
+
+ sd_ipv4ll_check_mac_callback_t check_mac_callback;
+ void *check_mac_userdata;
};
#define log_ipv4ll_errno(ll, error, fmt, ...) \
sd_ipv4ll_get_ifname(ll), \
0, fmt, ##__VA_ARGS__)
-static void ipv4ll_on_acd(sd_ipv4acd *ll, int event, void *userdata);
+static void ipv4ll_on_acd(sd_ipv4acd *acd, int event, void *userdata);
+static int ipv4ll_check_mac(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata);
static sd_ipv4ll *ipv4ll_free(sd_ipv4ll *ll) {
assert(ll);
if (r < 0)
return r;
+ r = sd_ipv4acd_set_check_mac_callback(ll->acd, ipv4ll_check_mac, ll);
+ if (r < 0)
+ return r;
+
*ret = TAKE_PTR(ll);
return 0;
return 0;
}
+int sd_ipv4ll_set_check_mac_callback(sd_ipv4ll *ll, sd_ipv4ll_check_mac_callback_t cb, void *userdata) {
+ assert_return(ll, -EINVAL);
+
+ ll->check_mac_callback = cb;
+ ll->check_mac_userdata = userdata;
+
+ return 0;
+}
+
int sd_ipv4ll_get_address(sd_ipv4ll *ll, struct in_addr *address) {
assert_return(ll, -EINVAL);
assert_return(address, -EINVAL);
error:
ipv4ll_client_notify(ll, SD_IPV4LL_EVENT_STOP);
}
+
+static int ipv4ll_check_mac(sd_ipv4acd *acd, const struct ether_addr *mac, void *userdata) {
+ sd_ipv4ll *ll = userdata;
+
+ assert(ll);
+
+ if (ll->check_mac_callback)
+ return ll->check_mac_callback(ll, mac, ll->check_mac_userdata);
+
+ return 0;
+}
typedef struct sd_ipv4ll sd_ipv4ll;
typedef void (*sd_ipv4ll_callback_t)(sd_ipv4ll *ll, int event, void *userdata);
+typedef int (*sd_ipv4ll_check_mac_callback_t)(sd_ipv4ll *ll, const struct ether_addr *mac, void *userdata);
int sd_ipv4ll_detach_event(sd_ipv4ll *ll);
int sd_ipv4ll_attach_event(sd_ipv4ll *ll, sd_event *event, int64_t priority);
int sd_ipv4ll_get_address(sd_ipv4ll *ll, struct in_addr *address);
int sd_ipv4ll_set_callback(sd_ipv4ll *ll, sd_ipv4ll_callback_t cb, void *userdata);
+int sd_ipv4ll_set_check_mac_callback(sd_ipv4ll *ll, sd_ipv4ll_check_mac_callback_t cb, void *userdata);
int sd_ipv4ll_set_mac(sd_ipv4ll *ll, const struct ether_addr *addr);
int sd_ipv4ll_set_ifindex(sd_ipv4ll *ll, int interface_index);
int sd_ipv4ll_get_ifindex(sd_ipv4ll *ll);