{
lb_main_t *lbm = &lb_main;
u32 n_left_from, *from, next_index, *to_next, n_left_to_next;
- u32 thread_index = vlib_get_thread_index ();
+ u32 thread_index = vm->thread_index;
u32 lb_time = lb_hash_time_now (vm);
lb_hash_t *sticky_ht = lb_get_sticky_table (thread_index);
ip4_header_t *ip40;
tcp_header_t *th0;
ip_csum_t csum;
- u32 old_dst;
- u32 old_dscp;
+ u32 old_dst, new_dst;
+ u8 old_tos, new_tos;
ip40 = vlib_buffer_get_current (p0);
old_dst = ip40->dst_address.as_u32;
- old_dscp = ip40->tos;
- ip40->dst_address = lbm->ass[asindex0].address.ip4;
+ new_dst = lbm->ass[asindex0].address.ip4.as_u32;
+ ip40->dst_address.as_u32 = lbm->ass[asindex0].address.ip4.as_u32;
/* Get and rewrite DSCP bit */
+ old_tos = ip40->tos;
+ new_tos = (u8) ((vip0->encap_args.dscp & 0x3F) << 2);
ip40->tos = (u8) ((vip0->encap_args.dscp & 0x3F) << 2);
csum = ip40->checksum;
- csum = ip_csum_sub_even (csum, old_dst);
- csum = ip_csum_sub_even (csum, old_dscp);
- csum = ip_csum_add_even (csum,
- lbm->ass[asindex0].address.ip4.as_u32);
- csum = ip_csum_add_even (csum, ip40->tos);
+ csum = ip_csum_update (csum, old_tos, new_tos,
+ ip4_header_t,
+ tos /* changed member */);
+ csum = ip_csum_update (csum, old_dst, new_dst,
+ ip4_header_t,
+ dst_address /* changed member */);
ip40->checksum = ip_csum_fold (csum);
/* Recomputing L4 checksum after dst-IP modifying */