|
@@ -854,10 +854,6 @@ ip_vs_new_dest(struct ip_vs_service *svc, struct ip_vs_dest_user_kern *udest,
|
|
|
|
|
|
EnterFunction(2);
|
|
|
|
|
|
- /* Temporary for consistency */
|
|
|
- if (udest->af != svc->af)
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
#ifdef CONFIG_IP_VS_IPV6
|
|
|
if (udest->af == AF_INET6) {
|
|
|
atype = ipv6_addr_type(&udest->addr.in6);
|
|
@@ -3403,6 +3399,26 @@ static int ip_vs_genl_set_cmd(struct sk_buff *skb, struct genl_info *info)
|
|
|
*/
|
|
|
if (udest.af == 0)
|
|
|
udest.af = svc->af;
|
|
|
+
|
|
|
+ if (udest.af != svc->af) {
|
|
|
+ /* The synchronization protocol is incompatible
|
|
|
+ * with mixed family services
|
|
|
+ */
|
|
|
+ if (net_ipvs(net)->sync_state) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Which connection types do we support? */
|
|
|
+ switch (udest.conn_flags) {
|
|
|
+ case IP_VS_CONN_F_TUNNEL:
|
|
|
+ /* We are able to forward this */
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
switch (cmd) {
|