TCP Connection Repair即TCP连接修复,这个功能是通过TCP_REPAIR
socket选项实现的。当这个选项开启时,socket就会切换到修复模式,这个模式下对socket的任何操作都不会导致实质的协议行为(发送TCP报文),但会使socket直接进入成功完成动作的状态。
6.5.1 相关选项
与TCP修复模式有关的socket选项有4个:TCP_REPAIR
、TCP_REPAIR_QUEUE、TCP_QUEUE_SEQ、TCP_REPAIR_OPTIONS。代码如下:
2371 static int do_tcp_setsockopt(struct sock *sk, int level,
2372 int optname, char __user *optval, unsigned int optlen)
2373 {
...
2456 case TCP_REPAIR:
2457 if (!tcp_can_repair_sock(sk))
2458 err = -EPERM;
2459 else if (val == 1) {
2460 tp->repair = 1;
2461 sk->sk_reuse = SK_FORCE_REUSE;
2462 tp->repair_queue = TCP_NO_QUEUE;
2463 } else if (val == 0) {
2464 tp->repair = 0;
2465 sk->sk_reuse = SK_NO_REUSE;
2466 tcp_send_window_probe(sk);
2467 } else
2468 err = -EINVAL;
2469
2470 break;
2471
2472 case TCP_REPAIR_QUEUE:
2473 if (!tp->repair)
2474 err = -EPERM;
2475 else if (val < TCP_QUEUES_NR)
2476 tp->repair_queue = val;
2477 else
2478 err = -EINVAL;
2479 break;
2480
2481 case TCP_QUEUE_SEQ:
2482 if (sk->sk_state != TCP_CLOSE)
2483 err = -EPERM;
2484 else if (tp->repair_queue == TCP_SEND_QUEUE)
2485 tp->write_seq = val;
2486 else if (tp->repair_queue == TCP_RECV_QUEUE)
2487 tp->rcv_nxt = val;
2488 else
2489 err = -EINVAL;
2490 break;
2491
2492 case TCP_REPAIR_OPTIONS:
2493 if (!tp->repair)
2494 err = -EINVAL;
2495 else if (sk->sk_state == TCP_ESTABLISHED)
2496 err = tcp_repair_options_est(tp,
2497 (struct tcp_repair_opt __user *)optval,
2498 optlen);
2499 else
2500 err = -EPERM;
2501 break;
...
tcp_can_repair_sock判断soket是否允