int config_parse_quickack(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { _cleanup_route_free_ Route *n = NULL; Network *network = userdata; int k, r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; k = parse_boolean(rvalue); if (k < 0) { log_syntax(unit, LOG_ERR, filename, line, k, "Failed to parse TCP quickack, ignoring: %s", rvalue); return 0; } n->quickack = !!k; n = NULL; return 0; }
int config_parse_route_priority(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; r = config_parse_unsigned(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &n->metrics, userdata); if (r < 0) return r; n = NULL; return 0; }
int config_parse_ipv6_route_preference(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; if (streq(rvalue, "low")) n->pref = ICMPV6_ROUTER_PREF_LOW; else if (streq(rvalue, "medium")) n->pref = ICMPV6_ROUTER_PREF_MEDIUM; else if (streq(rvalue, "high")) n->pref = ICMPV6_ROUTER_PREF_HIGH; else { log_syntax(unit, LOG_ERR, filename, line, 0, "Unknown route preference: %s", rvalue); return 0; } n = NULL; return 0; }
int config_parse_route_type(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; if (streq(rvalue, "unicast")) n->type = RTN_UNICAST; else if (streq(rvalue, "blackhole")) n->type = RTN_BLACKHOLE; else if (streq(rvalue, "unreachable")) n->type = RTN_UNREACHABLE; else if (streq(rvalue, "prohibit")) n->type = RTN_PROHIBIT; else { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse route type \"%s\", ignoring assignment: %m", rvalue); return 0; } n = NULL; return 0; }
int config_parse_gateway(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; union in_addr_union buffer; int r, f; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); if (streq(section, "Network")) { /* we are not in an Route section, so treat * this as the special '0' section */ r = route_new_static(network, NULL, 0, &n); } else r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; r = in_addr_from_string_auto(rvalue, &f, &buffer); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Route is invalid, ignoring assignment: %s", rvalue); return 0; } n->family = f; n->gw = buffer; n = NULL; return 0; }
int config_parse_destination(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; union in_addr_union buffer; unsigned char prefixlen; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; r = in_addr_prefix_from_string(rvalue, AF_INET, &buffer, &prefixlen); if (r < 0) { r = in_addr_prefix_from_string(rvalue, AF_INET6, &buffer, &prefixlen); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Route %s= prefix is invalid, ignoring assignment: %s", lvalue, rvalue); return 0; } n->family = AF_INET6; } else n->family = AF_INET; if (streq(lvalue, "Destination")) { n->dst = buffer; n->dst_prefixlen = prefixlen; } else if (streq(lvalue, "Source")) { n->src = buffer; n->src_prefixlen = prefixlen; } else assert_not_reached(lvalue); n = NULL; return 0; }
int config_parse_tcp_window(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { _cleanup_route_free_ Route *n = NULL; Network *network = userdata; uint64_t k; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; r = parse_size(rvalue, 1024, &k); if (r < 0 || k > UINT32_MAX) { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse TCP %s \"%s\" bytes, ignoring assignment: %m", rvalue, lvalue); return 0; } if (streq(lvalue, "InitialCongestionWindow")) n->initcwnd = k; else if (streq(lvalue, "InitialAdvertisedReceiveWindow")) n->initrwnd = k; else { log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse TCP %s: %s", lvalue, rvalue); return 0; } n = NULL; return 0; }
int config_parse_gateway(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; _cleanup_free_ char *route = NULL; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); if (streq(section, "Network")) { /* we are not in an Route section, so treat * this as the special '0' section */ section_line = 0; } r = route_new_static(network, section_line, &n); if (r < 0) return r; r = net_parse_inaddr(rvalue, &n->family, &n->in_addr); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Route is invalid, ignoring assignment: %s", route); return 0; } n = NULL; return 0; }
int config_parse_route_scope(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; if (streq(rvalue, "host")) n->scope = RT_SCOPE_HOST; else if (streq(rvalue, "link")) n->scope = RT_SCOPE_LINK; else if (streq(rvalue, "global")) n->scope = RT_SCOPE_UNIVERSE; else { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Unknown route scope: %s", rvalue); return 0; } n = NULL; return 0; }
int config_parse_preferred_src(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; union in_addr_union buffer; int r, f; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; r = in_addr_from_string_auto(rvalue, &f, &buffer); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Preferred source is invalid, ignoring assignment: %s", rvalue); return 0; } n->family = f; n->prefsrc = buffer; n = NULL; return 0; }
int config_parse_route_table(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { _cleanup_route_free_ Route *n = NULL; Network *network = userdata; uint32_t k; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; r = safe_atou32(rvalue, &k); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse route table number \"%s\", ignoring assignment: %m", rvalue); return 0; } n->table = k; n = NULL; return 0; }
int config_parse_gateway_onlink(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; r = parse_boolean(rvalue); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse gateway onlink \"%s\", ignoring assignment: %m", rvalue); return 0; } SET_FLAG(n->flags, RTNH_F_ONLINK, r); n = NULL; return 0; }
int config_parse_route_protocol(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; int r; r = route_new_static(network, filename, section_line, &n); if (r < 0) return r; if (streq(rvalue, "kernel")) n->protocol = RTPROT_KERNEL; else if (streq(rvalue, "boot")) n->protocol = RTPROT_BOOT; else if (streq(rvalue, "static")) n->protocol = RTPROT_STATIC; else { r = safe_atou8(rvalue , &n->protocol); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Could not parse route protocol \"%s\", ignoring assignment: %m", rvalue); return 0; } } n = NULL; return 0; }
int config_parse_destination(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; const char *address, *e; union in_addr_union buffer; unsigned char prefixlen; int r, f; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; /* Destination|Source=address/prefixlen */ /* address */ e = strchr(rvalue, '/'); if (e) address = strndupa(rvalue, e - rvalue); else address = rvalue; r = in_addr_from_string_auto(address, &f, &buffer); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Destination is invalid, ignoring assignment: %s", address); return 0; } if (f != AF_INET && f != AF_INET6) { log_syntax(unit, LOG_ERR, filename, line, 0, "Unknown address family, ignoring assignment: %s", address); return 0; } /* prefixlen */ if (e) { r = safe_atou8(e + 1, &prefixlen); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, r, "Route destination prefix length is invalid, ignoring assignment: %s", e + 1); return 0; } } else { switch (f) { case AF_INET: prefixlen = 32; break; case AF_INET6: prefixlen = 128; break; } } n->family = f; if (streq(lvalue, "Destination")) { n->dst_addr = buffer; n->dst_prefixlen = prefixlen; } else if (streq(lvalue, "Source")) { n->src_addr = buffer; n->src_prefixlen = prefixlen; } else assert_not_reached(lvalue); n = NULL; return 0; }
int config_parse_destination(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata) { Network *network = userdata; _cleanup_route_free_ Route *n = NULL; _cleanup_free_ char *address = NULL; const char *e; int r; assert(filename); assert(section); assert(lvalue); assert(rvalue); assert(data); r = route_new_static(network, section_line, &n); if (r < 0) return r; /* Destination=address/prefixlen */ /* address */ e = strchr(rvalue, '/'); if (e) { address = strndup(rvalue, e - rvalue); if (!address) return log_oom(); } else { address = strdup(rvalue); if (!address) return log_oom(); } r = net_parse_inaddr(address, &n->family, &n->dst_addr); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Destination is invalid, ignoring assignment: %s", address); return 0; } /* prefixlen */ if (e) { unsigned i; r = safe_atou(e + 1, &i); if (r < 0) { log_syntax(unit, LOG_ERR, filename, line, EINVAL, "Route destination prefix length is invalid, " "ignoring assignment: %s", e + 1); return 0; } n->dst_prefixlen = (unsigned char) i; } else { switch (n->family) { case AF_INET: n->dst_prefixlen = 32; break; case AF_INET6: n->dst_prefixlen = 128; break; } } n = NULL; return 0; }