void subflow_init_req_cookie_join_save(conststruct mptcp_subflow_request_sock *subflow_req, struct sk_buff *skb)
{ struct net *net = read_pnet(&subflow_req->sk.req.ireq_net);
u32 i = mptcp_join_entry_hash(skb, net);
/* No use in waiting if other cpu is already using this slot -- *wouldoverwritethedatathatgotstored.
*/
spin_lock_bh(&join_entry_locks[i]);
mptcp_join_store_state(&join_entries[i], subflow_req);
spin_unlock_bh(&join_entry_locks[i]);
}
/* Called for a cookie-ack with MP_JOIN option present. *Lookupthesavedstatebasedonskbhash&checktokenmatchesmsk *insamenetns. * *Callerwillcheckmskcanstillacceptanothersubflow.Thehmac *presentinthecookieACKmptcpoptionspacewillbecheckedlater.
*/ bool mptcp_token_join_cookie_init_state(struct mptcp_subflow_request_sock *subflow_req, struct sk_buff *skb)
{ struct net *net = read_pnet(&subflow_req->sk.req.ireq_net);
u32 i = mptcp_join_entry_hash(skb, net); struct mptcp_sock *msk; struct join_entry *e;
e = &join_entries[i];
spin_lock_bh(&join_entry_locks[i]);
if (e->valid == 0) {
spin_unlock_bh(&join_entry_locks[i]); returnfalse;
}
e->valid = 0;
msk = mptcp_token_get_sock(net, e->token); if (!msk) {
spin_unlock_bh(&join_entry_locks[i]); returnfalse;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.