diff options
author | Nobuhiro MIKI <nmiki@yahoo-corp.jp> | 2022-09-28 15:53:17 +0900 |
---|---|---|
committer | Beno�t Ganne <bganne@cisco.com> | 2023-01-18 10:53:23 +0000 |
commit | 613e6dc0bf928def5d337312d522e1a15df87b00 (patch) | |
tree | 04e592643029774fadcbfc8f8e82df778b867df9 /src/plugins/lb/api.c | |
parent | 893a0c3130e1d868c939db6dcde258da1277cf41 (diff) |
lb: add source ip based sticky load balancing
This patch adds source ip based sticky session, which is already
implemented in many hardware LBs and software LBs. Note that sticky
sessions may be reset if the hash is recalculated as ASs are added
or deleted.
Since this feature is unrelated to the other existing options, the
lb_add_del_vip API version has been upgraded to v2 and a new option
"src_ip_sticky" has been added.
Type: feature
Signed-off-by: Nobuhiro MIKI <nmiki@yahoo-corp.jp>
Change-Id: I3eb3680a28defbc701f28c873933ec2fb54544ab
Diffstat (limited to 'src/plugins/lb/api.c')
-rw-r--r-- | src/plugins/lb/api.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/plugins/lb/api.c b/src/plugins/lb/api.c index bf4a50ddb04..9ccd7b5d634 100644 --- a/src/plugins/lb/api.c +++ b/src/plugins/lb/api.c @@ -128,6 +128,80 @@ vl_api_lb_add_del_vip_t_handler } static void +vl_api_lb_add_del_vip_v2_t_handler (vl_api_lb_add_del_vip_v2_t *mp) +{ + lb_main_t *lbm = &lb_main; + vl_api_lb_conf_reply_t *rmp; + int rv = 0; + lb_vip_add_args_t args; + + /* if port == 0, it means all-port VIP */ + if (mp->port == 0) + { + mp->protocol = ~0; + } + + ip_address_decode (&mp->pfx.address, &(args.prefix)); + + if (mp->is_del) + { + u32 vip_index; + if (!(rv = lb_vip_find_index (&(args.prefix), mp->pfx.len, mp->protocol, + ntohs (mp->port), &vip_index))) + rv = lb_vip_del (vip_index); + } + else + { + u32 vip_index; + lb_vip_type_t type = 0; + + if (ip46_prefix_is_ip4 (&(args.prefix), mp->pfx.len)) + { + if (mp->encap == LB_API_ENCAP_TYPE_GRE4) + type = LB_VIP_TYPE_IP4_GRE4; + else if (mp->encap == LB_API_ENCAP_TYPE_GRE6) + type = LB_VIP_TYPE_IP4_GRE6; + else if (mp->encap == LB_API_ENCAP_TYPE_L3DSR) + type = LB_VIP_TYPE_IP4_L3DSR; + else if (mp->encap == LB_API_ENCAP_TYPE_NAT4) + type = LB_VIP_TYPE_IP4_NAT4; + } + else + { + if (mp->encap == LB_API_ENCAP_TYPE_GRE4) + type = LB_VIP_TYPE_IP6_GRE4; + else if (mp->encap == LB_API_ENCAP_TYPE_GRE6) + type = LB_VIP_TYPE_IP6_GRE6; + else if (mp->encap == LB_API_ENCAP_TYPE_NAT6) + type = LB_VIP_TYPE_IP6_NAT6; + } + + args.plen = mp->pfx.len; + args.protocol = mp->protocol; + args.port = ntohs (mp->port); + args.type = type; + args.new_length = ntohl (mp->new_flows_table_length); + + if (mp->src_ip_sticky) + args.src_ip_sticky = 1; + + if (mp->encap == LB_API_ENCAP_TYPE_L3DSR) + { + args.encap_args.dscp = (u8) (mp->dscp & 0x3F); + } + else if ((mp->encap == LB_API_ENCAP_TYPE_NAT4) || + (mp->encap == LB_API_ENCAP_TYPE_NAT6)) + { + args.encap_args.srv_type = mp->type; + args.encap_args.target_port = ntohs (mp->target_port); + } + + rv = lb_vip_add (args, &vip_index); + } + REPLY_MACRO (VL_API_LB_ADD_DEL_VIP_V2_REPLY); +} + +static void vl_api_lb_add_del_as_t_handler (vl_api_lb_add_del_as_t * mp) { |