net: Add asynchronous callbacks for xfrm on layer 2.
This patch implements asynchronous crypto callbacks and a backlog handler that can be used when IPsec is done at layer 2 in the TX path. It also extends the skb validate functions so that we can update the driver transmit return codes based on async crypto operation or to indicate that we queued the packet in a backlog queue. Joint work with: Aviv Heller <avivh@mellanox.com> Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
This commit is contained in:
@@ -121,14 +121,32 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp)
|
||||
static void esp_output_done(struct crypto_async_request *base, int err)
|
||||
{
|
||||
struct sk_buff *skb = base->data;
|
||||
struct xfrm_offload *xo = xfrm_offload(skb);
|
||||
void *tmp;
|
||||
struct dst_entry *dst = skb_dst(skb);
|
||||
struct xfrm_state *x = dst->xfrm;
|
||||
struct xfrm_state *x;
|
||||
|
||||
if (xo && (xo->flags & XFRM_DEV_RESUME))
|
||||
x = skb->sp->xvec[skb->sp->len - 1];
|
||||
else
|
||||
x = skb_dst(skb)->xfrm;
|
||||
|
||||
tmp = ESP_SKB_CB(skb)->tmp;
|
||||
esp_ssg_unref(x, tmp);
|
||||
kfree(tmp);
|
||||
xfrm_output_resume(skb, err);
|
||||
|
||||
if (xo && (xo->flags & XFRM_DEV_RESUME)) {
|
||||
if (err) {
|
||||
XFRM_INC_STATS(xs_net(x), LINUX_MIB_XFRMOUTSTATEPROTOERROR);
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
skb_push(skb, skb->data - skb_mac_header(skb));
|
||||
secpath_reset(skb);
|
||||
xfrm_dev_resume(skb);
|
||||
} else {
|
||||
xfrm_output_resume(skb, err);
|
||||
}
|
||||
}
|
||||
|
||||
/* Move ESP header back into place. */
|
||||
|
Reference in New Issue
Block a user