Commit ff91d4f7 authored by Pavel Emelyanov's avatar Pavel Emelyanov

skqueue: Split the packets sending code

Reviewed-by: 's avatarKirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
parent 5c84e93e
...@@ -197,25 +197,11 @@ err_brk: ...@@ -197,25 +197,11 @@ err_brk:
return ret; return ret;
} }
int restore_sk_queue(int fd, unsigned int peer_id) static int send_one_pkt(int fd, struct sk_packet *pkt)
{ {
struct sk_packet *pkt, *tmp; int ret;
int ret = -1;
pr_info("Trying to restore recv queue for %u\n", peer_id);
if (restore_prepare_socket(fd))
goto out;
list_for_each_entry_safe(pkt, tmp, &packets_list, list) {
SkPacketEntry *entry = pkt->entry; SkPacketEntry *entry = pkt->entry;
if (entry->id_for != peer_id)
continue;
pr_info("\tRestoring %d-bytes skb for %u\n",
(unsigned int)entry->length, peer_id);
/* /*
* Don't try to use sendfile here, because it use sendpage() and * Don't try to use sendfile here, because it use sendpage() and
* all data are split on pages and a new skb is allocated for * all data are split on pages and a new skb is allocated for
...@@ -228,14 +214,40 @@ int restore_sk_queue(int fd, unsigned int peer_id) ...@@ -228,14 +214,40 @@ int restore_sk_queue(int fd, unsigned int peer_id)
xfree(pkt->data); xfree(pkt->data);
if (ret < 0) { if (ret < 0) {
pr_perror("Failed to send packet"); pr_perror("Failed to send packet");
goto out; return -1;
} }
if (ret != entry->length) { if (ret != entry->length) {
pr_err("Restored skb trimmed to %d/%d\n", pr_err("Restored skb trimmed to %d/%d\n",
ret, (unsigned int)entry->length); ret, (unsigned int)entry->length);
ret = -1; return -1;
goto out;
} }
return 0;
}
int restore_sk_queue(int fd, unsigned int peer_id)
{
struct sk_packet *pkt, *tmp;
int ret = -1;
pr_info("Trying to restore recv queue for %u\n", peer_id);
if (restore_prepare_socket(fd))
goto out;
list_for_each_entry_safe(pkt, tmp, &packets_list, list) {
SkPacketEntry *entry = pkt->entry;
if (entry->id_for != peer_id)
continue;
pr_info("\tRestoring %d-bytes skb for %u\n",
(unsigned int)entry->length, peer_id);
ret = send_one_pkt(fd, pkt);
if (ret)
goto out;
list_del(&pkt->list); list_del(&pkt->list);
sk_packet_entry__free_unpacked(entry, NULL); sk_packet_entry__free_unpacked(entry, NULL);
xfree(pkt); xfree(pkt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment