int parse_val(int *argc_p, char ***argv_p, __u32 * val, int type) { int argc = *argc_p; char **argv = *argv_p; if (argc <= 0) return -1; if (TINT == type) return get_integer((int *) val, *argv, 0); if (TU32 == type) return get_u32(val, *argv, 0); if (TIPV4 == type) { inet_prefix addr; if (get_prefix_1(&addr, *argv, AF_INET)) { return -1; } *val=addr.data[0]; return 0; } if (TIPV6 == type) { /* not implemented yet */ return -1; } return -1; }
static int parse_ip_addr(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, int off) { int res = -1; int argc = *argc_p; char **argv = *argv_p; inet_prefix addr; __u32 mask; int offmask = 0; if (argc < 1) return -1; if (get_prefix_1(&addr, *argv, AF_INET)) return -1; argc--; argv++; if (argc > 0 && strcmp(argv[0], "at") == 0) { NEXT_ARG(); if (parse_at(&argc, &argv, &off, &offmask)) return -1; } mask = 0; if (addr.bitlen) mask = htonl(0xFFFFFFFF << (32 - addr.bitlen)); if (pack_key(sel, addr.data[0], mask, off, offmask) < 0) return -1; res = 0; *argc_p = argc; *argv_p = argv; return res; }
void get_prefix(inet_prefix *dst, char *arg, int family) { if (family == AF_PACKET) { bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix"); } get_prefix_1(dst, arg, family); }
/* Calls get_prefix_1 to parse inet addr from arg to an inet_prefix */ int get_prefix(inet_prefix *dst, const char *arg, int family) { int err; if ((err = get_prefix_1(dst, arg, family))) { fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", arg); } return err; }
int get_prefix(inet_prefix *dst, char *arg, int family) { if (get_prefix_1(dst, arg, family)) { fprintf(stderr, _("ip: %s is invalid inet prefix\n"), arg); exit(1); } return 0; }
static int parse_val(int *argc_p, char ***argv_p, __u32 *val, int type) { int argc = *argc_p; char **argv = *argv_p; if (argc <= 0) return -1; if (type == TINT) return get_integer((int *)val, *argv, 0); if (type == TU32) return get_u32(val, *argv, 0); if (type == TIPV4) { inet_prefix addr; if (get_prefix_1(&addr, *argv, AF_INET)) return -1; *val = addr.data[0]; return 0; } if (type == TIPV6) { inet_prefix addr; if (get_prefix_1(&addr, *argv, AF_INET6)) return -1; memcpy(val, addr.data, addr.bytelen); return 0; } if (type == TMAC) { #define MAC_ALEN 6 int ret = ll_addr_a2n((char *)val, MAC_ALEN, *argv); if (ret == MAC_ALEN) return 0; } return -1; }
int get_prefix(inet_prefix *dst, char *arg, int family) { if (family == AF_PACKET) { bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix"); } if (get_prefix_1(dst, arg, family)) { bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg); } return 0; }
int get_prefix(inet_prefix *dst, char *arg, int family) { if (family == AF_PACKET) { fprintf(stderr, "Error: \"%s\" may be inet prefix, but it is not allowed in this context.\n", arg); exit(1); } if (get_prefix_1(dst, arg, family)) { fprintf(stderr, "Error: an inet prefix is expected rather than \"%s\".\n", arg); exit(1); } return 0; }
static int parse_nat_args(int *argc_p, char ***argv_p,struct tc_nat *sel) { int argc = *argc_p; char **argv = *argv_p; inet_prefix addr; if (argc <= 0) return -1; if (matches(*argv, "egress") == 0) sel->flags |= TCA_NAT_FLAG_EGRESS; else if (matches(*argv, "ingress") != 0) goto bad_val; NEXT_ARG(); if (get_prefix_1(&addr, *argv, AF_INET)) goto bad_val; sel->old_addr = addr.data[0]; sel->mask = htonl(~0u << (32 - addr.bitlen)); NEXT_ARG(); if (get_prefix_1(&addr, *argv, AF_INET)) goto bad_val; sel->new_addr = addr.data[0]; argc--; argv++; *argc_p = argc; *argv_p = argv; return 0; bad_val: return -1; }
static int parse_ip6_addr(int *argc_p, char ***argv_p, struct tc_u32_sel *sel, int off) { int res = -1; int argc = *argc_p; char **argv = *argv_p; int plen = 128; int i; inet_prefix addr; int offmask = 0; if (argc < 1) return -1; if (get_prefix_1(&addr, *argv, AF_INET6)) return -1; argc--; argv++; if (argc > 0 && strcmp(argv[0], "at") == 0) { NEXT_ARG(); if (parse_at(&argc, &argv, &off, &offmask)) return -1; } plen = addr.bitlen; for (i = 0; i < plen; i += 32) { /* if (((i + 31) & ~0x1F) <= plen) { */ if (i + 31 <= plen) { res = pack_key(sel, addr.data[i / 32], 0xFFFFFFFF, off + 4 * (i / 32), offmask); if (res < 0) return -1; } else if (i < plen) { __u32 mask = htonl(0xFFFFFFFF << (32 - (plen - i))); res = pack_key(sel, addr.data[i / 32], mask, off + 4 * (i / 32), offmask); if (res < 0) return -1; } } res = 0; *argc_p = argc; *argv_p = argv; return res; }
/** * adds, updates or deletes addresses to interface * * @param addr * @param ifacename * @param prefixLen * @param preferred * @param valid * @param mode - 0-delete, 1-add, 2-update * * @return */ int ipaddr_add_or_del(const char * addr, const char *ifacename, int prefixLen, unsigned long preferred, unsigned long valid, int mode) { struct rtnl_handle rth; struct { struct nlmsghdr n; struct ifaddrmsg ifa; char buf[256]; } req; inet_prefix lcl; /* inet_prefix peer; */ int local_len = 0; int peer_len = 0; int scoped = 0; struct ifa_cacheinfo ci; #ifdef LOWLEVEL_DEBUG printf("### iface=%s, addr=%s, add=%d ###\n", ifacename, addr, add); #endif memset(&req, 0, sizeof(req)); req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifaddrmsg)); switch (mode) { case ADDROPER_DEL: req.n.nlmsg_type = RTM_DELADDR; /* del address */ req.n.nlmsg_flags = NLM_F_REQUEST; break; case ADDROPER_ADD: req.n.nlmsg_type = RTM_NEWADDR; /* add address */ req.n.nlmsg_flags = NLM_F_REQUEST |NLM_F_CREATE|NLM_F_EXCL; break; case ADDROPER_UPDATE: req.n.nlmsg_type = RTM_NEWADDR; /* update address */ req.n.nlmsg_flags = NLM_F_REQUEST | NLM_F_REPLACE; break; } req.ifa.ifa_family = AF_INET6; req.ifa.ifa_flags = 0; req.ifa.ifa_prefixlen = prefixLen; get_prefix_1(&lcl, (char*)addr, AF_INET6); addattr_l(&req.n, sizeof(req), IFA_LOCAL, &lcl.data, lcl.bytelen); local_len = lcl.bytelen; memset(&ci, 0, sizeof(ci)); ci.ifa_valid = valid; ci.ifa_prefered = preferred; addattr_l(&req.n, sizeof(req), IFA_CACHEINFO, &ci, sizeof(ci)); if (peer_len == 0 && local_len) { /* peer = lcl; */ addattr_l(&req.n, sizeof(req), IFA_ADDRESS, &lcl.data, lcl.bytelen); } if (req.ifa.ifa_prefixlen == 0) req.ifa.ifa_prefixlen = lcl.bitlen; if (!scoped) req.ifa.ifa_scope = default_scope(&lcl); rtnl_open(&rth, 0); ll_init_map(&rth); /* is there an interface with this ifindex? */ if ((req.ifa.ifa_index = ll_name_to_index((char*)ifacename)) == 0) { sprintf(Message, "Cannot find device: %s", ifacename); rtnl_close(&rth); return LOWLEVEL_ERROR_UNSPEC; } rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL); fflush(stdout); rtnl_close(&rth); return LOWLEVEL_NO_ERROR; }