Relax the IP Family check in XfrmController
To enable dual sockets, the family check in xfrmcontroller
is very strict. This has been relaxed so that IP V6 sockets
do not throw "Mismatched Address family" exception if V4 address
is used.
Also added Unit test to verify the same.
Bug: 70160694
Test: Ran runtest -x system/netd/server/netd_unit_test.cpp
Change-Id: Ib1bba21037ec1de3858c595fa32fee5e833d18bf
diff --git a/server/XfrmController.cpp b/server/XfrmController.cpp
index c9389cd..24ccee4 100644
--- a/server/XfrmController.cpp
+++ b/server/XfrmController.cpp
@@ -612,10 +612,10 @@
return status;
}
- if (saInfo.addrFamily != saddr.ss_family) {
- ALOGE("Transform address family(%d) differs from socket address "
- "family(%d)!",
- saInfo.addrFamily, saddr.ss_family);
+ if (saddr.ss_family == AF_INET && saInfo.addrFamily != AF_INET) {
+ ALOGE("IPV4 socket address family(%d) should match IPV4 Transform "
+ "address family(%d)!",
+ saddr.ss_family, saInfo.addrFamily);
return netdutils::statusFromErrno(EINVAL, "Mismatched address family");
}
@@ -630,7 +630,7 @@
LOG_HEX("XfrmUserPolicy", reinterpret_cast<char*>(&policy), sizeof(policy));
int sockOpt, sockLayer;
- switch (saInfo.addrFamily) {
+ switch (saddr.ss_family) {
case AF_INET:
sockOpt = IP_XFRM_POLICY;
sockLayer = SOL_IP;