虚拟机测试通过

This commit is contained in:
chn
2019-12-26 14:08:36 +08:00
parent a112ca7a2d
commit 785a1e6a87
4 changed files with 53 additions and 16 deletions

View File

@@ -9,7 +9,7 @@ include $(INCLUDE_DIR)/package.mk
EXTRA_CFLAGS:= \ EXTRA_CFLAGS:= \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
$(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \
-DVERSION="\"\\\"$(PKG_RELEASE)\\\"\"" --verbose -DRKP_DEBUG -DVERSION="\"\\\"$(PKG_RELEASE)\\\"\"" --verbose
MAKE_OPTS:=$(KERNEL_MAKE_FLAGS) \ MAKE_OPTS:=$(KERNEL_MAKE_FLAGS) \
SUBDIRS="$(PKG_BUILD_DIR)" \ SUBDIRS="$(PKG_BUILD_DIR)" \

View File

@@ -68,14 +68,13 @@ static int __init hook_init(void)
static void __exit hook_exit(void) static void __exit hook_exit(void)
{ {
if(rkpm != 0)
rkpManager_delete(rkpm);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4,13,0)
nf_unregister_net_hook(&init_net, &nfho); nf_unregister_net_hook(&init_net, &nfho);
#else #else
nf_unregister_hook(&nfho); nf_unregister_hook(&nfho);
#endif #endif
if(rkpm != 0)
rkpManager_delete(rkpm);
printk("rkp-ua: Stopped.\n"); printk("rkp-ua: Stopped.\n");
} }

View File

