+static bool
+check_families(struct uci_element *e, struct fw3_redirect *r)
+{
+ if (r->family == FW3_FAMILY_ANY)
+ return true;
+
+ if (r->_src && r->_src->family && r->_src->family != r->family)
+ {
+ warn_elem(e, "refers to source zone with different family");
+ return false;
+ }
+
+ if (r->_dest && r->_dest->family && r->_dest->family != r->family)
+ {
+ warn_elem(e, "refers to destination zone with different family");
+ return false;
+ }
+
+ if (r->_ipset && r->_ipset->family && r->_ipset->family != r->family)
+ {
+ warn_elem(e, "refers to ipset with different family");
+ return false;
+ }
+
+ if (r->ip_src.family && r->ip_src.family != r->family)
+ {
+ warn_elem(e, "uses source ip with different family");
+ return false;
+ }
+
+ if (r->ip_dest.family && r->ip_dest.family != r->family)
+ {
+ warn_elem(e, "uses destination ip with different family");
+ return false;
+ }
+
+ if (r->ip_redir.family && r->ip_redir.family != r->family)
+ {
+ warn_elem(e, "uses redirect ip with different family");
+ return false;
+ }
+
+ return true;
+}
+