@@ -2336,10 +2336,15 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len)
2336
2336
struct ip_vs_daemon_user * dm = (struct ip_vs_daemon_user * )arg ;
2337
2337
2338
2338
if (cmd == IP_VS_SO_SET_STARTDAEMON ) {
2339
+ struct ipvs_sync_daemon_cfg cfg ;
2340
+
2341
+ memset (& cfg , 0 , sizeof (cfg ));
2342
+ strlcpy (cfg .mcast_ifn , dm -> mcast_ifn ,
2343
+ sizeof (cfg .mcast_ifn ));
2344
+ cfg .syncid = dm -> syncid ;
2339
2345
rtnl_lock ();
2340
2346
mutex_lock (& ipvs -> sync_mutex );
2341
- ret = start_sync_thread (net , dm -> state , dm -> mcast_ifn ,
2342
- dm -> syncid );
2347
+ ret = start_sync_thread (net , & cfg , dm -> state );
2343
2348
mutex_unlock (& ipvs -> sync_mutex );
2344
2349
rtnl_unlock ();
2345
2350
} else {
@@ -2650,15 +2655,15 @@ do_ip_vs_get_ctl(struct sock *sk, int cmd, void __user *user, int *len)
2650
2655
mutex_lock (& ipvs -> sync_mutex );
2651
2656
if (ipvs -> sync_state & IP_VS_STATE_MASTER ) {
2652
2657
d [0 ].state = IP_VS_STATE_MASTER ;
2653
- strlcpy (d [0 ].mcast_ifn , ipvs -> master_mcast_ifn ,
2658
+ strlcpy (d [0 ].mcast_ifn , ipvs -> mcfg . mcast_ifn ,
2654
2659
sizeof (d [0 ].mcast_ifn ));
2655
- d [0 ].syncid = ipvs -> master_syncid ;
2660
+ d [0 ].syncid = ipvs -> mcfg . syncid ;
2656
2661
}
2657
2662
if (ipvs -> sync_state & IP_VS_STATE_BACKUP ) {
2658
2663
d [1 ].state = IP_VS_STATE_BACKUP ;
2659
- strlcpy (d [1 ].mcast_ifn , ipvs -> backup_mcast_ifn ,
2664
+ strlcpy (d [1 ].mcast_ifn , ipvs -> bcfg . mcast_ifn ,
2660
2665
sizeof (d [1 ].mcast_ifn ));
2661
- d [1 ].syncid = ipvs -> backup_syncid ;
2666
+ d [1 ].syncid = ipvs -> bcfg . syncid ;
2662
2667
}
2663
2668
if (copy_to_user (user , & d , sizeof (d )) != 0 )
2664
2669
ret = - EFAULT ;
@@ -2813,6 +2818,7 @@ static const struct nla_policy ip_vs_daemon_policy[IPVS_DAEMON_ATTR_MAX + 1] = {
2813
2818
[IPVS_DAEMON_ATTR_MCAST_IFN ] = { .type = NLA_NUL_STRING ,
2814
2819
.len = IP_VS_IFNAME_MAXLEN },
2815
2820
[IPVS_DAEMON_ATTR_SYNC_ID ] = { .type = NLA_U32 },
2821
+ [IPVS_DAEMON_ATTR_SYNC_MAXLEN ] = { .type = NLA_U16 },
2816
2822
};
2817
2823
2818
2824
/* Policy used for attributes in nested attribute IPVS_CMD_ATTR_SERVICE */
@@ -3271,7 +3277,7 @@ static int ip_vs_genl_parse_dest(struct ip_vs_dest_user_kern *udest,
3271
3277
}
3272
3278
3273
3279
static int ip_vs_genl_fill_daemon (struct sk_buff * skb , __u32 state ,
3274
- const char * mcast_ifn , __u32 syncid )
3280
+ struct ipvs_sync_daemon_cfg * c )
3275
3281
{
3276
3282
struct nlattr * nl_daemon ;
3277
3283
@@ -3280,8 +3286,9 @@ static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __u32 state,
3280
3286
return - EMSGSIZE ;
3281
3287
3282
3288
if (nla_put_u32 (skb , IPVS_DAEMON_ATTR_STATE , state ) ||
3283
- nla_put_string (skb , IPVS_DAEMON_ATTR_MCAST_IFN , mcast_ifn ) ||
3284
- nla_put_u32 (skb , IPVS_DAEMON_ATTR_SYNC_ID , syncid ))
3289
+ nla_put_string (skb , IPVS_DAEMON_ATTR_MCAST_IFN , c -> mcast_ifn ) ||
3290
+ nla_put_u32 (skb , IPVS_DAEMON_ATTR_SYNC_ID , c -> syncid ) ||
3291
+ nla_put_u16 (skb , IPVS_DAEMON_ATTR_SYNC_MAXLEN , c -> sync_maxlen ))
3285
3292
goto nla_put_failure ;
3286
3293
nla_nest_end (skb , nl_daemon );
3287
3294
@@ -3293,7 +3300,7 @@ static int ip_vs_genl_fill_daemon(struct sk_buff *skb, __u32 state,
3293
3300
}
3294
3301
3295
3302
static int ip_vs_genl_dump_daemon (struct sk_buff * skb , __u32 state ,
3296
- const char * mcast_ifn , __u32 syncid ,
3303
+ struct ipvs_sync_daemon_cfg * c ,
3297
3304
struct netlink_callback * cb )
3298
3305
{
3299
3306
void * hdr ;
@@ -3303,7 +3310,7 @@ static int ip_vs_genl_dump_daemon(struct sk_buff *skb, __u32 state,
3303
3310
if (!hdr )
3304
3311
return - EMSGSIZE ;
3305
3312
3306
- if (ip_vs_genl_fill_daemon (skb , state , mcast_ifn , syncid ))
3313
+ if (ip_vs_genl_fill_daemon (skb , state , c ))
3307
3314
goto nla_put_failure ;
3308
3315
3309
3316
genlmsg_end (skb , hdr );
@@ -3323,17 +3330,15 @@ static int ip_vs_genl_dump_daemons(struct sk_buff *skb,
3323
3330
mutex_lock (& ipvs -> sync_mutex );
3324
3331
if ((ipvs -> sync_state & IP_VS_STATE_MASTER ) && !cb -> args [0 ]) {
3325
3332
if (ip_vs_genl_dump_daemon (skb , IP_VS_STATE_MASTER ,
3326
- ipvs -> master_mcast_ifn ,
3327
- ipvs -> master_syncid , cb ) < 0 )
3333
+ & ipvs -> mcfg , cb ) < 0 )
3328
3334
goto nla_put_failure ;
3329
3335
3330
3336
cb -> args [0 ] = 1 ;
3331
3337
}
3332
3338
3333
3339
if ((ipvs -> sync_state & IP_VS_STATE_BACKUP ) && !cb -> args [1 ]) {
3334
3340
if (ip_vs_genl_dump_daemon (skb , IP_VS_STATE_BACKUP ,
3335
- ipvs -> backup_mcast_ifn ,
3336
- ipvs -> backup_syncid , cb ) < 0 )
3341
+ & ipvs -> bcfg , cb ) < 0 )
3337
3342
goto nla_put_failure ;
3338
3343
3339
3344
cb -> args [1 ] = 1 ;
@@ -3348,25 +3353,33 @@ static int ip_vs_genl_dump_daemons(struct sk_buff *skb,
3348
3353
static int ip_vs_genl_new_daemon (struct net * net , struct nlattr * * attrs )
3349
3354
{
3350
3355
struct netns_ipvs * ipvs = net_ipvs (net );
3356
+ struct ipvs_sync_daemon_cfg c ;
3357
+ struct nlattr * a ;
3351
3358
int ret ;
3352
3359
3360
+ memset (& c , 0 , sizeof (c ));
3353
3361
if (!(attrs [IPVS_DAEMON_ATTR_STATE ] &&
3354
3362
attrs [IPVS_DAEMON_ATTR_MCAST_IFN ] &&
3355
3363
attrs [IPVS_DAEMON_ATTR_SYNC_ID ]))
3356
3364
return - EINVAL ;
3365
+ strlcpy (c .mcast_ifn , nla_data (attrs [IPVS_DAEMON_ATTR_MCAST_IFN ]),
3366
+ sizeof (c .mcast_ifn ));
3367
+ c .syncid = nla_get_u32 (attrs [IPVS_DAEMON_ATTR_SYNC_ID ]);
3368
+
3369
+ a = attrs [IPVS_DAEMON_ATTR_SYNC_MAXLEN ];
3370
+ if (a )
3371
+ c .sync_maxlen = nla_get_u16 (a );
3357
3372
3358
3373
/* The synchronization protocol is incompatible with mixed family
3359
3374
* services
3360
3375
*/
3361
- if (net_ipvs ( net ) -> mixed_address_family_dests > 0 )
3376
+ if (ipvs -> mixed_address_family_dests > 0 )
3362
3377
return - EINVAL ;
3363
3378
3364
3379
rtnl_lock ();
3365
3380
mutex_lock (& ipvs -> sync_mutex );
3366
- ret = start_sync_thread (net ,
3367
- nla_get_u32 (attrs [IPVS_DAEMON_ATTR_STATE ]),
3368
- nla_data (attrs [IPVS_DAEMON_ATTR_MCAST_IFN ]),
3369
- nla_get_u32 (attrs [IPVS_DAEMON_ATTR_SYNC_ID ]));
3381
+ ret = start_sync_thread (net , & c ,
3382
+ nla_get_u32 (attrs [IPVS_DAEMON_ATTR_STATE ]));
3370
3383
mutex_unlock (& ipvs -> sync_mutex );
3371
3384
rtnl_unlock ();
3372
3385
return ret ;
0 commit comments