@@ -2971,6 +2971,10 @@ frame_finalize_options(struct context *c, const struct options *o)
29712971    tailroom  +=  COMP_EXTRA_BUFFER (payload_size );
29722972#endif 
29732973
2974+     if  (frame -> bulk_size  >  0 ) {
2975+         payload_size  =  frame -> tun_mtu ;
2976+     }
2977+ 
29742978    frame -> buf .payload_size  =  payload_size ;
29752979    frame -> buf .headroom  =  headroom ;
29762980    frame -> buf .tailroom  =  tailroom ;
@@ -3473,6 +3477,9 @@ do_init_frame_tls(struct context *c)
34733477    if  (c -> c2 .tls_multi )
34743478    {
34753479        tls_multi_init_finalize (c -> c2 .tls_multi , c -> options .ce .tls_mtu );
3480+         if  (c -> c2 .frame .bulk_size  >  0 ) {
3481+             c -> c2 .tls_multi -> opt .frame .buf .payload_size  =  c -> c2 .frame .tun_mtu ;
3482+         }
34763483        ASSERT (c -> c2 .tls_multi -> opt .frame .buf .payload_size  <= c -> c2 .frame .buf .payload_size );
34773484        frame_print (& c -> c2 .tls_multi -> opt .frame , D_MTU_INFO , "Control Channel MTU parms" );
34783485
@@ -3536,6 +3543,14 @@ do_init_frame(struct context *c)
35363543        c -> c2 .frame .extra_tun  +=  c -> options .ce .tun_mtu_extra ;
35373544    }
35383545
3546+     /* 
3547+      * Adjust bulk size based on the --bulk-mode parameter. 
3548+      */ 
3549+     if  (c -> options .ce .bulk_mode )
3550+     {
3551+         c -> c2 .frame .bulk_size  =  c -> options .ce .tun_mtu ;
3552+     }
3553+ 
35393554    /* 
35403555     * Fill in the blanks in the frame parameters structure, 
35413556     * make sure values are rational, etc. 
@@ -3676,9 +3691,41 @@ init_context_buffers(const struct frame *frame)
36763691
36773692    size_t  buf_size  =  BUF_SIZE (frame );
36783693
3694+     if  (frame -> bulk_size  >  0 ) {
3695+         size_t  off_size  =  (frame -> buf .headroom  +  TUN_BAT_OFF  +  frame -> buf .tailroom );
3696+         buf_size  =  BAT_SIZE (TUN_BAT_MAX , frame -> tun_mtu , off_size );
3697+     }
3698+ 
3699+     dmsg (M_INFO , "MEM NEW [%ld] [%d+%d+%d]" , buf_size , frame -> buf .headroom , frame -> buf .payload_size , frame -> buf .tailroom );
3700+ 
36793701    b -> read_link_buf  =  alloc_buf (buf_size );
36803702    b -> read_tun_buf  =  alloc_buf (buf_size );
36813703
3704+     if  (frame -> bulk_size  >  0 ) {
3705+         for  (int  x  =  0 ; x  <  TUN_BAT_MAX ; ++ x )
3706+         {
3707+             size_t  part_size  =  BUF_SIZE (frame );
3708+             b -> read_tun_bufs [x ] =  alloc_buf (part_size );
3709+             b -> read_tun_bufs [x ].offset  =  TUN_BAT_OFF ;
3710+             b -> read_tun_bufs [x ].len  =  0 ;
3711+         }
3712+ 
3713+         b -> read_tun_max  =  alloc_buf (buf_size );
3714+         b -> read_tun_max .offset  =  TUN_BAT_OFF ;
3715+         b -> read_tun_max .len  =  0 ;
3716+ 
3717+         b -> send_tun_max  =  alloc_buf (buf_size );
3718+         b -> send_tun_max .offset  =  TUN_BAT_OFF ;
3719+         b -> send_tun_max .len  =  0 ;
3720+ 
3721+         b -> to_tun_max  =  alloc_buf (buf_size );
3722+         b -> to_tun_max .offset  =  TUN_BAT_OFF ;
3723+         b -> to_tun_max .len  =  0 ;
3724+     }
3725+ 
3726+     b -> bulk_indx  =  -1 ;
3727+     b -> bulk_flag  =  -1 ;
3728+ 
36823729    b -> aux_buf  =  alloc_buf (buf_size );
36833730
36843731    b -> encrypt_buf  =  alloc_buf (buf_size );
@@ -3701,6 +3748,16 @@ free_context_buffers(struct context_buffers *b)
37013748        free_buf (& b -> read_tun_buf );
37023749        free_buf (& b -> aux_buf );
37033750
3751+         if  (b -> to_tun_max .data ) {
3752+             free_buf (& b -> to_tun_max );
3753+             free_buf (& b -> send_tun_max );
3754+             free_buf (& b -> read_tun_max );
3755+             for  (int  x  =  0 ; x  <  TUN_BAT_MAX ; ++ x )
3756+             {
3757+                 free_buf (& b -> read_tun_bufs [x ]);
3758+             }
3759+         }
3760+ 
37043761#ifdef  USE_COMP 
37053762        free_buf (& b -> compress_buf );
37063763        free_buf (& b -> decompress_buf );
0 commit comments