swift_addr = (struct sockaddr_swift *) addr;
- if (unlikely(swift_addr->sin_family != AF_INET)) {
- log_error("Invalid family for sockaddr\n");
- err = -EINVAL;
- goto out;
- }
-
- port = ntohs(swift_addr->sin_port);
+ port = swift_addr->dests[0].port;
if (unlikely(port == 0 || port >= MAX_SWIFT_PORT)) {
log_error("Invalid value for sockaddr port (%u)\n", port);
if (likely(addr)) {
struct sockaddr_swift * swift_addr = (struct sockaddr_swift *) addr;
- if (unlikely(addr_len < sizeof(*swift_addr) || swift_addr->sin_family != AF_INET)) {
+ if (unlikely(addr_len < sizeof(*swift_addr) ||
+ addr_len < swift_addr->count * sizeof(struct swift_dest) ||
+ swift_addr->count <= 0)) {
log_error("Invalid size or address family\n");
err = -EINVAL;
goto out;
}
- ssk->dst = ntohs(swift_addr->sin_port);
+ ssk->dst = swift_addr->dests[0].port;
if (unlikely(ssk->dst == 0 || ssk->dst >= MAX_SWIFT_PORT)) {
log_error("Invalid value for destination port(%u)\n", ssk->dst);
err = -EINVAL;
goto out;
}
- isk->inet_daddr = swift_addr->sin_addr.s_addr;
+ isk->inet_daddr = swift_addr->dests[0].addr;
log_debug("Received from user space destination port=%u and address=%u\n", ssk->dst, isk->inet_daddr);
} else {
log_error("Invalid swift_addr (NULL)\n");
if (msg->msg_name) {
struct sockaddr_swift * swift_addr = (struct sockaddr_swift *) msg->msg_name;
- if (unlikely(msg->msg_namelen < sizeof(*swift_addr) || swift_addr->sin_family != AF_INET)) {
- log_error("Invalid size or address family\n");
+ if (unlikely(msg->msg_namelen < sizeof(*swift_addr) ||
+ msg->msg_namelen < swift_addr->count * sizeof(struct swift_dest) ||
+ swift_addr->count <= 0)) {
+ log_error("Invalid size for msg_name\n");
err = -EINVAL;
goto out;
}
- dport = ntohs(swift_addr->sin_port);
+ dport = swift_addr->dests[0].port;
if (unlikely(dport == 0 || dport >= MAX_SWIFT_PORT)) {
log_error("Invalid value for destination port(%u)\n", dport);
err = -EINVAL;
goto out;
}
- daddr = swift_addr->sin_addr.s_addr;
+ daddr = swift_addr->dests[0].addr;
log_debug("Received from user space destination port=%u and address=%u\n", dport, daddr);
} else {
if (unlikely(!ssk->dst || !isk->inet_daddr)) {
log_debug("Reseted transport header\n");
shdr = (struct swifthdr *) skb_transport_header(skb);
- shdr->dst = ntohs(dport);
- shdr->src = ntohs(sport);
+ shdr->dst = dport;
+ shdr->src = sport;
shdr->len = ntohs(len + sizeof(struct swifthdr));
log_debug("payload=%p\n", skb_put(skb, len));
struct sock * sk = sock->sk;
int err, copied;
+ log_debug("Trying to receive sock=%p sk=%p flags=%d\n", sock, sk, flags);
+
skb = skb_recv_datagram(sk, flags, flags & MSG_DONTWAIT, &err);
if (unlikely(!skb)) {
log_error("skb_recv_datagram\n");
goto drop;
}
- src = ntohs(shdr->src);
- dst = ntohs(shdr->dst);
+ src = shdr->src;
+ dst = shdr->dst;
if (unlikely(src == 0 || dst == 0 || src >= MAX_SWIFT_PORT || dst >= MAX_SWIFT_PORT)) {
log_error("Malformed packet (src=%u, dst=%u)\n", shdr->src, shdr->dst);
goto drop;
BUILD_BUG_ON(sizeof(struct sockaddr_swift) > sizeof(skb->cb));
swift_addr = (struct sockaddr_swift *) skb->cb;
- swift_addr->sin_family = AF_INET;
- swift_addr->sin_port = shdr->src;
- swift_addr->sin_addr.s_addr = ip_hdr(skb)->saddr;
+ swift_addr->dests[0].port = shdr->src;
+ swift_addr->dests[0].addr = ip_hdr(skb)->saddr;
- log_debug("Setting sin_port=%u, sin_addr=%u\n", ntohs(shdr->src), swift_addr->sin_addr.s_addr);
+ log_debug("Setting sin_port=%u, sin_addr=%u\n", ntohs(shdr->src), swift_addr->dests[0].addr);
err = ip_queue_rcv_skb((struct sock *) &ssk->sock, skb);
if (unlikely(err)) {
--- /dev/null
+#include "../src/kernel/swift.h"
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+
+int main(int argc, const char *argv[])
+{
+ int sock;
+
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
+ if (sock < 0) {
+ perror("Failed to create socket");
+ return -1;
+ }
+
+ int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest);
+ struct sockaddr_swift *saddr = malloc(size);
+ memset(saddr, 0, size);
+
+ saddr->count = 1;
+ saddr->dests[0].addr = 0x0100007F;
+ saddr->dests[0].port = 50;
+
+ if (bind(sock, (struct sockaddr *) saddr, size) < 0) {
+ perror("Failed to bind socket");
+ close(sock);
+ return -1;
+ }
+
+ char buf[] = "Buffer de test";
+ struct iovec iov[1];
+ struct msghdr msg;
+ struct sockaddr_swift *to = malloc(size);
+
+ memset(&msg, 0, sizeof(msg));
+ memset(&iov, 0, sizeof(iov));
+ memset(to, 0, size);
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = sizeof(buf);
+
+ to->count = 1;
+ to->dests[0].addr = 0x0100007F;
+ to->dests[0].port = 100;
+
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = to;
+ msg.msg_namelen = size;
+
+ int ret;
+
+ ret = sendmsg(sock, &msg, sizeof(msg));
+ if (ret < 0) {
+ perror("Failed to send on socket");
+ return -1;
+ }
+
+ printf("Sent %d bytes on socket\n", msg.msg_namelen);
+
+ if (close(sock) < 0) {
+ perror("Failed to close socket");
+ return -1;
+ }
+
+ free(saddr);
+ free(to);
+ return 0;
+}
--- /dev/null
+#include "../src/kernel/swift.h"
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <stdlib.h>
+
+int main(int argc, const char *argv[])
+{
+ int sock;
+
+ sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_SWIFT);
+ if (sock < 0) {
+ perror("Failed to create socket");
+ return -1;
+ }
+
+ int size = sizeof(struct sockaddr_swift) + sizeof(struct swift_dest);
+ struct sockaddr_swift *saddr = malloc(size);
+ memset(saddr, 0, size);
+
+ saddr->count = 1;
+ saddr->dests[0].addr = 0x0100007F;
+ saddr->dests[0].port = 100;
+
+ if (bind(sock, (struct sockaddr *) saddr, size) < 0) {
+ perror("Failed to bind socket");
+ close(sock);
+ return -1;
+ }
+
+ char buf[256];
+ struct iovec iov[1];
+ struct msghdr msg;
+ 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);
+
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 1;
+ msg.msg_name = from;
+ msg.msg_namelen = size;
+
+ int ret, fromlen;
+
+ ret = recvmsg(sock, &msg, 0);
+ if (ret < 0) {
+ perror("Failed to recv on socket");
+ return -1;
+ }
+
+ printf("Received %d bytes on socket\n", ret);
+ printf("buf=%s\n", buf);
+
+ if (close(sock) < 0) {
+ perror("Failed to close socket");
+ return -1;
+ }
+
+ free(saddr);
+ free(from);
+
+ return 0;
+}