Skip to content
  • Zhang Chen's avatar
    30656b09
    filter-rewriter: rewrite tcp packet to keep secondary connection · 30656b09
    Zhang Chen authored
    
    
    We will rewrite tcp packet secondary received and sent.
    When colo guest is a tcp server.
    
    Firstly, client start a tcp handshake. the packet's seq=client_seq,
    ack=0,flag=SYN. COLO primary guest get this pkt and mirror(filter-mirror)
    to secondary guest, secondary get it use filter-redirector.
    Then,primary guest response pkt
    (seq=primary_seq,ack=client_seq+1,flag=ACK|SYN).
    secondary guest response pkt
    (seq=secondary_seq,ack=client_seq+1,flag=ACK|SYN).
    In here,we use filter-rewriter save the secondary_seq to it's tcp connection.
    Finally handshake,client send pkt
    (seq=client_seq+1,ack=primary_seq+1,flag=ACK).
    Here,filter-rewriter can get primary_seq, and rewrite ack from primary_seq+1
    to secondary_seq+1, recalculate checksum. So the secondary tcp connection
    kept good.
    
    When we send/recv packet.
    client send pkt(seq=client_seq+1+data_len,ack=primary_seq+1,flag=ACK|PSH).
    filter-rewriter rewrite ack and send to secondary guest.
    
    primary guest response pkt
    (seq=primary_seq+1,ack=client_seq+1+data_len,flag=ACK)
    secondary guest response pkt
    (seq=secondary_seq+1,ack=client_seq+1+data_len,flag=ACK)
    we rewrite secondary guest seq from secondary_seq+1 to primary_seq+1.
    So tcp connection kept good.
    
    In code We use offset( = secondary_seq - primary_seq )
    to rewrite seq or ack.
    handle_primary_tcp_pkt: tcp_pkt->th_ack += offset;
    handle_secondary_tcp_pkt: tcp_pkt->th_seq -= offset;
    
    Signed-off-by: default avatarZhang Chen <zhangchen.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarLi Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: default avatarWen Congyang <wency@cn.fujitsu.com>
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
    30656b09
    filter-rewriter: rewrite tcp packet to keep secondary connection
    Zhang Chen authored
    
    
    We will rewrite tcp packet secondary received and sent.
    When colo guest is a tcp server.
    
    Firstly, client start a tcp handshake. the packet's seq=client_seq,
    ack=0,flag=SYN. COLO primary guest get this pkt and mirror(filter-mirror)
    to secondary guest, secondary get it use filter-redirector.
    Then,primary guest response pkt
    (seq=primary_seq,ack=client_seq+1,flag=ACK|SYN).
    secondary guest response pkt
    (seq=secondary_seq,ack=client_seq+1,flag=ACK|SYN).
    In here,we use filter-rewriter save the secondary_seq to it's tcp connection.
    Finally handshake,client send pkt
    (seq=client_seq+1,ack=primary_seq+1,flag=ACK).
    Here,filter-rewriter can get primary_seq, and rewrite ack from primary_seq+1
    to secondary_seq+1, recalculate checksum. So the secondary tcp connection
    kept good.
    
    When we send/recv packet.
    client send pkt(seq=client_seq+1+data_len,ack=primary_seq+1,flag=ACK|PSH).
    filter-rewriter rewrite ack and send to secondary guest.
    
    primary guest response pkt
    (seq=primary_seq+1,ack=client_seq+1+data_len,flag=ACK)
    secondary guest response pkt
    (seq=secondary_seq+1,ack=client_seq+1+data_len,flag=ACK)
    we rewrite secondary guest seq from secondary_seq+1 to primary_seq+1.
    So tcp connection kept good.
    
    In code We use offset( = secondary_seq - primary_seq )
    to rewrite seq or ack.
    handle_primary_tcp_pkt: tcp_pkt->th_ack += offset;
    handle_secondary_tcp_pkt: tcp_pkt->th_seq -= offset;
    
    Signed-off-by: default avatarZhang Chen <zhangchen.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarLi Zhijian <lizhijian@cn.fujitsu.com>
    Signed-off-by: default avatarWen Congyang <wency@cn.fujitsu.com>
    Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Loading