static int parse_encap_ip6(struct rtattr *rta, size_t len, int *argcp, char ***argvp) { int id_ok = 0, dst_ok = 0, tos_ok = 0, ttl_ok = 0; char **argv = *argvp; int argc = *argcp; while (argc > 0) { if (strcmp(*argv, "id") == 0) { __u64 id; NEXT_ARG(); if (id_ok++) duparg2("id", *argv); if (get_be64(&id, *argv, 0)) invarg("\"id\" value is invalid\n", *argv); rta_addattr64(rta, len, LWTUNNEL_IP6_ID, id); } else if (strcmp(*argv, "dst") == 0) { inet_prefix addr; NEXT_ARG(); if (dst_ok++) duparg2("dst", *argv); get_addr(&addr, *argv, AF_INET6); rta_addattr_l(rta, len, LWTUNNEL_IP6_DST, &addr.data, addr.bytelen); } else if (strcmp(*argv, "tc") == 0) { __u32 tc; NEXT_ARG(); if (tos_ok++) duparg2("tc", *argv); if (rtnl_dsfield_a2n(&tc, *argv)) invarg("\"tc\" value is invalid\n", *argv); rta_addattr8(rta, len, LWTUNNEL_IP6_TC, tc); } else if (strcmp(*argv, "hoplimit") == 0) { __u8 hoplimit; NEXT_ARG(); if (ttl_ok++) duparg2("hoplimit", *argv); if (get_u8(&hoplimit, *argv, 0)) invarg("\"hoplimit\" value is invalid\n", *argv); rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT, hoplimit); } else { break; } argc--; argv++; } /* argv is currently the first unparsed argument, * but the lwt_parse_encap() caller will move to the next, * so step back */ *argcp = argc + 1; *argvp = argv - 1; return 0; }
static void add_encap_ip6(struct rtattr *rta, size_t len, const encap_t *encap) { if (encap->flags & IPROUTE_BIT_ENCAP_ID) rta_addattr64(rta, len, LWTUNNEL_IP6_ID, htonll(encap->ip6.id)); if (encap->ip6.dst) rta_addattr_l(rta, len, LWTUNNEL_IP6_DST, &encap->ip6.dst->u.sin6_addr, sizeof(encap->ip6.dst->u.sin6_addr)); if (encap->ip6.src) rta_addattr_l(rta, len, LWTUNNEL_IP6_SRC, &encap->ip6.src->u.sin6_addr, sizeof(encap->ip6.src->u.sin6_addr)); if (encap->flags & IPROUTE_BIT_ENCAP_DSFIELD) rta_addattr8(rta, len, LWTUNNEL_IP6_TC, encap->ip6.tc); if (encap->flags & IPROUTE_BIT_ENCAP_HOPLIMIT) rta_addattr8(rta, len, LWTUNNEL_IP6_HOPLIMIT, encap->ip6.hoplimit); if (encap->flags & IPROUTE_BIT_ENCAP_FLAGS) rta_addattr16(rta, len, LWTUNNEL_IP6_FLAGS, encap->ip6.flags); }
static void add_encap_ip(struct rtattr *rta, size_t len, const encap_t *encap) { if (encap->flags & IPROUTE_BIT_ENCAP_ID) rta_addattr64(rta, len, LWTUNNEL_IP_ID, htonll(encap->ip.id)); if (encap->ip.dst) rta_addattr_l(rta, len, LWTUNNEL_IP_DST, &encap->ip.dst->u.sin.sin_addr.s_addr, sizeof(encap->ip.dst->u.sin.sin_addr.s_addr)); if (encap->ip.src) rta_addattr_l(rta, len, LWTUNNEL_IP_SRC, &encap->ip.src->u.sin.sin_addr.s_addr, sizeof(encap->ip.src->u.sin.sin_addr.s_addr)); if (encap->flags & IPROUTE_BIT_ENCAP_DSFIELD) rta_addattr8(rta, len, LWTUNNEL_IP_TOS, encap->ip.tos); if (encap->flags & IPROUTE_BIT_ENCAP_HOPLIMIT) rta_addattr8(rta, len, LWTUNNEL_IP_TTL, encap->ip.ttl); if (encap->flags & IPROUTE_BIT_ENCAP_FLAGS) rta_addattr16(rta, len, LWTUNNEL_IP_FLAGS, encap->ip.flags); }
static int parse_encap_ila(struct rtattr *rta, size_t len, int *argcp, char ***argvp) { __u64 locator; int argc = *argcp; char **argv = *argvp; if (get_addr64(&locator, *argv) < 0) { fprintf(stderr, "Bad locator: %s\n", *argv); exit(1); } argc--; argv++; rta_addattr64(rta, 1024, ILA_ATTR_LOCATOR, locator); while (argc > 0) { if (strcmp(*argv, "csum-mode") == 0) { __u8 csum_mode; NEXT_ARG(); csum_mode = ila_csum_name2mode(*argv); if (csum_mode < 0) invarg("\"csum-mode\" value is invalid\n", *argv); rta_addattr8(rta, 1024, ILA_ATTR_CSUM_MODE, csum_mode); argc--; argv++; } else { break; } } /* argv is currently the first unparsed argument, * but the lwt_parse_encap() caller will move to the next, * so step back */ *argcp = argc + 1; *argvp = argv - 1; return 0; }
static void add_encap_ila(struct rtattr *rta, size_t len, const encap_t *encap) { rta_addattr64(rta, len, ILA_ATTR_LOCATOR, encap->ila.locator); }