我目前正在编写一个内核模块,它将数据包有效负载修改为学习体验.我已完成数据包修改,但现在我想在原始后发送这个新修改的数据包(我不想丢弃原始数据包).我似乎无法找到发送SKB进行传输的内核函数.我已经尝试了,dev_queue_xmit(nskb)但这导致内核恐慌,我也尝试过,skb->next = nskb但没有做任何事情.我是否必须实施SKB列表处理?我不确定如何做到这一点,因为这篇文章似乎已经过时了.
编辑:
所以我在调用dev_queue_xmit(nskb)时能够修复内核恐慌,我不小心做了dev_queue_xmit(skb),它会删除skb并导致网络过滤器出现恐慌.问题是现在一切正常,但我没有看到重复的数据包被发送,没有第二个数据包的踪迹被发送.机器上的TCPDump看不到任何东西,目标上的TPCDump也看不到任何东西,以下是我的代码.
unsigned int in_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
struct sk_buff *nskb = skb_copy(skb, GFP_KERNEL);
/* Various other variables not relevant to the problem */
__u32 saddr, daddr;
saddr = ntohl(iph->saddr);
if (saddr == ipToInt(10,0,2,12) || saddr == ipToInt(10,0,2,13)) {
/*For loop that saves the payload contents into a variable */
/* Here is where the problem is,
I have this if statement to prevent a …Run Code Online (Sandbox Code Playgroud) 我是 graphql 和 node 的新手,很抱歉,如果这真的很简单,但我正在尝试执行 mysql 查询,以便 graphql 返回查询响应供客户端读取。我遇到的问题是,因为 node-mysql 是异步查询的,所以我无法直接获得查询响应。
经过一番修修补补,我想通了,新代码:
var root = {
login: function({username, password}) {
var s = `select password from users where username='${username}'`;
var result = sql.query(s);
return result.then(response => {
return password == response[0].password
});
}
Run Code Online (Sandbox Code Playgroud)
下面是函数定义 sql.query
exports.query = function(s, callback) {
var promise = new Promise((resolve, reject) => {
con.query(s, function(err, response) {
if (err) throw err;
resolve(response);
});
});
return promise;
Run Code Online (Sandbox Code Playgroud)
Graphql 现在返回未定义响应。