return false;
}
-static bool link_is_neighbor_configured(Link *link, Neighbor *neighbor) {
- Neighbor *net_neighbor;
-
- assert(link);
- assert(neighbor);
-
- if (!link->network)
- return false;
-
- HASHMAP_FOREACH(net_neighbor, link->network->neighbors_by_section)
- if (neighbor_equal(net_neighbor, neighbor))
- return true;
-
- return false;
-}
-
static bool link_is_static_route_configured(Link *link, Route *route) {
Route *net_route;
static int link_drop_foreign_config(Link *link) {
Address *address;
- Neighbor *neighbor;
Route *route;
int r;
}
}
- SET_FOREACH(neighbor, link->neighbors_foreign) {
- if (link_is_neighbor_configured(link, neighbor)) {
- r = neighbor_add(link, neighbor, NULL);
- if (r < 0)
- return r;
- } else {
- r = neighbor_remove(neighbor, link);
- if (r < 0)
- return r;
- }
- }
+ r = link_drop_foreign_neighbors(link);
+ if (r < 0)
+ return r;
SET_FOREACH(route, link->routes_foreign) {
/* do not touch routes managed by the kernel */
static int link_drop_config(Link *link) {
Address *address, *pool_address;
- Neighbor *neighbor;
Route *route;
int r;
}
}
- SET_FOREACH(neighbor, link->neighbors) {
- r = neighbor_remove(neighbor, link);
- if (r < 0)
- return r;
- }
+ r = link_drop_neighbors(link);
+ if (r < 0)
+ return r;
SET_FOREACH(route, link->routes) {
/* do not touch routes managed by the kernel */
return 0;
}
-int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret) {
+static int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret) {
Neighbor *neighbor;
int r;
return neighbor_add_internal(link, &link->neighbors_foreign, in, ret);
}
-bool neighbor_equal(const Neighbor *n1, const Neighbor *n2) {
+static bool neighbor_equal(const Neighbor *n1, const Neighbor *n2) {
if (n1 == n2)
return true;
return 1;
}
-int neighbor_remove(Neighbor *neighbor, Link *link) {
+static int neighbor_remove(Neighbor *neighbor, Link *link) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
int r;
return 0;
}
+static bool link_is_neighbor_configured(Link *link, Neighbor *neighbor) {
+ Neighbor *net_neighbor;
+
+ assert(link);
+ assert(neighbor);
+
+ if (!link->network)
+ return false;
+
+ HASHMAP_FOREACH(net_neighbor, link->network->neighbors_by_section)
+ if (neighbor_equal(net_neighbor, neighbor))
+ return true;
+
+ return false;
+}
+
+int link_drop_foreign_neighbors(Link *link) {
+ Neighbor *neighbor;
+ int r;
+
+ assert(link);
+
+ SET_FOREACH(neighbor, link->neighbors_foreign)
+ if (link_is_neighbor_configured(link, neighbor)) {
+ r = neighbor_add(link, neighbor, NULL);
+ if (r < 0)
+ return r;
+ } else {
+ r = neighbor_remove(neighbor, link);
+ if (r < 0)
+ return r;
+ }
+
+ return 0;
+}
+
+int link_drop_neighbors(Link *link) {
+ Neighbor *neighbor;
+ int k, r = 0;
+
+ assert(link);
+
+ SET_FOREACH(neighbor, link->neighbors) {
+ k = neighbor_remove(neighbor, link);
+ if (k < 0 && r >= 0)
+ r = k;
+ }
+
+ return r;
+}
+
static int manager_rtnl_process_neighbor_lladdr(sd_netlink_message *message, union lladdr_union *lladdr, size_t *size, char **str) {
int r;
void neighbor_free(Neighbor *neighbor);
int neighbor_section_verify(Neighbor *neighbor);
-int neighbor_remove(Neighbor *neighbor, Link *link);
-
-int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret);
-bool neighbor_equal(const Neighbor *n1, const Neighbor *n2);
-
int link_set_neighbors(Link *link);
+int link_drop_neighbors(Link *link);
+int link_drop_foreign_neighbors(Link *link);
int manager_rtnl_process_neighbor(sd_netlink *rtnl, sd_netlink_message *message, Manager *m);