@@ -4,8 +4,8 @@
struct rkpManager struct rkpManager
{ {
struct rkpStream* data[256]; // 按照首包的两端口之和的低 8 位放置 struct rkpStream* data[256]; // 按照首包的两端口之和的低 8 位放置
time_t last_active; spinlock_t lock; // 线程锁
spinlock_t lock; // 线程锁 struct timer_list timer; // 定时器,用来定时清理不需要的流
}; };
struct rkpManager* rkpManager_new(void); struct rkpManager* rkpManager_new(void);
@@ -13,7 +13,7 @@ void rkpManager_delete(struct rkpManager*);
int rkpManager_execute(struct rkpManager*, struct sk_buff*); // 处理一个数据包。返回值为 rkpStream_execute 的返回值。 int rkpManager_execute(struct rkpManager*, struct sk_buff*); // 处理一个数据包。返回值为 rkpStream_execute 的返回值。
int __rkpManager_execute(struct rkpManager*, struct sk_buff*); int __rkpManager_execute(struct rkpManager*, struct sk_buff*);
void rkpManager_refresh(struct rkpManager*); // 清理过时的流 void __rkpManager_refresh(unsigned long); // 清理过时的流
void __rkpManager_lock(struct rkpManager*, unsigned long*); void __rkpManager_lock(struct rkpManager*, unsigned long*);
void __rkpManager_unlock(struct rkpManager*, unsigned long); void __rkpManager_unlock(struct rkpManager*, unsigned long);
@@ -24,7 +24,14 @@ struct rkpManager* rkpManager_new(void)
if(rkpm == 0) if(rkpm == 0)
return 0; return 0;
memset(rkpm -> data, 0, sizeof(struct rkpStream*) * 256); memset(rkpm -> data, 0, sizeof(struct rkpStream*) * 256);
// 初始化线程锁
spin_lock_init(&rkpm -> lock); spin_lock_init(&rkpm -> lock);
// 注册定时器
init_timer(&rkpm -> timer);
rkpm -> timer.function = __rkpManager_refresh;
rkpm -> timer.data = (unsigned long)rkpm;
rkpm -> timer.expires = jiffies + 600 * HZ;
add_timer(&rkpm -> timer);
return rkpm; return rkpm;
} }
void rkpManager_delete(struct rkpManager* rkpm) void rkpManager_delete(struct rkpManager* rkpm)
@@ -42,6 +49,7 @@ void rkpManager_delete(struct rkpManager* rkpm)
rkps = rkps2; rkps = rkps2;
} }
} }
del_timer(&rkpm -> timer);
__rkpManager_unlock(rkpm, flag); __rkpManager_unlock(rkpm, flag);
rkpFree(rkpm); rkpFree(rkpm);
} }
@@ -63,7 +71,6 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
printk("\tsport %d dport %d\n", ntohs(tcp_hdr(skb) -> source), ntohs(tcp_hdr(skb) -> dest)); printk("\tsport %d dport %d\n", ntohs(tcp_hdr(skb) -> source), ntohs(tcp_hdr(skb) -> dest));
printk("\tid %d\n", (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF); printk("\tid %d\n", (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF);
#endif #endif
rkpm -> last_active = now();
if(rkpSettings_first(skb)) if(rkpSettings_first(skb))
// 新增加一个流或覆盖已经有的流 // 新增加一个流或覆盖已经有的流
{ {
@@ -119,9 +126,11 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
{ {
u_int8_t id = (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF; u_int8_t id = (ntohs(tcp_hdr(skb) -> source) + ntohs(tcp_hdr(skb) -> dest)) & 0xFF;
struct rkpStream* rkps = rkpm -> data[id]; struct rkpStream* rkps = rkpm -> data[id];
struct rkpStream* rkps_new;
#ifdef RKP_DEBUG #ifdef RKP_DEBUG
printk("rkpStream_execute id %d\n", id); printk("rkpStream_execute id %d\n", id);
#endif #endif
// 寻找流并插入
while(rkps != 0) while(rkps != 0)
if(rkpStream_belongTo(rkps, skb)) if(rkpStream_belongTo(rkps, skb))
{ {
@@ -132,22 +141,45 @@ int __rkpManager_execute(struct rkpManager* rkpm, struct sk_buff* skb)
} }
else else
rkps = rkps -> next; rkps = rkps -> next;
printk("rkp-ua::rkpStream::rkpStream_execute: Target stream %u not found.\n", id); // 如果没找到的话
return NF_DROP; printk("rkp-ua::rkpStream::rkpStream_execute: Target stream %u not found. Creat a new one.\n", id);
rkps_new = rkpStream_new(skb);
if(rkps_new == 0)
return NF_ACCEPT;
if(rkpm -> data[id] == 0)
{
rkpm -> data[id] = rkps_new;
#ifdef RKP_DEBUG
printk("rkpManager_execute: add a new stream %d to an empty list.\n", id);
#endif
}
else
{
rkpm -> data[id] -> prev = rkps_new;
rkps_new -> next = rkpm -> data[id];
rkpm -> data[id] = rkps_new;
#ifdef RKP_DEBUG
printk("rkpManager_execute: add a new stream %d to an unempty list.\n", id);
#endif
}
return rkpStream_execute(rkps_new, skb);
} }
} }
void rkpManager_refresh(struct rkpManager* rkpm) void __rkpManager_refresh(unsigned long param)
{ {
time_t n = now();
unsigned i; unsigned i;
unsigned long flag; unsigned long flag;
struct rkpManager* rkpm = (struct rkpManager*)param;
#ifdef RKP_DEBUG
printk("__rkpManager_refresh start.\n");
#endif
__rkpManager_lock(rkpm, &flag); __rkpManager_lock(rkpm, &flag);
for(i = 0; i < 256; i++) for(i = 0; i < 256; i++)
{ {
struct rkpStream* rkps = rkpm -> data[i]; struct rkpStream* rkps = rkpm -> data[i];
while(rkps != 0) while(rkps != 0)
if(rkps -> last_active + time_keepalive < n) if(!rkps -> active)
{ {
struct rkpStream *rkps2 = rkps -> next; struct rkpStream *rkps2 = rkps -> next;
if(rkps -> prev != 0) if(rkps -> prev != 0)
@@ -160,9 +192,15 @@ void rkpManager_refresh(struct rkpManager* rkpm)
rkps = rkps2; rkps = rkps2;
} }
else else
{
rkps -> active = false;
rkps = rkps -> next; rkps = rkps -> next;
}
} }
__rkpManager_unlock(rkpm, flag); __rkpManager_unlock(rkpm, flag);
#ifdef RKP_DEBUG
printk("__rkpManager_refresh end.\n");
#endif
} }
void __rkpManager_lock(struct rkpManager* rkpm, unsigned long* flagp) void __rkpManager_lock(struct rkpManager* rkpm, unsigned long* flagp)

View File

@@ -13,7 +13,7 @@ struct rkpStream
u_int32_t id[3]; // 按顺序存储客户地址、服务地址、客户端口、服务端口,已经转换字节序 u_int32_t id[3]; // 按顺序存储客户地址、服务地址、客户端口、服务端口,已经转换字节序
struct rkpPacket *buff_scan, *buff_disordered; // 分别存储准备扫描的、因乱序而提前收到的数据包,都按照字节序排好了 struct rkpPacket *buff_scan, *buff_disordered; // 分别存储准备扫描的、因乱序而提前收到的数据包,都按照字节序排好了
u_int32_t seq_offset; // 序列号的偏移。使得 buff_scan 中第一个字节的编号为零。 u_int32_t seq_offset; // 序列号的偏移。使得 buff_scan 中第一个字节的编号为零。
time_t last_active; // 最后活动时间,用来剔除长时间不活动的流 bool active; // 是否仍然活动,超过一定时间不活动的流会被销毁
unsigned scan_matched; // 记录现在已经匹配了多少个字节 unsigned scan_matched; // 记录现在已经匹配了多少个字节
struct rkpStream *prev, *next; struct rkpStream *prev, *next;
}; };
@@ -52,7 +52,7 @@ struct rkpStream* rkpStream_new(const struct sk_buff* skb)
rkps -> id[2] = (((u_int32_t)ntohs(tcph -> source)) << 16) + ntohs(tcph -> dest); rkps -> id[2] = (((u_int32_t)ntohs(tcph -> source)) << 16) + ntohs(tcph -> dest);
rkps -> buff_scan = rkps -> buff_disordered = 0; rkps -> buff_scan = rkps -> buff_disordered = 0;
rkps -> seq_offset = ntohl(tcp_hdr(skb) -> seq) + 1; rkps -> seq_offset = ntohl(tcp_hdr(skb) -> seq) + 1;
rkps -> last_active = now(); rkps -> active = true;
rkps -> scan_matched = 0; rkps -> scan_matched = 0;
rkps -> prev = rkps -> next = 0; rkps -> prev = rkps -> next = 0;
#ifdef RKP_DEBUG #ifdef RKP_DEBUG
@@ -110,7 +110,7 @@ unsigned rkpStream_execute(struct rkpStream* rkps, struct sk_buff* skb)
#endif #endif
// 肯定需要更新时间 // 肯定需要更新时间
rkps -> last_active = now(); rkps -> active = true;
// 不携带应用层数据的情况。直接接受即可。以后的情况,都是含有应用层数据的包了。 // 不携带应用层数据的情况。直接接受即可。以后的情况,都是含有应用层数据的包了。
if(rkpPacket_appLen(p) == 0) if(rkpPacket_appLen(p) == 0)