struct sockaddr_swift *swift_addr;
struct sock * sk = sock->sk;
int err, copied;
+ int i;
+ struct sockaddr_swift *ret_addr = (struct sockaddr_swift *) msg->msg_name;
log_debug("Trying to receive sock=%p sk=%p flags=%d\n", sock, sk, flags);
goto out;
}
- log_debug("Received skb %p\n", skb);
+ for (i = 0; i < msg->msg_iovlen; i++) {
+ log_debug("Received skb %p\n", skb);
- swift_addr = (struct sockaddr_swift *) skb->cb;
- msg->msg_namelen = sizeof(struct sockaddr_swift);
+ swift_addr = (struct sockaddr_swift *) skb->cb;
- copied = skb->len;
- if (copied > len) {
- copied = len;
- msg->msg_flags |= MSG_TRUNC;
- }
+ copied = skb->len;
+ if (copied > msg->msg_iov[i].iov_len) {
+ copied = msg->msg_iov[i].iov_len;
+ msg->msg_flags |= MSG_TRUNC;
+ }
- err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
- if (unlikely(err)) {
- log_error("skb_copy_datagram_iovec\n");
- goto out_free;
- }
+ err = skb_copy_datagram_iovec(skb, 0, &msg->msg_iov[i], copied);
+ if (unlikely(err)) {
+ log_error("skb_copy_datagram_iovec\n");
+ goto out_free;
+ }
- sock_recv_ts_and_drops(msg, sk, skb);
+ sock_recv_ts_and_drops(msg, sk, skb);
- if (msg->msg_name)
- memcpy(msg->msg_name, swift_addr, msg->msg_namelen);
-
- err = copied;
+ if (ret_addr)
+ memcpy(&ret_addr->dests[i], &swift_addr->dests[0], sizeof(ret_addr->dests[i]));
+
+ err = copied;
out_free:
- skb_free_datagram(sk, skb);
+ skb_free_datagram(sk, skb);
+
+ skb = skb_recv_datagram(sk, flags, 1, &err);
+ if (likely(err == -EAGAIN)) {
+ log_debug("No more skbs in the queue, returning...\n");
+ err = copied;
+ break;
+ }
+ }
+
+ ret_addr->count = i + 1;
+ msg->msg_namelen = sizeof(struct sockaddr_swift) + (i + 1) * sizeof(struct swift_dest);
out:
return err;
uint8_t src, dst;
struct sockaddr_swift * swift_addr;
int err;
+ int addr_size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest);
if (unlikely(!pskb_may_pull(skb, sizeof(struct swifthdr)))) {
log_error("Insufficient space for header\n");
goto drop;
}
- BUILD_BUG_ON(sizeof(struct sockaddr_swift) > sizeof(skb->cb));
+ BUG_ON(addr_size > sizeof(skb->cb));
swift_addr = (struct sockaddr_swift *) skb->cb;
swift_addr->dests[0].port = shdr->src;
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
+#include <time.h>
-#define ADDR 0x80BEA8C0
-#define DADDR 0x81BEA8C0
+#define ADDR 0x8082A8C0
+#define DADDR 0x8082A8C0
+
+int gen_port()
+{
+ int ret;
+ srand(time(NULL));
+ ret = (rand() % 255) + 1;
+ if (ret == 100 || ret == 101)
+ ret *= 2;
+ printf("Generated source port %d\n", ret);
+ return ret;
+}
int main(int argc, const char *argv[])
{
saddr->count = 1;
saddr->dests[0].addr = ADDR;
- saddr->dests[0].port = 50;
+ saddr->dests[0].port = gen_port();
if (bind(sock, (struct sockaddr *) saddr, size) < 0) {
perror("Failed to bind socket");
return -1;
}
- char buf[] = "Buffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de testBuffer de test";
+ char buf[] = "Buffer1";
char buf2[] = "Buffer2";
struct iovec iov[2];
struct msghdr msg;
#include <netinet/in.h>
#include <stdlib.h>
-#define ADDR 0x81BEA8C0
+#define ADDR 0x8182A8C0
+#define NUM_BUF 10
int main(int argc, const char *argv[])
{
int sock;
+ int i;
if (argc != 2) {
fprintf(stderr, "USAGE: %s listening_port\n", argv[0]);
return -1;
}
- char buf[10240];
- struct iovec iov[1];
+ char buf[NUM_BUF][10240];
+ struct iovec iov[NUM_BUF];
struct msghdr msg;
+ size += (NUM_BUF - 1) * sizeof(struct swift_dest);
struct sockaddr_swift *from = malloc(size);
memset(&msg, 0, sizeof(msg));
memset(&iov, 0, sizeof(iov));
memset(from, 0, size);
- iov[0].iov_base = buf;
- iov[0].iov_len = sizeof(buf);
+ for (i = 0; i < NUM_BUF; i++) {
+ iov[i].iov_base = buf[i];
+ iov[i].iov_len = sizeof(buf[i]);
+ }
msg.msg_iov = iov;
- msg.msg_iovlen = 1;
+ msg.msg_iovlen = 10;
msg.msg_name = from;
msg.msg_namelen = size;
int ret, fromlen;
+ sleep(20);
+
ret = recvmsg(sock, &msg, 0);
if (ret < 0) {
perror("Failed to recv on socket");
}
printf("Received %d bytes on socket\n", ret);
- printf("buf=%s\n", buf);
+ for (i = 0; i < from->count; i++) {
+ printf("buf=%s from %s:%d\n", buf[i], inet_ntoa(from->dests[i].addr), from->dests[i].port);
+ }
if (close(sock) < 0) {
perror("Failed to close socket");