diff --git a/README.md b/README.md index caecd9d..28b7a5f 100644 --- a/README.md +++ b/README.md @@ -64,25 +64,24 @@ * `rtn & 0x02 == 0x02`:确保这个包可以修改(调用 `skb_ensure_aritable`)。否则不用调用。 * `rtn & 0x04 == 0x04`:返回 `NF_STOLEN`。否则返回 `NF_ACCEPT`。当然,实际上,被截留的包一定需要确保可修改,但这不需要在代码中体现。 - 高 24 位用于通知 `rkpStream_execute` 如何处理。其中,低四位共同表示包的处理方法,以及其它位的意义: + 高 24 位用于通知 `rkpStream_execute` 如何处理。其中,低四位共同表示包的处理方法,其它位在个别情况下才有意义。具体: * `0x0`:包不属于这个流。除了这种情况以外,都需要更新时间,以后不再重复。 * `0x1`:包属于这个流,但直接放行就可以(不携带应用层数据,或者是重传)。 * `0x2`:包是属于未来的、包含有应用层数据的数据包,需要置入 `buff_prev`。除了这三个以外,都需要更新序列号,不再重复。 * `0x3`:包是 HTTP 头部的一部分,并且即使算上这个数据包,也没有收集到完整的头部。仅仅在这时,之后的四位才有用,它用来标记 `"\r\n\r\n"` 已经匹配了几个字符。 - * `0x4`:包是 HTTP 头部的一部分,算上这个数据包,已经收集到了完整的头部,并且头部是在这个数据包中结束的。只有在这时,高 16 位才有用,它用来标记 `"\r\n\r\nx"` 中,`'x'` 的位置相对于这个包中应用层第一个字节的偏移。 - * `0x5`:包不是 HTTP 头部的一部分,放行即可。是否设置 `rkpstm_established_sniffing` 通过直接读取数据包的内容确定。它与 `0x1` 的区别在于,是否需要更新序列号。 + * `0x4`:包是 HTTP 头部的一部分,算上这个数据包,已经收集到了完整的头部,并且头部是在这个数据包中结束的,并且没有 PSH 标志。这时,高 16 位有意义,它用来标记 `"\r\n\r\nx"` 中,`'x'` 的位置相对于这个包中应用层第一个字节的偏移。 + * `0x5`:与 `0x4` 类似,区别在于有 PSH,需要设置状态为 `rkpstm_established_sniffing`。 + * `0x6`:包不是 HTTP 头部的一部分,并且没有设置 PSH;总之,放行即可。它与 `0x1` 的区别在于,是否需要更新序列号。 + * `0x7`:包不是 HTTP 头部的一部分,并且设置了 PSH。放行并设置状态为 `rkpstm_established_sniffing`。 -* `void rkpStream_execute(struct rkpStream*, struct sk_buff*, u_int32_t)`:执行需要执行的动作。第三个参数传入 `rkpStream_judge` 对于这个包的返回值,它的低八位会被忽略。它要做的事情几乎完全由 `rkpStream_judge` 的返回值来通知。以下数值是指 `rtn & 0x0f00 >> 8` 的值。 +* `void rkpStream_execute(struct rkpStream*, struct sk_buff*, u_int32_t)`:执行需要执行的动作。第三个参数传入 `rkpStream_judge` 对于这个包的返回值,它的低八位会被忽略。它要做的事情完全由 `rkpStream_judge` 的返回值来通知。以下数值是指 `rtn & 0x0f00 >> 8` 的值。 * `0x0`:返回。 * `0x1`:更新时间,然后返回。 - * `0x2`:确认序列号是否符合期待。 - * 符合期待则丢入 `buff`,更新时间、序列号、扫描状况。然后,循环确认 `buff_prev` 中是否有符合序列号的,直到没有为止。 - * 有的话拿出来,调用 `rkpStream_judge`,看返回值是 `0x2` 还是 `0x3`。只可能是这两个之一。 - * 如果是 `0x2`,丢入 `buff`,更新时间、序列号、扫描状况。 - * 如果是 `0x3`,丢入 `buff`,更新时间、序列号、扫描状况。调用 `__rkpStream_modify` 来修改 UA,调用 `__rkpStream_flush` 来将截留的所有包发出(最后一个参数为 0)。 - * + * `0x2`:更新时间,置入 `buff_prev`。 + * `0x3`:更新时间、序列号,设置 `scan_matched`。调用 `__rkpStream_reexecute` 来尝试处理 `buff_prev` 中的包。 + * `0x` * `int8_t __rpStream_check_sequence(struct rpStream*, struct sk_buff*)`:视为私有变量。检查一个数据包是重传(返回 -1)、乱序(返回 1)还是正常的(返回 0)。