As I've already done with pfctl and bgpd, this is the first diff to
convert iked to a more AF agnostic address parsing.
This diff introduces the copy_satoipa() wrapper and makes set_ipmask()
handle the -1 mask case which will be used in the future.
No functional change.
OK?
Index: parse.y
===================================================================
RCS file: /cvs/src/sbin/iked/parse.y,v
retrieving revision 1.85
diff -u -p -r1.85 parse.y
--- parse.y 12 Nov 2019 16:45:04 -0000 1.85
+++ parse.y 27 Nov 2019 04:01:14 -0000
@@ -331,6 +331,8 @@ struct ipsec_filters {
unsigned int tap;
};
+void copy_satoipa(struct ipsec_addr_wrap *,
+ struct sockaddr *);
struct ipsec_addr_wrap *host(const char *);
struct ipsec_addr_wrap *host_v6(const char *, int);
struct ipsec_addr_wrap *host_v4(const char *, int);
@@ -341,7 +343,7 @@ void ifa_load(void);
int ifa_exists(const char *);
struct ipsec_addr_wrap *ifa_lookup(const char *ifa_name);
struct ipsec_addr_wrap *ifa_grouplookup(const char *);
-void set_ipmask(struct ipsec_addr_wrap *, uint8_t);
+void set_ipmask(struct ipsec_addr_wrap *, int);
const struct ipsec_xf *parse_xf(const char *, unsigned int,
const struct ipsec_xf *);
const char *print_xf(unsigned int, unsigned int,
@@ -1169,6 +1171,17 @@ struct keywords {
int k_val;
};
+void
+copy_satoipa(struct ipsec_addr_wrap *ipa, struct sockaddr *sa)
+{
+ if (sa->sa_family == AF_INET6)
+ memcpy(&ipa->address, sa, sizeof(struct sockaddr_in6));
+ else if (sa->sa_family == AF_INET)
+ memcpy(&ipa->address, sa, sizeof(struct sockaddr_in));
+ else
+ warnx("unhandled af %d", sa->sa_family);
+}
+
int
yyerror(const char *fmt, ...)
{
@@ -2149,16 +2162,7 @@ host_dns(const char *s, int mask)
ipa = calloc(1, sizeof(struct ipsec_addr_wrap));
if (ipa == NULL)
err(1, "%s", __func__);
- switch (res->ai_family) {
- case AF_INET:
- memcpy(&ipa->address, res->ai_addr,
- sizeof(struct sockaddr_in));
- break;
- case AF_INET6:
- memcpy(&ipa->address, res->ai_addr,
- sizeof(struct sockaddr_in6));
- break;
- }
+ copy_satoipa(ipa, res->ai_addr);
error = getnameinfo(res->ai_addr, res->ai_addrlen, hbuf,
sizeof(hbuf), NULL, 0, NI_NUMERICHOST);
if (error)
@@ -2407,9 +2411,12 @@ ifa_lookup(const char *ifa_name)
}
void
-set_ipmask(struct ipsec_addr_wrap *address, uint8_t b)
+set_ipmask(struct ipsec_addr_wrap *address, int b)
{
- address->mask = b;
+ if (b == -1)
+ address->mask = address->af == AF_INET ? 32 : 128;
+ else
+ address->mask = b;
}
const struct ipsec_xf *