From 495b4861e15d121f54ea16950964866e4c8b0e07 Mon Sep 17 00:00:00 2001 From: HappyZ Date: Sun, 25 Sep 2016 22:58:41 -0700 Subject: [PATCH] put up offloading binaries need to further optimize them --- OffloadingDemo/.idea/misc.xml | 2 +- OffloadingDemo/mobile/mobile.iml | 1 - OffloadingDemo/wear/wear.iml | 1 - offloading_binaries/BypassL3Binary/Makefile | 21 ++ offloading_binaries/BypassL3Binary/bypassl3 | Bin 0 -> 51224 bytes offloading_binaries/BypassL3Binary/main.c | 206 ++++++++++++++++++ offloading_binaries/BypassL3_lo/Makefile | 21 ++ offloading_binaries/BypassL3_lo/bypassl3_lo | Bin 0 -> 51224 bytes offloading_binaries/BypassL3_lo/main.c | 206 ++++++++++++++++++ offloading_binaries/BypassL3_lo/main.o | Bin 0 -> 4888 bytes offloading_binaries/BypassL3_recv/Makefile | 20 ++ .../BypassL3_recv/bypassl3_recv | Bin 0 -> 45804 bytes offloading_binaries/BypassL3_recv/main.c | 125 +++++++++++ offloading_binaries/BypassL3_recv/main.o | Bin 0 -> 3556 bytes offloading_binaries/BypassL3_recv_lo/Makefile | 20 ++ .../BypassL3_recv_lo/bypassl3_recv_lo | Bin 0 -> 45804 bytes offloading_binaries/BypassL3_recv_lo/main.c | 125 +++++++++++ offloading_binaries/BypassL3_recv_lo/main.o | Bin 0 -> 3556 bytes offloading_binaries/BypassL3_usb/Makefile | 21 ++ offloading_binaries/BypassL3_usb/bypassl3_usb | Bin 0 -> 51224 bytes offloading_binaries/BypassL3_usb/main.c | 206 ++++++++++++++++++ offloading_binaries/BypassL3_usb/main.o | Bin 0 -> 4888 bytes offloading_binaries/Normal/Makefile | 23 ++ offloading_binaries/Normal/main.c | 126 +++++++++++ offloading_binaries/Normal/main.o | Bin 0 -> 3720 bytes offloading_binaries/Normal/normal | Bin 0 -> 51180 bytes offloading_binaries/Normal_donothing/Makefile | 21 ++ offloading_binaries/Normal_donothing/main.c | 130 +++++++++++ .../Normal_donothing/normal_readonly | Bin 0 -> 74704 bytes offloading_binaries/Normal_lo/Makefile | 23 ++ offloading_binaries/Normal_lo/main.c | 131 +++++++++++ offloading_binaries/Normal_lo/main.o | Bin 0 -> 3724 bytes offloading_binaries/Normal_lo/normal_lo | Bin 0 -> 51180 bytes offloading_binaries/Normal_memory/Makefile | 20 ++ offloading_binaries/Normal_memory/main.c | 100 +++++++++ .../Normal_memory/normal_memory | Bin 0 -> 12772 bytes offloading_binaries/Normal_recv/Makefile | 20 ++ offloading_binaries/Normal_recv/main.c | 102 +++++++++ offloading_binaries/Normal_recv/normal_recv | Bin 0 -> 12772 bytes offloading_binaries/Normal_recv_lo/Makefile | 20 ++ offloading_binaries/Normal_recv_lo/main.c | 102 +++++++++ offloading_binaries/Normal_recv_lo/main.o | Bin 0 -> 2992 bytes .../Normal_recv_lo/normal_recv_lo | Bin 0 -> 12772 bytes offloading_binaries/Normal_udp/Makefile | 21 ++ offloading_binaries/Normal_udp/main.c | 123 +++++++++++ offloading_binaries/Normal_udp/main.o | Bin 0 -> 3604 bytes offloading_binaries/Normal_udp/normal_udp | Bin 0 -> 51092 bytes offloading_binaries/Normal_udp_lo/Makefile | 21 ++ offloading_binaries/Normal_udp_lo/main.c | 124 +++++++++++ offloading_binaries/Normal_udp_lo/main.o | Bin 0 -> 3608 bytes .../Normal_udp_lo/normal_udp_lo | Bin 0 -> 51092 bytes offloading_binaries/Normal_udp_recv/Makefile | 21 ++ offloading_binaries/Normal_udp_recv/main.c | 111 ++++++++++ offloading_binaries/Normal_udp_recv/main.o | Bin 0 -> 2912 bytes .../Normal_udp_recv/normal_udp_recv | Bin 0 -> 12776 bytes .../Normal_udp_recv_lo/Makefile | 21 ++ offloading_binaries/Normal_udp_recv_lo/main.c | 111 ++++++++++ offloading_binaries/Normal_udp_recv_lo/main.o | Bin 0 -> 2912 bytes .../Normal_udp_recv_lo/normal_udp_recv_lo | Bin 0 -> 12776 bytes offloading_binaries/Normal_udp_usb/Makefile | 21 ++ offloading_binaries/Normal_udp_usb/main.c | 124 +++++++++++ offloading_binaries/Normal_udp_usb/main.o | Bin 0 -> 3600 bytes .../Normal_udp_usb/normal_udp_usb | Bin 0 -> 51092 bytes offloading_binaries/Normal_usb/Makefile | 23 ++ offloading_binaries/Normal_usb/main.c | 131 +++++++++++ offloading_binaries/Normal_usb/main.o | Bin 0 -> 3720 bytes offloading_binaries/Normal_usb/normal_usb | Bin 0 -> 51180 bytes offloading_binaries/Sendfile/Makefile | 20 ++ offloading_binaries/Sendfile/main.c | 127 +++++++++++ offloading_binaries/Sendfile/old.c_orig | 94 ++++++++ offloading_binaries/Sendfile/sendfile | Bin 0 -> 51160 bytes offloading_binaries/Sendfile_lo/Makefile | 20 ++ offloading_binaries/Sendfile_lo/main.c | 128 +++++++++++ offloading_binaries/Sendfile_lo/main.o | Bin 0 -> 3396 bytes offloading_binaries/Sendfile_lo/old.c_orig | 94 ++++++++ offloading_binaries/Sendfile_lo/sendfile_lo | Bin 0 -> 51160 bytes offloading_binaries/Sendfile_usb/Makefile | 20 ++ offloading_binaries/Sendfile_usb/main.c | 128 +++++++++++ offloading_binaries/Sendfile_usb/main.o | Bin 0 -> 3392 bytes offloading_binaries/Sendfile_usb/sendfile_usb | Bin 0 -> 51160 bytes offloading_binaries/Splice/Makefile | 20 ++ offloading_binaries/Splice/main.c | 172 +++++++++++++++ offloading_binaries/Splice/splice | Bin 0 -> 51208 bytes offloading_binaries/Splice_lo/Makefile | 20 ++ offloading_binaries/Splice_lo/main.c | 172 +++++++++++++++ offloading_binaries/Splice_lo/main.o | Bin 0 -> 3884 bytes offloading_binaries/Splice_lo/splice_lo | Bin 0 -> 51208 bytes offloading_binaries/Splice_recv/Makefile | 20 ++ offloading_binaries/Splice_recv/main.c | 177 +++++++++++++++ offloading_binaries/Splice_recv/splice_recv | Bin 0 -> 12824 bytes offloading_binaries/Splice_recv_lo/Makefile | 20 ++ offloading_binaries/Splice_recv_lo/main.c | 176 +++++++++++++++ offloading_binaries/Splice_recv_lo/main.o | Bin 0 -> 3492 bytes .../Splice_recv_lo/splice_recv_lo | Bin 0 -> 12824 bytes .../TCPReceiver_mobile/Makefile | 21 ++ .../TCPReceiver_mobile/TCPReceiver_mobile | Bin 0 -> 12772 bytes offloading_binaries/TCPReceiver_mobile/main.c | 121 ++++++++++ offloading_binaries/TCPReceiver_mobile/main.o | Bin 0 -> 2992 bytes offloading_binaries/TCPSender_mobile/Makefile | 21 ++ .../TCPSender_mobile/TCPSender_mobile | Bin 0 -> 51180 bytes offloading_binaries/TCPSender_mobile/main.c | 133 +++++++++++ offloading_binaries/TCPSender_mobile/main.o | Bin 0 -> 3532 bytes offloading_binaries/TCPServer/Makefile | 20 ++ offloading_binaries/TCPServer/TCPServer | Bin 0 -> 13472 bytes offloading_binaries/TCPServer/main.c | 133 +++++++++++ offloading_binaries/TCPServer/main.o | Bin 0 -> 3744 bytes .../UDPReceiver_mobile/Makefile | 21 ++ .../UDPReceiver_mobile/UDPReceiver_mobile | Bin 0 -> 6456 bytes offloading_binaries/UDPReceiver_mobile/main.c | 97 +++++++++ offloading_binaries/UDPReceiver_mobile/main.o | Bin 0 -> 2024 bytes offloading_binaries/UDPSender/Makefile | 20 ++ offloading_binaries/UDPSender/UDPSender | Bin 0 -> 9100 bytes offloading_binaries/UDPSender/main.c | 125 +++++++++++ offloading_binaries/UDPServer/Makefile | 20 ++ offloading_binaries/UDPServer/UDPServer | Bin 0 -> 13484 bytes offloading_binaries/UDPServer/main.c | 149 +++++++++++++ offloading_binaries/UDPServer/main.o | Bin 0 -> 4320 bytes offloading_binaries/UDPServer_mobile/Makefile | 21 ++ .../UDPServer_mobile/UDPServer_mobile | Bin 0 -> 51164 bytes offloading_binaries/UDPServer_mobile/main.c | 149 +++++++++++++ offloading_binaries/UDPServer_mobile/main.o | Bin 0 -> 4192 bytes offloading_binaries/old/parseSS.py | 45 ++++ 122 files changed, 5146 insertions(+), 3 deletions(-) create mode 100644 offloading_binaries/BypassL3Binary/Makefile create mode 100755 offloading_binaries/BypassL3Binary/bypassl3 create mode 100644 offloading_binaries/BypassL3Binary/main.c create mode 100644 offloading_binaries/BypassL3_lo/Makefile create mode 100755 offloading_binaries/BypassL3_lo/bypassl3_lo create mode 100644 offloading_binaries/BypassL3_lo/main.c create mode 100644 offloading_binaries/BypassL3_lo/main.o create mode 100644 offloading_binaries/BypassL3_recv/Makefile create mode 100755 offloading_binaries/BypassL3_recv/bypassl3_recv create mode 100644 offloading_binaries/BypassL3_recv/main.c create mode 100644 offloading_binaries/BypassL3_recv/main.o create mode 100644 offloading_binaries/BypassL3_recv_lo/Makefile create mode 100755 offloading_binaries/BypassL3_recv_lo/bypassl3_recv_lo create mode 100644 offloading_binaries/BypassL3_recv_lo/main.c create mode 100644 offloading_binaries/BypassL3_recv_lo/main.o create mode 100644 offloading_binaries/BypassL3_usb/Makefile create mode 100755 offloading_binaries/BypassL3_usb/bypassl3_usb create mode 100644 offloading_binaries/BypassL3_usb/main.c create mode 100644 offloading_binaries/BypassL3_usb/main.o create mode 100644 offloading_binaries/Normal/Makefile create mode 100644 offloading_binaries/Normal/main.c create mode 100644 offloading_binaries/Normal/main.o create mode 100755 offloading_binaries/Normal/normal create mode 100644 offloading_binaries/Normal_donothing/Makefile create mode 100644 offloading_binaries/Normal_donothing/main.c create mode 100755 offloading_binaries/Normal_donothing/normal_readonly create mode 100644 offloading_binaries/Normal_lo/Makefile create mode 100644 offloading_binaries/Normal_lo/main.c create mode 100644 offloading_binaries/Normal_lo/main.o create mode 100755 offloading_binaries/Normal_lo/normal_lo create mode 100644 offloading_binaries/Normal_memory/Makefile create mode 100644 offloading_binaries/Normal_memory/main.c create mode 100755 offloading_binaries/Normal_memory/normal_memory create mode 100644 offloading_binaries/Normal_recv/Makefile create mode 100644 offloading_binaries/Normal_recv/main.c create mode 100755 offloading_binaries/Normal_recv/normal_recv create mode 100644 offloading_binaries/Normal_recv_lo/Makefile create mode 100644 offloading_binaries/Normal_recv_lo/main.c create mode 100644 offloading_binaries/Normal_recv_lo/main.o create mode 100755 offloading_binaries/Normal_recv_lo/normal_recv_lo create mode 100644 offloading_binaries/Normal_udp/Makefile create mode 100644 offloading_binaries/Normal_udp/main.c create mode 100644 offloading_binaries/Normal_udp/main.o create mode 100755 offloading_binaries/Normal_udp/normal_udp create mode 100644 offloading_binaries/Normal_udp_lo/Makefile create mode 100644 offloading_binaries/Normal_udp_lo/main.c create mode 100644 offloading_binaries/Normal_udp_lo/main.o create mode 100755 offloading_binaries/Normal_udp_lo/normal_udp_lo create mode 100644 offloading_binaries/Normal_udp_recv/Makefile create mode 100644 offloading_binaries/Normal_udp_recv/main.c create mode 100644 offloading_binaries/Normal_udp_recv/main.o create mode 100755 offloading_binaries/Normal_udp_recv/normal_udp_recv create mode 100644 offloading_binaries/Normal_udp_recv_lo/Makefile create mode 100644 offloading_binaries/Normal_udp_recv_lo/main.c create mode 100644 offloading_binaries/Normal_udp_recv_lo/main.o create mode 100755 offloading_binaries/Normal_udp_recv_lo/normal_udp_recv_lo create mode 100644 offloading_binaries/Normal_udp_usb/Makefile create mode 100644 offloading_binaries/Normal_udp_usb/main.c create mode 100644 offloading_binaries/Normal_udp_usb/main.o create mode 100755 offloading_binaries/Normal_udp_usb/normal_udp_usb create mode 100644 offloading_binaries/Normal_usb/Makefile create mode 100644 offloading_binaries/Normal_usb/main.c create mode 100644 offloading_binaries/Normal_usb/main.o create mode 100755 offloading_binaries/Normal_usb/normal_usb create mode 100644 offloading_binaries/Sendfile/Makefile create mode 100644 offloading_binaries/Sendfile/main.c create mode 100644 offloading_binaries/Sendfile/old.c_orig create mode 100755 offloading_binaries/Sendfile/sendfile create mode 100644 offloading_binaries/Sendfile_lo/Makefile create mode 100644 offloading_binaries/Sendfile_lo/main.c create mode 100644 offloading_binaries/Sendfile_lo/main.o create mode 100644 offloading_binaries/Sendfile_lo/old.c_orig create mode 100755 offloading_binaries/Sendfile_lo/sendfile_lo create mode 100644 offloading_binaries/Sendfile_usb/Makefile create mode 100644 offloading_binaries/Sendfile_usb/main.c create mode 100644 offloading_binaries/Sendfile_usb/main.o create mode 100755 offloading_binaries/Sendfile_usb/sendfile_usb create mode 100644 offloading_binaries/Splice/Makefile create mode 100644 offloading_binaries/Splice/main.c create mode 100755 offloading_binaries/Splice/splice create mode 100644 offloading_binaries/Splice_lo/Makefile create mode 100644 offloading_binaries/Splice_lo/main.c create mode 100644 offloading_binaries/Splice_lo/main.o create mode 100755 offloading_binaries/Splice_lo/splice_lo create mode 100644 offloading_binaries/Splice_recv/Makefile create mode 100644 offloading_binaries/Splice_recv/main.c create mode 100755 offloading_binaries/Splice_recv/splice_recv create mode 100644 offloading_binaries/Splice_recv_lo/Makefile create mode 100644 offloading_binaries/Splice_recv_lo/main.c create mode 100644 offloading_binaries/Splice_recv_lo/main.o create mode 100755 offloading_binaries/Splice_recv_lo/splice_recv_lo create mode 100644 offloading_binaries/TCPReceiver_mobile/Makefile create mode 100755 offloading_binaries/TCPReceiver_mobile/TCPReceiver_mobile create mode 100644 offloading_binaries/TCPReceiver_mobile/main.c create mode 100644 offloading_binaries/TCPReceiver_mobile/main.o create mode 100644 offloading_binaries/TCPSender_mobile/Makefile create mode 100755 offloading_binaries/TCPSender_mobile/TCPSender_mobile create mode 100644 offloading_binaries/TCPSender_mobile/main.c create mode 100644 offloading_binaries/TCPSender_mobile/main.o create mode 100644 offloading_binaries/TCPServer/Makefile create mode 100755 offloading_binaries/TCPServer/TCPServer create mode 100644 offloading_binaries/TCPServer/main.c create mode 100644 offloading_binaries/TCPServer/main.o create mode 100644 offloading_binaries/UDPReceiver_mobile/Makefile create mode 100755 offloading_binaries/UDPReceiver_mobile/UDPReceiver_mobile create mode 100644 offloading_binaries/UDPReceiver_mobile/main.c create mode 100644 offloading_binaries/UDPReceiver_mobile/main.o create mode 100644 offloading_binaries/UDPSender/Makefile create mode 100755 offloading_binaries/UDPSender/UDPSender create mode 100644 offloading_binaries/UDPSender/main.c create mode 100644 offloading_binaries/UDPServer/Makefile create mode 100755 offloading_binaries/UDPServer/UDPServer create mode 100644 offloading_binaries/UDPServer/main.c create mode 100644 offloading_binaries/UDPServer/main.o create mode 100644 offloading_binaries/UDPServer_mobile/Makefile create mode 100755 offloading_binaries/UDPServer_mobile/UDPServer_mobile create mode 100644 offloading_binaries/UDPServer_mobile/main.c create mode 100644 offloading_binaries/UDPServer_mobile/main.o create mode 100755 offloading_binaries/old/parseSS.py diff --git a/OffloadingDemo/.idea/misc.xml b/OffloadingDemo/.idea/misc.xml index 95f0f03..1caa136 100755 --- a/OffloadingDemo/.idea/misc.xml +++ b/OffloadingDemo/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/OffloadingDemo/mobile/mobile.iml b/OffloadingDemo/mobile/mobile.iml index bd78d65..ece0ef9 100755 --- a/OffloadingDemo/mobile/mobile.iml +++ b/OffloadingDemo/mobile/mobile.iml @@ -82,7 +82,6 @@ - diff --git a/OffloadingDemo/wear/wear.iml b/OffloadingDemo/wear/wear.iml index 37ff89b..57a96cb 100755 --- a/OffloadingDemo/wear/wear.iml +++ b/OffloadingDemo/wear/wear.iml @@ -94,7 +94,6 @@ - diff --git a/offloading_binaries/BypassL3Binary/Makefile b/offloading_binaries/BypassL3Binary/Makefile new file mode 100644 index 0000000..7b6c665 --- /dev/null +++ b/offloading_binaries/BypassL3Binary/Makefile @@ -0,0 +1,21 @@ +CC = arm-linux-androideabi-gcc +#CC = gcc +CFLAGS = -pie -fPIE -lm +TARGET = bypassl3 + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/BypassL3Binary/bypassl3 b/offloading_binaries/BypassL3Binary/bypassl3 new file mode 100755 index 0000000000000000000000000000000000000000..5189a90e5818a2dda67113d8b15874d1379e7cb3 GIT binary patch literal 51224 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 WqjZ3X$=bW#!i|1+?x{J!n))yF*uORa literal 0 HcmV?d00001 diff --git a/offloading_binaries/BypassL3Binary/main.c b/offloading_binaries/BypassL3Binary/main.c new file mode 100644 index 0000000..fba88fe --- /dev/null +++ b/offloading_binaries/BypassL3Binary/main.c @@ -0,0 +1,206 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +//#define DEFAULT_IF "eth1" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1500, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start, t_end, t_now; + + if (argc > 4) + sendsize = atoi(argv[4]); + + if (argc > 1) + packet_num = atoi(argv[1])/sendsize; + else + packet_num = 166666; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else { + printf("Usage: ./bypassl3 "); + exit(-1); + } + + if (argc > 3) { + /* get the name of the interface */ + strcpy(ifName, argv[3]); + } else { + strcpy(ifName, DEFAULT_IF); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + + /* Open RAW socket to send on */ + //sendsize -= 14; + //if ((sockfd = socket(AF_PACKET, SOCK_DGRAM, IPPROTO_RAW)) == -1) { + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) { + perror("socket"); + } + + /* Get the index of the interface to send on */ + memset(&if_idx, 0, sizeof(struct ifreq)); + strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) + perror("SIOCGIFINDEX"); + /* Get the MAC address of the interface to send on */ + memset(&if_mac, 0, sizeof(struct ifreq)); + strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0) + perror("SIOCGIFHWADDR"); + + /* Construct the Ethernet header */ + memset(sendbuf, 0, BUF_SIZ); + /* Ethernet header */ + + eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0]; + eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1]; + eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2]; + eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3]; + eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4]; + eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5]; + eh->ether_dhost[0] = MY_DEST_MAC0; + eh->ether_dhost[1] = MY_DEST_MAC1; + eh->ether_dhost[2] = MY_DEST_MAC2; + eh->ether_dhost[3] = MY_DEST_MAC3; + eh->ether_dhost[4] = MY_DEST_MAC4; + eh->ether_dhost[5] = MY_DEST_MAC5; + eh->ether_type = htons(ETH_P_IP); + tx_len += sizeof(struct ether_header); + + + /* Packet data */ + /* + sendbuf[tx_len++] = 0xde; + sendbuf[tx_len++] = 0xad; + sendbuf[tx_len++] = 0xbe; + sendbuf[tx_len++] = 0xef; + */ + + /* Index of the network device */ + socket_address.sll_ifindex = if_idx.ifr_ifindex; + /* Address length*/ + socket_address.sll_halen = ETH_ALEN; + /* Destination MAC */ + socket_address.sll_addr[0] = MY_DEST_MAC0; + socket_address.sll_addr[1] = MY_DEST_MAC1; + socket_address.sll_addr[2] = MY_DEST_MAC2; + socket_address.sll_addr[3] = MY_DEST_MAC3; + socket_address.sll_addr[4] = MY_DEST_MAC4; + socket_address.sll_addr[5] = MY_DEST_MAC5; + //test + //socket_address.sll_family = AF_PACKET; + //socket_address.sll_protocol = htons(ETH_P_ALL); + +// fd = open("bigfile"); + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + /* + if (bind(sockfd,(struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) == -1) + { + perror("bind error.\n"); + exit(1); + } + */ + /* Send packet */ + gettimeofday(&t_start, NULL); + read(fd, sendbuf+tx_len, sendsize-tx_len); + for (i = 0; i < packet_num;) + { + if (((packet_num - i) * sendsize) < quota) + { + quota = (packet_num - i) * sendsize; + } + + while (sentInSlot < quota) + { + //ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + //printf("%d\t%d\n", ret, errno); + //read(fd, sendbuf, sendsize); + ret = sendto(sockfd, sendbuf, sendsize, MSG_DONTWAIT, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)); +// printf("%d\t%d\n", ret, errno); + if (ret == sendsize) + { + read(fd, sendbuf+tx_len, sendsize-tx_len); + i++; + sentInSlot = sentInSlot + ret; + } + else + { + //printf("sendto error\n"); + usleep(100); + } + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", i, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + } + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + + return 0; +} diff --git a/offloading_binaries/BypassL3_lo/Makefile b/offloading_binaries/BypassL3_lo/Makefile new file mode 100644 index 0000000..8937390 --- /dev/null +++ b/offloading_binaries/BypassL3_lo/Makefile @@ -0,0 +1,21 @@ +CC = arm-linux-androideabi-gcc +#CC = gcc +CFLAGS = -pie -fPIE -lm +TARGET = bypassl3_lo + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/BypassL3_lo/bypassl3_lo b/offloading_binaries/BypassL3_lo/bypassl3_lo new file mode 100755 index 0000000000000000000000000000000000000000..5189a90e5818a2dda67113d8b15874d1379e7cb3 GIT binary patch literal 51224 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 WqjZ3X$=bW#!i|1+?x{J!n))yF*uORa literal 0 HcmV?d00001 diff --git a/offloading_binaries/BypassL3_lo/main.c b/offloading_binaries/BypassL3_lo/main.c new file mode 100644 index 0000000..fba88fe --- /dev/null +++ b/offloading_binaries/BypassL3_lo/main.c @@ -0,0 +1,206 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +//#define DEFAULT_IF "eth1" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1500, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start, t_end, t_now; + + if (argc > 4) + sendsize = atoi(argv[4]); + + if (argc > 1) + packet_num = atoi(argv[1])/sendsize; + else + packet_num = 166666; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else { + printf("Usage: ./bypassl3 "); + exit(-1); + } + + if (argc > 3) { + /* get the name of the interface */ + strcpy(ifName, argv[3]); + } else { + strcpy(ifName, DEFAULT_IF); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + + /* Open RAW socket to send on */ + //sendsize -= 14; + //if ((sockfd = socket(AF_PACKET, SOCK_DGRAM, IPPROTO_RAW)) == -1) { + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) { + perror("socket"); + } + + /* Get the index of the interface to send on */ + memset(&if_idx, 0, sizeof(struct ifreq)); + strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) + perror("SIOCGIFINDEX"); + /* Get the MAC address of the interface to send on */ + memset(&if_mac, 0, sizeof(struct ifreq)); + strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0) + perror("SIOCGIFHWADDR"); + + /* Construct the Ethernet header */ + memset(sendbuf, 0, BUF_SIZ); + /* Ethernet header */ + + eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0]; + eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1]; + eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2]; + eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3]; + eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4]; + eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5]; + eh->ether_dhost[0] = MY_DEST_MAC0; + eh->ether_dhost[1] = MY_DEST_MAC1; + eh->ether_dhost[2] = MY_DEST_MAC2; + eh->ether_dhost[3] = MY_DEST_MAC3; + eh->ether_dhost[4] = MY_DEST_MAC4; + eh->ether_dhost[5] = MY_DEST_MAC5; + eh->ether_type = htons(ETH_P_IP); + tx_len += sizeof(struct ether_header); + + + /* Packet data */ + /* + sendbuf[tx_len++] = 0xde; + sendbuf[tx_len++] = 0xad; + sendbuf[tx_len++] = 0xbe; + sendbuf[tx_len++] = 0xef; + */ + + /* Index of the network device */ + socket_address.sll_ifindex = if_idx.ifr_ifindex; + /* Address length*/ + socket_address.sll_halen = ETH_ALEN; + /* Destination MAC */ + socket_address.sll_addr[0] = MY_DEST_MAC0; + socket_address.sll_addr[1] = MY_DEST_MAC1; + socket_address.sll_addr[2] = MY_DEST_MAC2; + socket_address.sll_addr[3] = MY_DEST_MAC3; + socket_address.sll_addr[4] = MY_DEST_MAC4; + socket_address.sll_addr[5] = MY_DEST_MAC5; + //test + //socket_address.sll_family = AF_PACKET; + //socket_address.sll_protocol = htons(ETH_P_ALL); + +// fd = open("bigfile"); + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + /* + if (bind(sockfd,(struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) == -1) + { + perror("bind error.\n"); + exit(1); + } + */ + /* Send packet */ + gettimeofday(&t_start, NULL); + read(fd, sendbuf+tx_len, sendsize-tx_len); + for (i = 0; i < packet_num;) + { + if (((packet_num - i) * sendsize) < quota) + { + quota = (packet_num - i) * sendsize; + } + + while (sentInSlot < quota) + { + //ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + //printf("%d\t%d\n", ret, errno); + //read(fd, sendbuf, sendsize); + ret = sendto(sockfd, sendbuf, sendsize, MSG_DONTWAIT, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)); +// printf("%d\t%d\n", ret, errno); + if (ret == sendsize) + { + read(fd, sendbuf+tx_len, sendsize-tx_len); + i++; + sentInSlot = sentInSlot + ret; + } + else + { + //printf("sendto error\n"); + usleep(100); + } + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", i, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + } + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + + return 0; +} diff --git a/offloading_binaries/BypassL3_lo/main.o b/offloading_binaries/BypassL3_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..b92680cb331b72ffc88a0ecfe06eaa27c5738435 GIT binary patch literal 4888 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define ETHER_TYPE 0x0800 /* Customize */ + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + struct iovec iov; + int sockfd, socktrigger; + int sockopt; + struct ifreq ifopts; /* set promiscuous mode */ + struct ifreq if_ip; /* get ip addr */ + ssize_t numbytes; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + struct sockaddr_in servaddr; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1500, packet_num, offset = 0, port = 32000; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + /* Get interface name */ + strcpy(ifName, DEFAULT_IF); + + if (argc > 1) + packet_num = atoi(argv[1])/sendsize; + else + packet_num = 166666; + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(port); + sendto(sockfd, "0\n",strlen("0\n"),0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + + if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { + perror("listener: socket"); + return -1; + } + + strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1); + ioctl(sockfd, SIOCGIFFLAGS, &ifopts); + ifopts.ifr_flags |= IFF_PROMISC; + ioctl(sockfd, SIOCSIFFLAGS, &ifopts); + + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) { + perror("setsockopt"); + close(sockfd); + exit(EXIT_FAILURE); + } + + if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1) { + perror("SO_BINDTODEVICE"); + close(sockfd); + exit(EXIT_FAILURE); + } + + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + /* Recv packet */ + gettimeofday(&t_start, NULL); + for (i = 0; i < packet_num;) + { + + numbytes = recvfrom(sockfd, sendbuf, sendsize, 0, NULL, NULL); + //printf("listener: got packet %lu bytes\n", numbytes); + + if (sendbuf[50] == '0') + { + write(fd, sendbuf, sendsize); + i++; + } + else + { + usleep(100); + } + } + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + return 0; +} diff --git a/offloading_binaries/BypassL3_recv/main.o b/offloading_binaries/BypassL3_recv/main.o new file mode 100644 index 0000000000000000000000000000000000000000..b19ea68b8a868502f0e5a156ad256593074075f9 GIT binary patch literal 3556 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define ETHER_TYPE 0x0800 /* Customize */ + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + struct iovec iov; + int sockfd, socktrigger; + int sockopt; + struct ifreq ifopts; /* set promiscuous mode */ + struct ifreq if_ip; /* get ip addr */ + ssize_t numbytes; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + struct sockaddr_in servaddr; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1500, packet_num, offset = 0, port = 32000; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + /* Get interface name */ + strcpy(ifName, DEFAULT_IF); + + if (argc > 1) + packet_num = atoi(argv[1])/sendsize; + else + packet_num = 166666; + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(port); + sendto(sockfd, "0\n",strlen("0\n"),0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + + if ((sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) { + perror("listener: socket"); + return -1; + } + + strncpy(ifopts.ifr_name, ifName, IFNAMSIZ-1); + ioctl(sockfd, SIOCGIFFLAGS, &ifopts); + ifopts.ifr_flags |= IFF_PROMISC; + ioctl(sockfd, SIOCSIFFLAGS, &ifopts); + + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof sockopt) == -1) { + perror("setsockopt"); + close(sockfd); + exit(EXIT_FAILURE); + } + + if (setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, ifName, IFNAMSIZ-1) == -1) { + perror("SO_BINDTODEVICE"); + close(sockfd); + exit(EXIT_FAILURE); + } + + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + /* Recv packet */ + gettimeofday(&t_start, NULL); + for (i = 0; i < packet_num;) + { + + numbytes = recvfrom(sockfd, sendbuf, sendsize, 0, NULL, NULL); + //printf("listener: got packet %lu bytes\n", numbytes); + + if (sendbuf[50] == '0') + { + write(fd, sendbuf, sendsize); + i++; + } + else + { + usleep(100); + } + } + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + return 0; +} diff --git a/offloading_binaries/BypassL3_recv_lo/main.o b/offloading_binaries/BypassL3_recv_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0c85b10b523c259fc6a23e1f3ea52bee02e54b6f GIT binary patch literal 3556 zcma)7U2GIp6h5=F#TF_or3n2IM_J5*uuMyf3#m!}0b3~2YDh?2rn^(RVY{>0okB@4 zA~gmh4MutJp$QwFc)+B=CN@S4i9GP22_`-e)TF!X22^5V;sX!H`kmQ(+v&svZZiAb z@1Aq-{m!}f+&6*uauO7Fc^_G^Q0qld57CkqrnM28+)U-Irr`FvfnQ ze_B#0m;ZNR;ScPQ=YBBIP?EeBdm;YcC!mA-KFSq+fn1TaT#})Q$y+EE}l1T|E<1)AF+{$Ux7Z3yBha`*XH}d`ksNlbIr@o ziT7k51#vODHL^C+$~omV>x5SKdM!^_Z==f|fM(t!g1Z+HIa>)$|1>RWlKVVz#x6g& zhP(cM`Xb07-!+0RwnI}ffP4M|avi+Yu&hSQ_j#(s=oj&D?yHe!p2zdsph@28*Y!c% zqroC;bJuzVx#D?2t(>y}#{hl2FV|XJ?s$^W#l@YSTKdADA<*DY<`;=XgJ zZJ!=nRznKTPTm#Pe@`#x5dFMkYsWo0yi{vnyVje1iuEpd*7GB$6^PNvsb`Pl@Rc?0 zhphtIWbQe(>btnZ7j8Zbq7Z(@_qU&D0B@;8{rJ{>NK}jOJ0HJ+w1!*v8JJ6*H1M?XmRE;lzoNMAD3&#=P;AF`P6t+tRGG znbPc0Q)62g+t8Ne2m{f+uCBdWXy2hXw`winJzBHg)S^e4U)4hCjF~Z$rja$bQpYxU z8m2LvAVovBqIIZ;R`@HGDy7C>tE^Wxs2i0!rQWw`1%Z+iG`5C6f#?|b;Xhd=P}KRw*nLDB$|jPPA!q<_+mdkHlAD}Zm&2Nc6K7ewh|=DKan!+C~t{ZAQiVQN}HLC z1!iYbu{1W4SKPv3U zh23V{M0AZ2f1opB{0^gr^-$i8FA}vezC<*{xS42z5%y`uHAHiaIP6D)SE5!L*WzQW zA?jufB2Hl47Q_Wq@r?>h3QP+;EAX7a_XS=Q_%X2lWungnM+Tm%Aw=gzldnb#IM=mo zknc23X%)V9hY?-JYtLuIk3PV8_4u9JA~@3Jw7aggcz}Jm@tef{Px8~@!*g(~PUH2i zi#~(Y7eSx>*q_^31cY=fHn#ECAy68w%D}|{`*7no5ZclX!4Lbn-%;s@BVCMveZPmF p!5z`0AES(cO*)?KGzM0ok8AJ5f$QSrSmp$ja!7iWTm)Qp{{stXYHt7l literal 0 HcmV?d00001 diff --git a/offloading_binaries/BypassL3_usb/Makefile b/offloading_binaries/BypassL3_usb/Makefile new file mode 100644 index 0000000..34e1833 --- /dev/null +++ b/offloading_binaries/BypassL3_usb/Makefile @@ -0,0 +1,21 @@ +CC = arm-linux-androideabi-gcc +#CC = gcc +CFLAGS = -pie -fPIE -lm +TARGET = bypassl3_usb + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/BypassL3_usb/bypassl3_usb b/offloading_binaries/BypassL3_usb/bypassl3_usb new file mode 100755 index 0000000000000000000000000000000000000000..139a0aec5928b91296add1a231c5d2b59c90cce8 GIT binary patch literal 51224 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 V2Z)%gz3VO9=y&IyniH(4{{l@}z9Iks literal 0 HcmV?d00001 diff --git a/offloading_binaries/BypassL3_usb/main.c b/offloading_binaries/BypassL3_usb/main.c new file mode 100644 index 0000000..77fefdd --- /dev/null +++ b/offloading_binaries/BypassL3_usb/main.c @@ -0,0 +1,206 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "usb0" +//#define DEFAULT_IF "eth1" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1500, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start, t_end, t_now; + + if (argc > 4) + sendsize = atoi(argv[4]); + + if (argc > 1) + packet_num = atoi(argv[1])/sendsize; + else + packet_num = 166666; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else { + printf("Usage: ./bypassl3 "); + exit(-1); + } + + if (argc > 3) { + /* get the name of the interface */ + strcpy(ifName, argv[3]); + } else { + strcpy(ifName, DEFAULT_IF); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + + /* Open RAW socket to send on */ + //sendsize -= 14; + //if ((sockfd = socket(AF_PACKET, SOCK_DGRAM, IPPROTO_RAW)) == -1) { + if ((sockfd = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW)) == -1) { + perror("socket"); + } + + /* Get the index of the interface to send on */ + memset(&if_idx, 0, sizeof(struct ifreq)); + strncpy(if_idx.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFINDEX, &if_idx) < 0) + perror("SIOCGIFINDEX"); + /* Get the MAC address of the interface to send on */ + memset(&if_mac, 0, sizeof(struct ifreq)); + strncpy(if_mac.ifr_name, ifName, IFNAMSIZ-1); + if (ioctl(sockfd, SIOCGIFHWADDR, &if_mac) < 0) + perror("SIOCGIFHWADDR"); + + /* Construct the Ethernet header */ + memset(sendbuf, 0, BUF_SIZ); + /* Ethernet header */ + + eh->ether_shost[0] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[0]; + eh->ether_shost[1] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[1]; + eh->ether_shost[2] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[2]; + eh->ether_shost[3] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[3]; + eh->ether_shost[4] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[4]; + eh->ether_shost[5] = ((uint8_t *)&if_mac.ifr_hwaddr.sa_data)[5]; + eh->ether_dhost[0] = MY_DEST_MAC0; + eh->ether_dhost[1] = MY_DEST_MAC1; + eh->ether_dhost[2] = MY_DEST_MAC2; + eh->ether_dhost[3] = MY_DEST_MAC3; + eh->ether_dhost[4] = MY_DEST_MAC4; + eh->ether_dhost[5] = MY_DEST_MAC5; + eh->ether_type = htons(ETH_P_IP); + tx_len += sizeof(struct ether_header); + + + /* Packet data */ + /* + sendbuf[tx_len++] = 0xde; + sendbuf[tx_len++] = 0xad; + sendbuf[tx_len++] = 0xbe; + sendbuf[tx_len++] = 0xef; + */ + + /* Index of the network device */ + socket_address.sll_ifindex = if_idx.ifr_ifindex; + /* Address length*/ + socket_address.sll_halen = ETH_ALEN; + /* Destination MAC */ + socket_address.sll_addr[0] = MY_DEST_MAC0; + socket_address.sll_addr[1] = MY_DEST_MAC1; + socket_address.sll_addr[2] = MY_DEST_MAC2; + socket_address.sll_addr[3] = MY_DEST_MAC3; + socket_address.sll_addr[4] = MY_DEST_MAC4; + socket_address.sll_addr[5] = MY_DEST_MAC5; + //test + //socket_address.sll_family = AF_PACKET; + //socket_address.sll_protocol = htons(ETH_P_ALL); + +// fd = open("bigfile"); + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + /* + if (bind(sockfd,(struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)) == -1) + { + perror("bind error.\n"); + exit(1); + } + */ + /* Send packet */ + gettimeofday(&t_start, NULL); + read(fd, sendbuf+tx_len, sendsize-tx_len); + for (i = 0; i < packet_num;) + { + if (((packet_num - i) * sendsize) < quota) + { + quota = (packet_num - i) * sendsize; + } + + while (sentInSlot < quota) + { + //ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + //printf("%d\t%d\n", ret, errno); + //read(fd, sendbuf, sendsize); + ret = sendto(sockfd, sendbuf, sendsize, MSG_DONTWAIT, (struct sockaddr*)&socket_address, sizeof(struct sockaddr_ll)); +// printf("%d\t%d\n", ret, errno); + if (ret == sendsize) + { + read(fd, sendbuf+tx_len, sendsize-tx_len); + i++; + sentInSlot = sentInSlot + ret; + } + else + { + //printf("sendto error\n"); + usleep(100); + } + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", i, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + } + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + + return 0; +} diff --git a/offloading_binaries/BypassL3_usb/main.o b/offloading_binaries/BypassL3_usb/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c305dbb6d66f3e00f15a5f097835bc716e0402e3 GIT binary patch literal 4888 zcmb7IZERat8Gi4*cAB)==5^_oCT6>|-s+Xqxuofqbzw@HkG4ubvMv*mR*_!YH;q+) zVc$S9O`7RRl^6Ds=k49#n3ZLRm0d+)q(9mG76O-Pyyq4Qyn&StO9@j@xs zjJ&vX`e8#0)cj-{oGZ6p4SF|2uOD_-pI)kJ#<`-5i>O#(-=sXp-pV%h^Yy&;Bd;v4 z3LDMPBXiDk7j`UFRh@Od@iEat)yYHP!)iN;xK9*HN)~yLTnC4rP0+bP=p-?wVob(z z+c)+_W?PNHRJF*{4jLE zzC2fiJ%)|TZ5|s}?qK7}XV~C1Y~%WtJKMOrXMG&fU%r2QPB&TN(ndgt2 zSeIO!<9)})Ip!a`cnkR3F3z$42;A4(*f;i(&(0*y=p_8&GrAFHbai(_MuE&$tX+1- zF8uWp;@~w3)z&VEy6bc8JJ0v(o%PzmXF?4u6vG(fT&PB@IEl06I=ht+a&s0nr3*44 zA;a?LRTcLNvUIG3+I87GFYjF#Yr`MF=B`?9+mT;+Cc9vtjMuAe2F?PI&o$SvR@|Kd zjIqDRk%Qx~$9I`+p;mU>OAPF@g4}Q%LFhTodW_8!mkx+(n-c z`ux!6w(-dmW2k$bRUQ6w&hO^KGUS|fu+8-ddE9tU>!jcCLB0W8bL;l7Uz}52!qIsJ`G-`#R5YdG)GqDSAI@-6pm2D0+4_8~WZ zWJHGfu{h<1OMXc4#r zI1DWKh%Vy8?ewdWK^izW(C7XFSDW(wRbI@SC#}7Dq&qsFHS_u8ZoNM`Z(I52^!~VM zn>o|A(9LA+L?&$}_a@S|m76wW>jv{yI-XCwY&{3+R=Sg!n3?RhQ`zol;^cH9Y0+%jj3zDJ&ghw}mDcSUOXu+j zY8pMBoMs@}KQy#g5AQ$n;*)xB1Y*jkcN1G^;pHJCl6lmvaI3s(|7qP85nT625H_VKOS)ilDvb2SaC zzvSX6w4W!++}Gmp%OF9{x)Yf8WEe zdHC-<{0|=fClCLNhgUuPUmpH%5C7D|{jM$K{pj>?N|}jtBu1e)CDKos@px{^OwZT* z$xJ32<&zvTX==*3MN^4*;u{Up6R-E*cP3% zY&(&%GShK$o^qBMCoWlb2GuHQSy`Ief9UAG!9!C=M@L^6nV6aw+;?bX3O?mW=_+y- z#HG0@@HXT9L<7hpkB>8gpAfjn*p6DvxRvM{V+YYEj40tgwTA7C*pM#9PTUhQKF)~$ zYtIP&3M1q$2!2V-|C$jG@^yhX8G}TvC=tOg5b2DM!cWG>h$a|yqO6#IRm{ID=C6wR zWifwC%rD~o34RfAFm8iAM#QzsxE*x_B_J4re~gb4Een2|@d=_3N(RdvU_|_JM#Ohf z@GFcDL9gJejBUsh-Z_>JGHxL<7!hwjBlONOLhsv*kh{tVy*CAK#{K8K1sS1#m=XKJ zwQcJTH523z2qz|#U>6L?nOqQDEljxgR^!EqcuSHl*d8d1Gs^6w~Iqhynn97h4a ztYF{7L_1>BvA6u-@p_g+h=f!-9NXlyKe}}B0LyaYdd%{lC1*f}*T9t1Sl^21Gf4mX z&}TW8=k^OYhV7^~p5xD;KsoUd2jFTf!|i!|;9J%q_``DUH$=)|YwIzvtbY?8b?%5J l1{ulXuZz2Ey literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal/Makefile b/offloading_binaries/Normal/Makefile new file mode 100644 index 0000000..a99fb5f --- /dev/null +++ b/offloading_binaries/Normal/Makefile @@ -0,0 +1,23 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE -llog +#STATICLIB = -llog -l/media/Lucifer/android/ndk-profiler/obj/local/armeabi-v7a/libandroid-ndk-profiler.a +TARGET = normal + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) + +#$(call import-module,android-ndk-profiler) diff --git a/offloading_binaries/Normal/main.c b/offloading_binaries/Normal/main.c new file mode 100644 index 0000000..537e790 --- /dev/null +++ b/offloading_binaries/Normal/main.c @@ -0,0 +1,126 @@ +/* + * Initial commit by Yibo @ Jul. 28, 2015 + * Last update by Yanzi @ Sept. 23, 2016 + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("10.0.0.169"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + read(fd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096); + ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); +// printf("%d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + +// moncleanup(); + return 0; +} diff --git a/offloading_binaries/Normal/main.o b/offloading_binaries/Normal/main.o new file mode 100644 index 0000000000000000000000000000000000000000..62833f1393249c38e0beac1caab34d9e3bb4f50c GIT binary patch literal 3720 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_donothing/Makefile b/offloading_binaries/Normal_donothing/Makefile new file mode 100644 index 0000000..a15cbec --- /dev/null +++ b/offloading_binaries/Normal_donothing/Makefile @@ -0,0 +1,21 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE -llog +TARGET = normal_readonly + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ +# cp $(TARGET) /media/Lucifer/yanzi/projects/mobileOffloading/RDMAMobileDemo/app/src/main/assets/ + +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_donothing/main.c b/offloading_binaries/Normal_donothing/main.c new file mode 100644 index 0000000..2b8bc44 --- /dev/null +++ b/offloading_binaries/Normal_donothing/main.c @@ -0,0 +1,130 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ +// #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +#include +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +//#define DEFAULT_IF "eth0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + + struct sockaddr_in servaddr; + +monstartup("normal_readonly.so"); + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + +// sockfd = socket(AF_INET, SOCK_STREAM, 0); + +// bzero(&servaddr,sizeof(servaddr)); +// servaddr.sin_family = AF_INET; +// servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); +// servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); +// if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) +// { +// fprintf(stderr, "unable to connect the server.\n"); +// exit(1); +// } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + read(fd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096); + //ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); + //if (ret <= 0) + //{ + // printf("send fail\n"); + // usleep(100); + // continue; + //} + ret = 100; + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } +// close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + +// close(fd); +moncleanup(); + return 0; +} diff --git a/offloading_binaries/Normal_donothing/normal_readonly b/offloading_binaries/Normal_donothing/normal_readonly new file mode 100755 index 0000000000000000000000000000000000000000..6052a6308b31c2d4ad6ad5929234aa73df04003c GIT binary patch literal 74704 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include "/media/Lucifer/android/ndk-profiler/jni/prof.h" + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + + struct sockaddr_in servaddr; + +// monstartup("normal"); + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + read(fd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096); + ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); +// printf("%d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + +// moncleanup(); + return 0; +} diff --git a/offloading_binaries/Normal_lo/main.o b/offloading_binaries/Normal_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..53f3881225c34f7510a53b8f2d53945bc89beb3c GIT binary patch literal 3724 zcmb7HU2GIp6h5=Fi=}N~r6u%d#Zd|_2-9g?Xv-5E9Y!fuJUR@WBu?eb9sujNM%}qVOPZJP_-5W@mPX(IVbv=DXjy z=bn4cx%ZywzCAQLEC>SGO`ssv8PUaNbHo=iAxO=%n3SCxes8|?erfWTT_tIDSIM(= zq|~eolx~t(vHNp=vGUWS+NrCL(ONDaCnj-=2^=>LH6@m7Z8;EY$vN_1Sm`BP-6_EaI8m&i(`r)rU>#WkX~*i z>UglR?i0t}4qxw@va`Q^jy&=lfvR)uJr5xl9D{AsnWHduRyePI*s*g>*dwfU;hbx& zmC!k{z*_HN-vd%-MS`y$DL&^1inO$GNEx_S(FN23hN5z zZJ+s^Ml9dhuYc$((BE1(k9kGs96KJI5i_1aGcu72NJ&mY@OSh;!vK1uM2 zb+J!#eEwS%JqqJ9^jngtYnZ=-aq!i-qURhYh*Of=-_Oip? zLb-MB)oGW#f6Kea+P_24wd;r%Ir1UD93!7^E8k_#QS@NRH_`$@y%R#IxzNmcdviYiKeY+MpY1{0)-(_U@8Z!^kIN6NaW^b$4@qyS;R8 z-Z?Hl^kpX!@#kzJS(|1FMe-58r;g^MCX3f)cd_!lld z?c!g%_>7DH;Nm~K_zf5T)x~eQ_#GF&=i>KWe2L>gasDZ-CNpxJx)PMkY*rJAd{oUG ztMyaaY%azpwM(UF)Vw9pWFmQ_PI?oyej+`QsuS3%lXyCJ*r-!|B3388$>Vjxw%H|8 zjck(iZ2S$)fH#^EW#5Pk1C70zPZ}C&N0SB})(j(=*0N&>^%z;Df%2M~Fe?J(CJdb> z^pvLMD4xpd8s+lIj4?*h9izMZ`$nU?hllqK?T_y7>mMD8!VP_x=rYn0;ERA8QX}?F}4#mdw?CNk&K>hrk8PcY>Cn(K#ulP$jIBi18DZCpS|3=2 zhY|K8jIeir5%xc@_(jI$@PiTS+-B?|`jZj!xem0iCTatUkVzJHSr`O%tRY%&amB)I z79yg@YDf`p1!0=m__s^MCg>w9vmy2PHG?se5e=fajbkEz40t~4as7kKCP!M$W;krI zfOWZXtz!NE(o>+rbFi&uV|(YUK7;LF7=6}beQwPtmusqB^UY)Y^jT;M@#=lJtk(SF z+6dorPCaLRWn0{^b+s6nAA~)XJ65yx80{E%Xa;&Y2#`j?@i*hZ@i232=LD1#B)G*k I0&aKz25xAoAOHXW literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_lo/normal_lo b/offloading_binaries/Normal_lo/normal_lo new file mode 100755 index 0000000000000000000000000000000000000000..01c850fc5f41463fdcd44890248b003a5b19f8f7 GIT binary patch literal 51180 zcmeFa4SZD9nLmE+y^~i$m=I7zzzKv`$z&1&B1H`lFhGFG3y4acgv{hcLK2gSKt&0J zHx(2Vt!slB)V9`I8!g>+TkOV{wfvRs(w6SBEp6w;tQ6f}X=`_>#pd_@o^$WaO~7vZ z+ueTt`}sI<<~h&HdCqg5^PHD^?wy-$i_4a1nkKA|A*KmpxhX;v0d~JGIY~vrB~rng zC~`zHNaR^b7C<2fXiNrqz^#-GoQXW@X0m^d=L^ACwU&vXGe6Zx#8yg%p%xa1?tg9=rx$K9yYOqNkB%T$5#L+hsvmj3+qE$zX;#{Bh- z&G}7@%^L!3msB;VjU&MxZWAFsb_jmW5PZrI+%p89Jp`XW1Ya-&hnwOb*1sl>2|@h! zA$au=JTL@r8iKbC!ME7(EadMa?o~vm_|?F!A^1Vy4jcb*B`UvZU$+gPi2P9-PX4!s z;IG+m7xF(Eg8%CfT=;xVjq7WDjm?cgomsL0^sE z-zHjG1I?mtQ(I#&Af#A*AQ)`i7-*^U*K85BEzQk=+Ms9))c8evpxG~4JA&<^qrE8* zXce_hE$so(+Sb?{tV3PxON1}ruL;&5zrMZQ*B-2CgAFXzR?`ScpRc~T!?(J5Q)9E= zw}fA)(Z5;LtZ#wf#=yqf)-9&Z>jU+T&A!^EKuvQ;t4RxPX$|-`)&y%COhRouR?wp($z@(T#3Z7&d(?$ zj#Yl_@lG7WY0!sbi}MD@pY_2MB}fJ# zs|kZ9+-$;56YezOUK1WL;UN=l1sshE_YuMoPY|Nv&jDV62E9Ot2KN%8F-Hl}pjQYn zxg8@!L;DEPxHk#Wh~tE4_eY&4S41=V9uAjzdir%& z_j{$zp8ip;Vf`iG8=mg>oStF*^TE@c-S1^Mhe?@K@Ezj8r~!H548=xymPd~a47~3+ zxjZWNqK;DZ|G>b&Nu*Oqr;*MeK{k>By%~aaJscL|;qc=F1Lw*hzZQHC?8<;mT|ZqB zb-^xu-tuUMXHoQwF#4^0*lF~iS`6EZ9}b_K-P4~7`%VDTPT`>~!}>MAF(y6@aK{Zw zPbzfH9D-+hx}qM?K6_&*R%DiO0b2E)@nrXFqB4fi{;@?1gXTav;d!**5TQr|+CEMU zLtdOK@?70tJh`X;5yJ?N8=^;t9)$QHJ*hT5YoJGXLlH+3+U2~uf0-uUN1Gx^sKbEo zmY6u(s*6xegYSha6kCpRb5Vbn+0IdDC+Wh~rR@9@@>bh)$R5pG6xmtC{(m^k_RXPP zu2961Iq5R`8^Hh8tmTn!&AL5e6v4i^p~$3ZA&F12aL^>3(6b|vr!0~_1O4J!7=8JM zg^_W#`WRE=P-ijPR1AM=qCJMGWbDOR37gpVt6=K~l6L65=itYYD5Hr`EE~}3^CI|y zZJH>}9O>pdGQFpnm_SZRh&*?(IgYxU`Tn{R7u zzCC91h26KfM!BqSPhaLLAE#VjcD>>j1q- zVXh^BWs`*H-05B*iXSe1*M%~oJmx{aX??D+aMmo;T;)+*i=+!rZ$x;i7h)cdOc3Hp zU1UWdo}QK863HIXf-%1^tf5_5Xx~WKC@?N4t9cf=bkUh}1od~`uphKL~ z3noQ9kl7CZcX_#X6k(isG|_h`OYeIu>&>^%XZ<}Au4&SrT^5Rb@wQ-CcmpqEe)w@x z@y@XBa)k{~PFRSEVa+)yj?WRRW1h}e_v%_!OuGW(_pMMY=Zbw1js6v_QQ?e4buBw) z%)#6~$E3U3utvtBwBZ)WX~iW`SGWVX_}0kpg(8JX2hdMPqS=`T!j+?63d4qTF7IN< zJQUSLMJyXKdf&cDm5_VmnwP?QxfaEi^fuAA6>U8)>(r9VW7tN{(*aR_-VtYSq+0Yw zn)+a4@y_VZ8GuP`vDHG%(6x23P#>>;d!vrAN5V2g&@F=sxX;d&(MfZs;-?Z7&=KAM#giWH2*`i*vs za_xw^`quv-3%F<8_U}9O(D#kvs<311_7Lhlf_k5G6o(_%6jw#D9ezHe_z?Z__9)ow za`~ekM<|k|cSZ_E?UFWT6#Eq&F_Puzl=B>IFMu59Jmzsq5!2>OifUKn=xDpHc^8kw zzU&W#df6^hirA9`je zGEg*f_9n;BjEBO#ktFXo!^zcO z3hy4hBl5+u+atS@LXj8KJ0lPEhaw;MRYg-W)^&{#;sIT|BNhrL#!V~wO|MCgYR=u5 zTRPF#IpG%&+Zo3z5ym`<_+E>+o+E;ck00t;+7G}#Ef~+>Atq();}TKD zzSkdh&W5iT|4E$@JqKeR{qxL-1L1;EPlvn0Peq;?(WlV{IVLEN{iX-Db6h}wl(L*x z?6NM(^*eC^F@aU6JJVSQiUIk*9C$itNYy2aiDd%=4;X!`!+PHuVP8+^Z#|M3&AH;C$P2}XK5;zE zgWlxuuE<PFxlUu#5e@2M~SDIW_VC%8-UNW-R+@Bg$Aj&S6%3 ztw5RW#Rnpr0lU19L}~%=0blfmV;KMEG|V~NFAzHV^7^-9y*z<=yGy|=tf}dall!CF z`w*{va?Zwl?vZ}r9EmwF#`VGw<>k8YYHy4P<-9Q>T!4KI$3?`_2f?x0TL+}QrtZjD z*kZi(NaSB(yF(m)m+}JjvK<*N#2fN#Yla7NIBeE1N8%jeeSz}~)VoN7pHp$}a{)9B z{er&9PCbA4UDB{_lQs*qNfzz@DB7c-by>9NWoSPgQg%CR(Wg8T#j(|lG|c-q-WZO( zKBF>>4bPL?F-PeIU9r$Sj0x;7X^-Y>ZK)4UjW=o77TK~%5CKCv|vNj(7A8;YeB zKNx;?)z0vn#i7W~BcVvTcTYG;gd)E{ds0PJ1PdShyuUwHJb<}oPdEm;!*dwd9cwt3 z%oqk4&Q02ZlIZ*Nw>KY)H= zdBi~s`y#jp=T2yMF3x#`=y{Lr9%svsvgIvby*nFcf=H*3KEyS{b?}ej>3L6}P25}S z-UU(U#Qp{QE9d^`T=$eWFJn9Cmzf2tJ_reDDBW1ZioP_-#=J4oWQx3K|AqN{}yrTTM?VyuJAJCT` z#KBRtf3umW%LzYdB0EMupg%AVWXDQHC+FDoA_LcZ(Bmfb9Kx9#)*r~66g#5@CN0&Z zjn3Q|^_Vm#Xin_!#)IZ8e)VjbfqpgZ7UIz>;U|rKMt>4AaqU11L^NqfC{pY^)PIQW zs`esQMEXB}gljt3Fv_zFK4gD9*3W&Z1HPVx@~LS5dH6X6kbCQ7p>(_l9S+!g0oTjt z5$lfd_Gm`uf&MWE;78P@SJQ{zIs2QR^PF;jbcA@}Eb+ncsk0alvDDuE(a(LIGW*V^ zw(f^NLXlGR^PSTFYhvluq3pD3_#b`ltlphn>^VFdV|#2V#=hOdxuXCJxW9WNa2dm52lV?3458 zllh*5{q$L}XM4ZZKlINQ_zSWAiT;|p=nPaU!Om-#u zkZni*rPD7wuS|yRh-GOz{S*X^HgBP=i03h`&i?tXNBc9Jo&Ci)k2D}7T$uMTr!b~6 zst>^T95ZWTmi=rCbf#;N+X8(!Gd<^o4C4uFM9g8@!&rjf(ivMAZ*dzcrCln%u*a71 zRSjRd;r9#|>#Cqn$G!*~=DQBUF8B_0-2t3_O{G1w6XO`TrlHPk&>ftIfA#PI%%|rt zh|j@C=dezm!yI%D6U4a@Qg7v>m>;q^htMWn>kJFm;eLmcI(J~sMGQa}brP~Ygx7GK zqg@%E{kX10pCi7YCxQhKv4Hr*{NTVE_y1ypK)*^moQM_l!ymPw59gt#4G!0&ey+!s zEkB1XmL2mwkMuim-FtpP-Y<$hJLH(qIyqL4oqY(gw=T^1dJ*IF7?K@!pB-LJxrffK zEk;`re{0cJ#?uq9a~scu(4U;&(!4m6fnPa}GvE`(A;t^(6Kfy(=Q{X}vL9kTae5A8 zeS-|>R(vFRilYwC4`p0o4I9gHUxEH4z=s&0+h0A)IY)2Bct#xL;+}(}dPh_osEi8N zBmJ5eYeuJtj&kkqA5)EWgZ+v9ui?R29%$na`~%MK{sD73&RxWYt-xx>n@yWyZ!-d#AAr}W4^hBVBp!UbE|=OUU4D2g9PoL0r2 zhaafh5qdo7<G`v?}OnH@JR~V(p&sbS*g{#bw~B?kxlRq?tsHDp)QP# z2Q<%{F$1#0gqO5Qh`U)@C_SnbJE9L1??k;-F|KbIZ}W8IOObyL?ZF)xjFFIme!x*E z##!<1DB@g>`yYOc`whjr`b9O@q)_CJ->E)(5`5Z2yVzIQaGi5N<{j=Ipl>|dN?m!7 zb9m6c(Btq$d+hnI<6IcDwXR)Q*VyZUFko=Lg~cF-=$xr!g_pCo-$C9kKZp+C3}LVa>g>PFjW zzd)TVb3J4UIVL{?J@9k%^K6gopS3Z4!J9GMj+E`X4)&xX4%u&-rwda=Wvr02P$;st zZ&%cb^~oV_i&TK7g&v5eYrDhFzWvyz?C+nzxJQf(^T@hnJBOj28GY2J)=r#dCfX5t ztp8VXtlSo1{Z>10%XBQ(pqL1SVjir;hG%zp8v1HxXjgv`Z~?!k<2)1d)$%?> zL)v^1df8^KS4l3p?>vXOD8~3?d7i7u{ZRGpmmP?0%(vJ-C_ZBqG4tbJLMLKM+B?d* zKf0gi#b^h{GwfrVcu!63t*khH74>Gq&zA3bZ-VzBX^Zaad5>~GQntl7=D5ya%*B23 zHSjnOu-`GC#B$NzY1O+huGPAE^jggNuv3G*Y|p?S2F@W)VjlyZU!?Xoi!gWT#h63P zx&GVG&$%A=|IfXG)QN=WHxSR2F+8_1Rv&}03mtQ@uH+!kxmD|16m_1+3X8r+MjNl~ zx)QMvb>K`W3uXQT^N_x5RCKOuSJIcD$KiSd{;G%_fv()msJAo}$wlHmG^Khc&qT*M zu{Qn{#_|ZPwMJ*?AjaLJj{#3Yc^7z(n7l*SuRE#{Kb`R5fyblTflzi5^k8kxz8`v6 z9)tM-;o?4bB=;rhn)CG-$1vqeot^K(pJR0=&TgE$`k&%?zM9u?2Dm?p@%=u^oHJan zqmOp=qh8713Oxeji2G0Y3S;{Xsq>_#^WB3|W^HV^6~4f+H7PVwVT#LS+o?ctrpTz?Q-h*?8>nKe{7ld$=}#VRUy*7kpTWJ=~+C9L}dl{~qNy7vcUbT!DEQF+y9|KAeHP zzX0u{pAf?jkaoM-MvQ%FFY&qb0sK`&U!kuiHmE*J_UsHhL3h)~*h6sdP2H*Rhqs{f z-5QkbY~7EuW6YV<1E1}#*%NkDFNyA4&=qDI9WL1E`jWJhwo!H=WUoe@PIG_3F)ptS zO#M#iKMDOl>aX4(OD za1LS|`*>L|_GX=-M^mdq2XU|aNhj+lX#r9>QVr5wNZXMPA{{|`3F$SY?;}N!es$i|5rz(=9HauI1xV#cHAr_MZAUtY zbOh-oq}PzXj}$@rRaolKw)bAt4k8^vda3uK+}CXnfrfMh>7|gQi7?uF4dxg0MF!f< z>(>#OAB)3>`%5u5vE1ck=KKjV%l);Zn~)2u~;S*jJ)`m|-!uF2WwBPhJZf*e?n2crDC!_9CVTx!>iQD)+ls zSFq2-ni+~rh8_0(F7|fk25we!v(^e-)hN@sKRWP~+WVZs`rM0kMPQzQeHhzoV&4bM zD8@Lz`jrfwqL_QPP$Uy|42OOTCw~NJl$i$l8?e38>E!*Gu>$8Pv`2KRvcnO6 z4`A<jgZ>TF#WjmM z%OT6TZUp>u-X-9RF6azJ&==<}f_4;b>EZP@dAL6(ZHBx)bw}(Up{oyk9KDQv%huNU z&}m#or#_`C@;b_V*Cty4S^8x+{o)xJ-D&y-*Tu1Eu;Bu1U>#`Z*bz1xs6Tz$ju@{; zk3%2UKiQt~W_uV@=y%xM8FiX%GN$Z^aE|`}AdmA6DWCNT?We8WC$avMs2|t4V=w0e z?3-i9I6k0rHDsp19=Qf!jyk{R)w3M4Wf=Dwe2R4n*OL3AI>xudh5b6_f>b~Qv6g}B zoD|Ow`-kH?XasDst{M3(S~~DjoL}%+G~&s?sWV0VuwQ6h;Z&S$S-ge+j&l;o6cb`% z!S#&5`Xm-K``cO?{bDro|H(%yxW3R`FlVm2z+Hf@6(XMxr{*`c;JMNK;Ko)w_gr7s z*c1>Q%{A+r028bx8_#?eRYtf^_ZI`(`UVEJeE`_o+uM1O@auZ#6Xz5jCj5%t8GfJmbDbq0DEc}H zpYMDH@at_acb@(?MJN2~O>;Yg|3~3_C49c~LlfWm%YkiTr=#;(K-PD`#K)Z<*!IHk zmpjh@_I^FJ^UV(x{}kZYZqhr8E(~mAf1LWAqR;$D=_v!Go>IaWjn3mAE4ui@z_t&O zQjzf7)V6U*xYm$RpuNPY@6*qx9{AJ)pL*a^4}9u@Pd)Id2R`+{ryls!1D|@}QxAOV zfxn~&@a)+D>-!{#dmW;CmHJ&M?&Heei1a|^F?O>1onv<2|H;`YFF z+J*ZSvX3>PZOzOWE^%pZCi-s>Uyt)$pdZ5_C;p3RNW@P8c@}VCre|l`uGHNrdy@Ai z-S2q7cu;>x(^qEFEv(Chv>Bb`1!SKQKMp(@|!a$Oa0`ZL?`onsU$OX zC%CQOdowexYd&rcG3G4YUf}F!3ttP|0o>BH4!9rq!c6B*$1Y9J`G@(7rPBf}s~@+HE|9hXL4j z%cfr7L0K+glVyJ{0@ekdg_i(ldn~*ZIQ3X~HSl%7S)U8(7;yH{!pt!bY2HkSCHL+S zxnkU4pJ~ZeWIC)iHGzH{^d;z<DigOD`j``o}|5w`;7-s ztI?-rx-5Owc&MY;(zhXCi0YTF8+w+_K8}foJElsrzHF&Q@ds}V(`i{mXf4#*id6xN0BzumsZKp=44?4mq>UBbYNH1O}y@L6*TV2-q~P#H>lW_dsb z$S0VEe}xh!4IfAs=FcW0UkZRX+tfg|G2YE4N_HU$g&s)b3#IT;nq-!QS+Z7eE!TiX z5vf9!Fw&GhDQKh>qDQ}R*;d2>8aHcNg%7s}%s6-WhOOK(5=7xeZ~Ea%2I z92(k1n+poiMrMrHgc|^#BIR(?I|va*iSidRC|5{=be;T?g%Cm#;%iWr{h}(M5?K@b z78)ooHIt4H_=QpjzGNVPCasfPBJ4Io^IKt3B`68Z%z>s%LM7_IqJT{a#F147nDs$l z$>OqGUSs(Gg$6+`o?Bzi0-pYnw!j65Dy!AXP9wwYs@eH6;$U(S?H>H)k&Srp zFW3k#mNDalG)-A4`^gM-0%^`BY0h6{;(LMC{B=65kyVetzD*ambFBS$&bfc?d@bC< zEK-9Tfq_j8?Tvv3bAnGy`qmuJ3BIwpwyDD(_*05uYgpH~nQujEYiSAQceJ;~OXEHu z-&&K0b;4cC#UX*`)wXQh*wXAqMevZxa5o4noRd4=0&)pyn3*-&O|UWSQth0(ao$XsR&TjtP=ztZcn|D~~U zg$L5%dv_RVnz6}k409VD{GRFYG?XoGI-Fn7u&SU;=nidh(Y13{dWev*XQRs4CC-N_m!U6#^>CI(_L^S zYMs4ojPbbUZtC%@I3lZ90VR5JU2+9xY-2O(G18XNs5JM#7-NG5nl@&IMlQynywqr&X^f->(MG-x@Rw)@^?qkns(Yn8EO z8Cvad7}MQuPY8_9){Xw{)1brA!$}|Qb}!G%??N-btuGr}0I$x05wJ)3_ov1dciAe_ zoHDd?mzl44I)C~sPnnTX2mjKy!`+^lM!Oq^U~GFlGxPJy%9eX(dh#l+&G)d7@v&HD zbZt|e@v(3lySFXdP*7A@Z+vdqjH1GP$T*VSZi>2-L#es1t+=*OR<0rjUQ{vR#>fH$=;zRIGk4M?&Re?jMQ6~)z2)P znQ!z7H(L4ly>;2;_-Fj=-eq+KAFaq=I;)-)ZS&?EBjKq!GawlN%h5fv!E`M3E@!}{ zyPu|L^0MRxSW>VY1S4yiacAA~!sQM1vsbNLPWDQSnEZmJp5;%kZ0O3rGr#ECg8Vy| zuUL*KS)4~VYO@*}mlxfc-;m#kNUS5$ke|=8x@!K+RRzXN_tkNXU9}87%>SA0d}GqG z<=-)OYjwH<+dQ?x{g2GXYT`)j@}8ZFS>YR+mX9dn*uj77#JHbR|J0fh|5p2kII1>y z5XHxEyHj)2KYb(`v6nNt_}YK>UiJTRlE%x#^4dFETk$@yPnu>iLBLqdl)S1jP6};w zW5e>E6)W&6A)E;xor`<1B6HXgsv?OtX448zIqHWqL!7nGg;>8kw04f&o8 zoNYA3Sw70E$iNs`*|_4)Z-3jfsy@$?zhOn03@Jq1$_=ZIEzjRsmWQy(%U`*oEU$jm zhUI(8nAu>HYFxetq%M@qt8Z>prJqV}#_n}lA;uzx=E=v#0a?U+nPlCNWva7>+y zte%1K;+V!`4kI;X4?!@)KB+lJa|~OHIj!Oq$To;gH-h=K;v0^!2}GxyiD05~Q@02f@}; z-a$Dd<*TyX>#)ozbiRAgvEVr5^~1EaS6mcCDjw1M+EjGF3QM*FjFC z&B2#r&7;VtrX7P`{J07t8EFPvQ~wU~uCys|qhllHZ810PQMUW;smPZKeI$Tm#oZ7} zXIB3q@s&%Va@Z)xS{6=wijKaGB$4(U^S3kaNPC(2b)KE z|30m0Zxs$dX(H`Kd^rN7I>d02evfP>zZ~q!kuYzV)6sY(EK#x>n8nL4DND1ZtU;lc zY6|^?4Z2GyZ(zQSWJlV)bW%I%sj3k{<}<_y$33WQ_}vgy^Uf)2g64=|+`9Vb%ovv_pqM~s}57Ep|oT=t>RJHd7A{3}&r4}LH#Qi9-! z6b?o$B^fsADSv=kBV{F{CFMULk|gxmH2&dtRJlhcKxN8XC?QgEWKF+hIia6tAAcUd zyBEVU98azXOlzW+!^#5_=*S+D9cfN>`w@<$)U-3CKf`<)nnPKAFCFy7=@8X-(DEf=qwN>LG>qz@| zv_SLHh?0!E>sp0YPQy#n3eX2y1uZ%``YSA3NmIPq=x2yj(SVaUEk8z8t6A-^60K%g zyrx=eG;8w9nuNZdDg)CYV`#~XfEaqxhX^JkHE9eSG{Vse))gZh>>Ird6n$zJl;{iK zaDDoIFw^It@+*IUFNZ$kB@j~h@>G%Xb9`wjZzHdZVGh0I2VkYmW3eT5U}4&z%A1)- z%zlobl*Nao>dXERmn~B^OW767WArd$^p!t_OzIy{ZK_`321vV~x~r7@#~cZ(O?e9G zYtryNrW6{C>62O62H;n1g$)WH+Zt>W#tgEq#?#con8~ad(~7CtC}FVchgqToJ}^oc z=~r=38H-uTRlg^72_svKy9Fh*w=~kN+iF_(DaejTPrjuw$Ik?|Njom(v`TpT$6#E; zQm%hx0}np|oz{Igt(#cR?GRCn9LVLkP?LU`wXPs~5?{I;fhW=FMAKPPqP&-zI|?`S*!CSDPu9G8hY(X{nl#`ko5bhD z#7XGr5ss%Iat(W9+~1(2_9NLk>jt6L{XMY9^Bu|Hu<|+x3D+`O_9k6y-8$5|zX)|X zAJVKh+1)>YplaWnY{4jyCf>pLd5eDeEYPXa8Q-N={b18H0I?W4rn5FZN!oD`Vl%pN z_wgB&5xM8lgd2hRAU0Vm*AM#5#^n})`g1g*U2-be;M`)+=!89zCY_KQG-+S3Xbv&s zs7VvomZKJJt97?i>z;zv%)Gm;9Ykio32Smcg!COqKT{fv;BlCE5rhsTyf{^e-N;ppItky5aBz}wUk{_L+p1dk9VnGw1rpxs zC_GD%N&bl6Jq12|J5fxyIWnvpuUhxxDB(FM1^M0M*)8+@?(y6s^Zf1+*S>@X>szf` zv|9IDC|OurR|6ua56wI4>*z-PUWt^8qI3E()f&TvYwC3`py|9tw-N$#WCd=GHS9pj$y$XT#CJI&0a~;II+ye6xD#x0ku=7--K=%b!LU@# zD3Z_082S*BY{oZ<`;gIR%Te$#@Cl#6mwui041l(F!dEd9>vLs0v|Ck^ua~t< zg~1bA(OiAL#_lx^KCyYiR=U-~FWfWD1^&N7!<QtbmGt%X z`@lObd6klC`SET_Xa$q?dmZ`~0U)4IOnJeq3l6vHp++y6VqPD(>}l1@UD7)tntcKc z_VOe+p3pwwMb?X;ow|)p*b#IR~ zSK<{2P!(o~N>DiqUN9vYx_d$6s7g2)O%?O+Vz<66E3qC%(7N};&3#*%>p}IiWt6=m zqpX~`jI(#7C+{OJqx6Jq&R2ow@mYrZ<*=yGJgC+9jaCT{19(yIBABNCMAmCP^q_U$ zh3hXB{XdcQo`~!HiPS4#ta8gwWyvDo*Ja@O1$J#V3ajq@wKS>%%-k_xvU_zf*}e3H z3$#Il__S$hp%kh>Y{df+KDz!q*eeuk&`>TExvZN`t(R;odQoTwpVr_cAm)Fc0io%y zB5ysyp>_WZ1yoBlxhJWIvC4zG&T)PO_zgwS!65st(hkp+TMo?Q(;q{;TaGp9HI#Gw zkW2=n)~(|gb2rIpafGY~zQ2)guyCBR9v9KN=RszCU^DL7Tq$LK0v*MCdPH@a7j<&l z`poMr_u>RJ$9l9x>;4+b=5P#XU*Hf(K`v)8%4^+yn1pX5`c-n})?zo&_b}mTPw~3t zWuUWqi1x@W;z2PGn0|Eo?g+q$2rX^9cNhO2UN;B9A~(I4@cN9 zxVxrFIDWPisD3aw)vlw zr~NIfyB_*g3%|t{?gKhYw(#4mPODJuJI40CLY{0NUn&Yy%=Y~q+eba(+M{&od)5;- zTKDg)${g>pvR|_@*|zuCwrrG}DcklQU2+r9DSkYaLy!EYjhp`<29rKX#-a5nkJf!5 z3vtIoGjRBZhfUBq`)f*)Mn6Vej_h0+m)`)cCaNjAT0<~V)lq(`)ckw!7k1RH#|B^L zwXJcm_ntX2{$|M7x(czKdmJ`%srWo9=b*e7w6mbm)qgE%6`&#dwE1LXCAt1Xuun)< zxxQHzBGu^<;ytr~T4Y(wtIZWtrh&yN&{QDCO+=6AcSs|Pz?0WZ-A6~GdF@ zmtKdg8kRn3Zh*L);;VIb$d`d*6Dsr?ogIQ79;3CJu*s;^8|cJ?WplW**Zn%Lkr$wM z=Wwg82lS;7e;D}mCj6BVy-wm^BmbZArPoWG**Sj$oqB^*KOE6N=S%RS-YD^T#CMT@ zr^F8epH>XTpFuO`BvH{`rHFz&xzO*IINp^guJh+$GX~*#cmQ*HQ>)OQmAsF^%WVRW zJJjjm(PNw@w}O@|cQA5Q#BK?MRw(#q2+jEcYda=2T#eOY&hxD8Recje;dSvF)`kvQ{b~jk4S!{-2ccm zQEfN)gx#eLN}Z%;px@9Oc2|z9|1CCXK6q@z2)F~{i@0%z>lbljpRz?1O;5!uMRG$BS%#)=RvPt# zC8lq4-vozs9UN-JDbwcXO~#F8i5X{2hL~TfBQ(y*CEt2lQ0ty_g*kS?`7L_tU3f;0 zUG06jc}U_CE0?AZiB4+RbAmHRQH)LaIJiqiyXx{ZE4*ju~SjY_-Rga!_iM_k^2`ea(_ki z80^x1%pq|dhK*Y0e!^w$O`vMw{wWtWmYvoKu_w`jNjw?RVw?=u!|M~XsN`KL*$;G5 zqtN;}kA{GVX;0v57%r?Q{vW8(KBCmWve0&#_G|p1yDDT4c13 zd9Vfa-ibV_*8V`Htq`7sqhW1;)&C=~IX7ai!{g1w^EruKPhm}7NPP?Vbr&aNAfxEA zF<|0?8K-2Dd7i?f5$IZ##5s|O+$u=liCFhR8Zm2h90$>F5`!l3;K}>Mj39{jKr;6U zWcG0;u!``i{1ubieBdaLPWD zNKsGrMP325eV2XUN}#;{Z+z2IT?Z}FAX zE3-WM)f;#oRg%uNu94Zr0aEAQ2(h)$nZ-;NbGWEy%q>~OSZ!}1k6$1&P?tQ0thRyO zq{vG?B4P9AN#Gac7{N=>0HJMskz{^>On)yyPG~KEPcpwirW=+Rut>lC49WZgnJ2S1 z^Ta!OR_R7q%@vAkxIFC6x-$tm-U|_nw__mcgTCB>aIAn;0g_ z3rlJ_@|)O?s{KoslhCYMExrlex_A(6bZC3fX?zxh&p!MYZ#u>wF){W0DbLgWc~1p= z743A09%=Z!_||@giHMdT08+;2`W@P-PvYEzTM_>TV87w0PbNd&aMY(_Ew}D6+HWoD zGaAXTZY}D0&j9^%Z!PL`T2V^g7u3r*7Sw$~y^_DLk@p4l)oJKNbze|lGY5HfUr?{+ z>94vksMj|mukH)#8^4IWx-Y2T{WkLEeL;Q2RX`H=1@)DSp?BCQeJu;iTWb1kB&qv? z`t8iC`-1v9=GA>c{j#esPCMwO6>UpOZ>_A1@(uU zRk=rAW4X6b(Pi!n>Yx7-xWh8^CwaG7-WSvlD-W=3dJoC!zMy{O4yaJ~1@&i`=Y2uS z%KL))7x^QL5spk08|fH)4=$V6{Q8+3$QpM*;V60eb%uX^Zxkg=M)1EnrVZ2_l>=08gz(q8q5vt6Jr%p3f zJSJ(CSmCMTM(B{)xPl-WQViMK(4nsllD+A&vfYqnT|ctbbpo_5l>dz?&rneDz(eGz z8Ky&B=swG#j-a>+jfzWIZJC-2VVW{a3Zv0tYLn^GnR?|MU#9*3X)>?#UQ|E}rLTH^>No3jLL3jT7`*Twoin1}kTpG#@o zt*lQ5|E*HL6Z@Q*vi{p;{RP0sKL>>zxruS~HLCizaiCehu+qBUiL3HURV8s%by8IT zxH7$7n!cH;U%5o})ZtM5>O5F!{YXpe{zF{#W~us1C_0_L)%vn@?U*v4eu*l-T&*CbOwHR8mIJ;-Dbs~>PmiqG)WT*WRL0g3dH#P?r_rcKVw9%f`-or&6$omax*D}<3b zZ`fysEyX36kt>D`yAgaWGiDY|NrFhKC6esWh7BX4K|W;~3Xg;HQ?oTAGeJ)q9#=XS zeooH@Iv;^LEZbHXzks#WQfRoQEzPFV%p9>aJ0Fx0BVY~9a*o!fUPV?`5?EN#h%4c2 z%3$Gw;v~ze(YD&**(;{NyI0~FU7LYp+(0Q$JucantCHe2V~GM1Z}QbeHe{SxGKnSW z#NsiZUnq?mZTSEaY~h>>%;{BvBxZ#$7FBPJjZO9 ziC#Aho*0?Trp;BB;e=FWNSmkFIKy>oH(izJ^+7evkMl0=*BfljrNSHIvWT8RT5hu0 ziRKi?3*u14)_-6vwDkedMeMmDdR9#jaOm8u`|Ioa<54Q|B#8rWeY1*mJ<&vs+ef+ z(IEvVB^oLxjYMP-oos6ZVsMHzKTNgkW58h6pdXl>4!Su}%rJ|ZBk)=q3QaT3dQ5KK zU<*|s;Z=GLQ!k*X5tTt^(4%_eJEQKYZKgCE$%U7P9vcT zf-sWu9CPm?fkE&Al43A-UNHzR#2L(8R1AU)8JYGDBZUzNl>}unTSd^Is0679NHmUs zkJb(D#taDLO4)LP`7*njfLf9f9_5AOdYI>PNSatpKs6Q%cF7N)(B}h%Fr^7#lge%e z=u%k%4o~PXi-=Pook27?!5NIz*5ify*+wX+^32u3U8;_ze3Vf)_ zT8%jm^!G@H2=-YtsnjJEdkJP@@Y`aMRVr>dfd|PD_u==e$jnv9x*le#6jIj143)5> z6C*I8r-FKT{)-XVWXdwqErUjZMjfPCx-bn`Y!D$kF3K>z(fDR5lo6#2@sr?*?5f!Zh3+m@1hqV zd{mVsI3cs~mQvMk6qn#bq`_5F-~%a8PCy}Dv}V|a6CFU|uoSK!Fonn1g%fjNqUuV! zKxMp>Xw22PI6-g|V2MX|H32r;q!KhJs^!W=nes%LDwdfh1)-HtRUo~eQNBVYuvb={mifaPrC+frM z!&0__z>=-7$yV59PfFQJ0!y}1%F-$ee3FHpcK1hLR>r@PaopFZMGODbW0_6mj%JLrOC~or@Wve8qlE9L! zl(MV|ULde)NqB*jFG~S0K`+u^FHqo+6euT9vg_=!2`^B#Tgp}tJd1?C3MC;67~)=$ zY?Z{eqseM2YdwL4@j$Q{$2_*_G{G%TaMxa1wu0OMi>KB)%9j|3YClnwDo@+1@}?q?I+_>@lJZdI1Rk4q5jd~L0fzq+s(m`7jex`<u) zCVW7>y;5%_L7&XtO27xb5kmw@!>x7=iEv``OJv*D5R@Vr;%-OJ8DzqeUiAV_UVC}^ zD%Ko@nXe#8kz;Y2<9^LWiD|ObZPeDPvR2Q#fEG(q6#*r5akqp)MYbgQ>pSJ7Dte|D z3Ht{EdL2{qwx0R$jaRxUKCySAE$kq!@|0t@Fi%LYVi7*N&8osK+=N2i(gH8rJVrLw zTMgh>SvLQy%1(o_nMepbdmVPQ0y>hg=bDQULY87Oq<~vROg1fxM;yh?PZ^3;A)ykB z#Ga{^r1++t&w9!yWQ3RCwB*M7VjAq_17grYkT0|GDI5331RJRFZ>p=02k2Z$idT9F z=o5-W@CBKTPv!K8JQf$X5zsS+_?*3K;<}ySjY5Jk1Xs#z+?c&U_bD#H!!jGMh7M|x zJ?$lEMH)QgB?QXt0*T?55U8*VB*qbSZcq!!~v~TNS<`j}9))9m)Iy0({_WR<~q16>hqD>S}?qPSNqTNY& zkPIlZbOClCY)x1;Gk(Qml}$le`~{q`vNU@!1*Ijy>e5v9ilkU-5)`Y60`)j$T~!3U z&qFH;a(kF{DGq@LiDv+=ATGU$6d@%;v|WtrVScV%z*3L#aE0XxOSQ*uE;JPH!Jtx)`{sewQ)U^V#R-4avCHpQ`j$M=mtgx;X0JY z4#SE^k{OVyH{**MEuv%+_6=~lrHo`&Kl-wU#>ILe(kDyHIAZo95~?NOXyH0tfta!s zvjj(WJbH*+KuUxLF$ap8abT4sIYWkGCBY~pbj8*lX0B0myC@A9hDJ%3roJ$)hXkt4 zR2IeQq@^N_w&?9*B6^`?Zt^%5Ba8K2j{V%Y9 z5zNdUMITxWa{@~#QOp$y(fC}!BHXxP{UPAh0p~Vv4|D4jgPb=g1tzC%aQV+5+K-ji2y0jDglBM^3ZNI!9UBam!L?Veyt|pV^64!z$FiW zRufE9XF&uXDk{M!oNYiBYUL+URXM9t-1wAr6r@u~C~yJ5scI*fE3;JuJimlM6~H=` z^#io3EWsh9_#8*1Tk!~vBBf%7dec}uKrfFd(bdvG0Ndf}I7KCJ$!ryY@_}slS|vc> zR{{h(kz&w+VV%6bW2k=ZJO6G)$6`YEu&QqoKC0n$*H zAY$aliZPC12H64G{c9KrD&FFgD!Z%!Nf(7ZgzPNaaqR^LizLNIFVEFyN`1ExFdoyf zwiV{GXB_cqg!Q;oq8pXNNdMr z(YuieA(fcnWYI}`7K!a(Oj#eFufDm%w_3jC(^nB_54N-ge7CGvv38O8L{^Ew??(fz z!N!(mUoBoK-`vqEEEWDhZHqtP3vOu*G&a|@`1o{~Z}pmr$`aq2CEm57z2@$K-^X8m zE-tMqm=iAt2~=OdsHvvC{qi-VxLDs9Y^@0f18vQaX|1Ub_}Uv9>w>C=3g4>bqAd{Y zXlwS>`0IpfFCa)ZEvh^4)|SsyVGTxhe~`UzJfWvV2f{7foKkF zrgG(-s}Qq0uR1+1X@L7v#+hDxjrBo zP-#;DE|uM;o@Mvd2ZFxVHrZx@A8z<+TRNJ9zCy97rOn^&YYMjndN`|z6%vu9Q>U0H<(S@4c4ew)o*)Y2T3&9_&DYSe3AMRUhSA6_|g_bg?o&sW1& z<@rpLYFk@jk_UEPhFoxYav?)vR$-zEaZ?u5N~;I;SS139AqAmI-{O@ezEw+nl~oHC zEsvLiHeYF=#t(P32Wr}C8+?nGR{4Vbo0pK0Az89&^}@2nQpM_(w=9L0B^3)+ET*E0 zs--J$9ug!qjqQQOR_Nmuwk@r`I!5AUhL8*-5kS1Ex)%8st*T&6sCSVZU?pNb{ul%L z8l5GYTAJ%!@@r6xw$#s-Gj7%*dI)5eXP{i=7(QSPg)scnEEzQAU@ zEydR!tbv+fLt{JLz$ip}eF(C)EwU5i!)TC)mf(HDN`ZW#;v)Rnick1E6|TIE>k+Mu zwaBplZouy_?w%bC0Ih3ksR`yG;BIJdsSA?O+HnKI5xHPfd!E0srYTSxya65K%B#2j zuPSuqt!hUiH1l=MEqUz?a7SJM5e;UYd~1GVb3NVz$v5SLLXlui?S{P8ww55&wzPq$ z0zFTL6N`D5E>fb6&3J(%Y^;kWP>{4H=CT=yXmXxhp zP$kqzli`3#0}kMyp&i`HB`s~W0l!j?N-E9BHb-H_;>y)477NB2e_$hKKp$5T zUtLoTW=PAlMJ*d!n*za0-5ehnW*aK-H&C!}EmB>=DM3YSTVs7gP|o;_=EQ)MYXx0d zx?p8V+2RV{l2xl$mI&E}vNzGYYNlL|zrFxpC~r1%ag5L72`e!=TAF+d@z;1a2&__# zoZ0Z}hCvfLJkN%h2D7WYc<3KqZf=QFO9JaV>PuT%HV6cW8l@eoljO8e=&O^yRkM_I ze>@(sXmgdtMBZ9c8^ko!*47x0qK!4}8|1RdKkkb)Q_ffwzLl%0d`nk&%NDO#ys~O> ziM0kM-aY=O|G|lTWvBU0aWyK|2kNoLS(^zJGu$L#Nt!!2WUP7LS0en4?X_)<8ylNz z5Wj<$df%qTU;{TFT*&1-YtFn}G30o^bPtfwoY(-!F*Im(k%7UOz)$<@gAF1v3I@$` zQrTtpQE_^SIedMpy98z#HQA#}xI~-Fw)~6B{sM*-|Ms%KFrJ$g&lSaUv(a6MRICz< zm)^Y6w|MQM#a=lfELyPo=F%zz17~c!v4N|Sik4fjNl=}P#m~C{JG92n1=uJR;fR1s zmnEw#BeMj9x?=F|LJn9Jl3bL~LG>cgz?HCL6SjPVquYxOq6$@W?|{vTIibauLOBOv zmBD-J@kflBu@;&!UR%@Dgkpist(cavudJ!V-q6xh*Q}ar?G({2E1H)qSXzc4mID`E z$=xENOs#78!`5-r>%w-Y zHPD9nsHUkgxW(7j(hjJ@>E8-YC11pJW3kDnIm)Zx$ z`6c-4PeI%E#T*dm^SB6#ON9&}cxW{?EX{3!TJS4-v;{NpCHKxkb0M2FyJ|6h9hj=6 zY3ce%$0%*IcBL^!8>>&SUCcp_AKT?A>iE^bDA4$hKlMq)$p|imZ8-TM8&3W!Lva4x zGxZrR%kyucsZXZF6Gv>>66fDbQ=btM=if|IpG^6;+boRsu|ED7Mt#!6WD_3)sKG-s zO%8!2|6yD{UCaWVxD!yrdB{zab0=`NuWv|u-o&-D`lQO|SaF&Y$9Y=F<6QMo{-SR6 z87ZA0PS*Tf_&;Q!_O%`hM`TVb)zt2KVKA-;`#7Fzp zXPC72cpT4=_zM;r;04DKMve_m7^tp z48H+TALVbpz|q3Lj*Rs}M@#-q{6fm&(;mJZ(Zcy7bn9)2l>Z@c>&1n{{~fsXT0-JZ z3<&FGgTyBSx85a4+ymTtDIf90z^yk>5w8Spy|syW4e%lt&Vq2>L!AC_<>E_zRQqym zIQbrv%L7KXhtFH9k1GFxg`z(;L%;R0#xI}0R-aVCUx8V_eYNV}oNw_n#N*&wzj7tN z7r6D~R7?Jec>k&R;5o1Qj26cs&-sFO>Uye(0M7-!)x>!Y#`(f!;=csW@z428)3e1z z;H@ihZY6Oi|D2eJ$Df`dvWZ*v0>1`0|E45Anw}-=M3 zTOZ=L+Hkm4{>ar@Kb%+(0_1ZN#)tS_z#TUHZt^p+W&qHC+kjiYf0zh-Kkzf)yG%ac zRbkD~l;_LR9k%}9T>yLky$bv&49hjkzcU0s4cs0Nd051kVX!0`< zh<5xc;8oyPoBYW`@B-lWc$){@9xsc4bNzV2EYI_KJ6;KVCin+TJ`d>acrEZE@b{X0 z9=qFd9>Lr3t-y~#-ebz|2Ywp374L_K;9mp&fsKC*IDau>$-e`9lnwte@M$*u7r^b~ zg-()^I01>Ab^DC>6tx85#F zd_HjN^_|4m0JmPNN&HUW*2^b}-w)h+NhI+nfm<(xB>pmR>m`rGUk7fz5|KDx*=@Z< zkoYfvTOSuP9}mGZQ{W%0SG*HP`ANX7j|&;T9&SGRqrv1a1%7g>lAwGI@ID*933%9s zKLLEE&A)sCbEgeI4&3hFGr*q!A5}_wemexuNJTu`_~VD*Gl7R~d_ECq$JYaQpuLv< zEkp2!fKRjWpB{oA1#bQ5p6&lGaO+3$#QDx=>zD1s`638*A}5g>q}~wkpZMjRZdkI6Dp2)Z-$*u^Cun^Bi6T`)ZoE#PdxpEv@Tu z3@P0H#=F}aXZhMUG`9MX_xNx|Y#l$E$2gZ<@LhW3Zoi(Zx81T}K5=mT$Is6$b9>3% z*xpv-_6)vWlvkFD!)s4<)R8zcGq2msqnAOLb#7)A!X=#TA{%#Sh}oNxxFs^^ic#L& zF*VC;(LoB`xKeBn;yk$(mYY(SUPbzF47eFb>gHV^-=?;jRvZ@y^W38Z#oYdtM8dF>tR6G&m>=Mo5Y;~=n6wBu+M=O8#o395TyEvQGnv z65$J&=h*Ap+s%%^2{J8K!z6AITg$Law0&cXtzm7dDfsr+&7zp!uQKx929J>ZtWlNj zXq4WPER%tA1ytK!=dUY_i`6BhI-3216f`ARgBXeq|EtPjv&z&5mE!t0RBNul=eLno%N`GB@ zV_a*K^m!X^)WvD$@KU!VKjGeEqMrsy)3dgld$wCwgXk6JnZLT}_ere5x(1a=94212 zFwc=oE?-<7F{>MT*3_A}?GQh3R1+ZPvP*6>RSdqVIjH`@w`c60fc3Zsb%{wsZZ=v| zUgF-&YHKDQdKRhZ))}T%kT`FM53(w8YwU9O4lcdRW}mFBvs5KD6fS4pC-6e-DNs9euIEh_@zDS^I5(b+Ht09hmsTWW|vuVRu9JYNrL@e@gL#D zwGIvuQ}8sI33q)xOVs9iC)qYg~_`ec+}}`IJW-jbmG|S!lC_WESgDpsm#+ z$-A(!2JHBRsvh$etZMS--HjUzyrbj>uYJo#;l^VF4OU6stG4pW?WQTXLHU0hIb+u- zf+&nn5y3*`5WyzGRY4IB1&e?ps}U3om@=hWokj47g_=Up#>PLuMk_lTJ1qiHu+!4Q z!aqRJ&L(#G{bujmTP_iN@Xfq=@0+)?vwL?tZ}+zL@cOYGEl6 zd-Hz%WgOMAy`2BA@;xk5NTxY1pa|aa(1||f7vQm{%DaJ4d;}~bYX1f50eAzn8SgNP zIGG^WqW(d5X(n$-XR$qPQ`LNtF~0yVu`BNf1~HztsVdKF?|UG;YXlbWuo+)5mb?w% z7+f})=Msw<6gGLv6%d~JIPrC0=F7#)jy2ovQjhmy z#ItAM(gD2F*q~0HQJdeZIX(>TqmunyL?_)+kBND?waYV3c-9`fW58o)K5reKwn+BF zeb6q?JmB~r@lHW>j^&w;oWR?iwyC=DT}L-&jdzQ9+(0;JUd#iBSMyU1oqD2A*#ypk z@xsg4HAP=Vx6e6^O2b>AtI`(w#32gn$a2#@z?ydA{l(Dd{a#@mek81!Z)cA8d99Qu zXZG{FuhNfqb&H$@=U^nh=X1REr=<+z#Fz8oIJTa-JmSRp+2!?TKJOp&dADD&-o_S* z&wCi^nZM?BDO*RwYJK{@f!?so_S^RTDPd;*9%A5_O=ABJ?`#^>+3pI8pS8#W0~s*S nLkyf|_4p2`FT$(m0J?JG19=O-Af}Rd=jV9MCvv25!i~BI?u{W} literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_memory/Makefile b/offloading_binaries/Normal_memory/Makefile new file mode 100644 index 0000000..792847a --- /dev/null +++ b/offloading_binaries/Normal_memory/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = normal_memory + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_memory/main.c b/offloading_binaries/Normal_memory/main.c new file mode 100644 index 0000000..e30688b --- /dev/null +++ b/offloading_binaries/Normal_memory/main.c @@ -0,0 +1,100 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1])*sendsize; + else + packet_num = 166666*sendsize; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile"); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + read(fd, sendbuf, 4096); + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + ret = send(sockfd, sendbuf, 4096, 0); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_memory/normal_memory b/offloading_binaries/Normal_memory/normal_memory new file mode 100755 index 0000000000000000000000000000000000000000..259244d26ec54a43b2203e825ea6f458e2cc1c73 GIT binary patch literal 12772 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 b5J8+b;+~4GzVkJ5e|8g|Nn9p)Zt;Hr)i`%n literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_recv/Makefile b/offloading_binaries/Normal_recv/Makefile new file mode 100644 index 0000000..42e30bf --- /dev/null +++ b/offloading_binaries/Normal_recv/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = normal_recv + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_recv/main.c b/offloading_binaries/Normal_recv/main.c new file mode 100644 index 0000000..535d67e --- /dev/null +++ b/offloading_binaries/Normal_recv/main.c @@ -0,0 +1,102 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0, port = 4445; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr,cliaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(port); + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + + while (offset < packet_num) + { + ret = recv(sockfd, sendbuf, 4096, 0); + if (ret <= 0) + { + printf("recv fail\n"); + usleep(100); + continue; + } + write(fd, sendbuf, ret); + offset += ret; + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_recv/normal_recv b/offloading_binaries/Normal_recv/normal_recv new file mode 100755 index 0000000000000000000000000000000000000000..2193f5fafc23c0164cc81d762fc59a78ebb57468 GIT binary patch literal 12772 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_recv_lo/Makefile b/offloading_binaries/Normal_recv_lo/Makefile new file mode 100644 index 0000000..939332d --- /dev/null +++ b/offloading_binaries/Normal_recv_lo/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = normal_recv_lo + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_recv_lo/main.c b/offloading_binaries/Normal_recv_lo/main.c new file mode 100644 index 0000000..945d914 --- /dev/null +++ b/offloading_binaries/Normal_recv_lo/main.c @@ -0,0 +1,102 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0, port = 4445; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr,cliaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(port); + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + + while (offset < packet_num) + { + ret = recv(sockfd, sendbuf, 4096, 0); + if (ret <= 0) + { + printf("recv fail\n"); + usleep(100); + continue; + } + write(fd, sendbuf, ret); + offset += ret; + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_recv_lo/main.o b/offloading_binaries/Normal_recv_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..b4afb87c39b5554ec9ec1e716492464e428d7c71 GIT binary patch literal 2992 zcma)8O^j1j6h5!7#Q_?uFv$FgPZ>;s;mw;`pb$0l;|wGWqA;!mo7eUZywLVF?Hia$ zj6V<)qcJ2(qKiqU3m0l!urMwR5)xSu<6;&r)PR|`yokENoeSdlo!9qf9@j*uF+X50Vt8wPYOH{agI<`^^itjx;+Kk2E6( z4mab*So1omZXn-CsP4_N1vff;afyt2tIt^PzV&R|ZUDBL#5Wihn*EqN`CPq~1oE0r z;QZ4IZWl1{d)?UNDs;TnLG*JlcLQ@#tS93`SEYL6@8#t`60{yN{hl;>-4oju+z(WB zDIxiZz|TXHpAN}S7yLx1-cl0v7HRbs`yRmDc|R8ex$rz`7utJx06Exq1h$uVjWw>N z7F^Z1xD@Oi{u+VJ7n+Lvd)=$4!;Pz{R~l-%-cU33##B)*BLP3G!}&G{^+&AFe;8WLpJQ!>%@uF%-?1LUnTGFC;8)p+ zGcek|Gsq=_T-g5_qVHxy{yBER-#234=PT{+F{AZ*HR%MhAJlV+?;`UAb2`?zwY>Z_ z#}4PIN%;q7Sl2eK+~1FJS0hILzOz z-)oY;C}PDB%R2`t#uRLWyBLKohP|;J*T%C)jrok@i-()WJKx;-5s&QTBSh=oi_pyo z(VO^;_{c3I1Nj~|l;MlRx4jhxoNGvzx65UbcRY1XRL_bk8&pO9tTt_0Mc8gH zPV*9?gJWX{wB*4TUf!Xl_5E7P7)l$N)IKd)sfwy73bQ75(8x|$n!?Okq-YRhd#1)| zO|(N^Lv!PfOgE_?*OFm-yQfe^=rkNqj-#pGf>OiC>oZR}#M>@oy#mlf=St{U&9z-Yw5ssltj}D9sdCNx?e1O5n?LPNrj9 zRI~GEgag0A$#N9pCrZ=js+J>2%vuhe5{_e)ggsp_=g5Dg-m|32j8mhTT2Y7!wHM@z zc1=*FYL%U7${w6NIyy3$JvuRQe0(Z9H8MImp2a?D6UeoWPv0h@J3iiH>?AsYtJk*~ zzh@X9C5oai_2Kfy8M}!38N1P@7<-5+zJAu%&olNCU197ay3UAyMzNvDsEe;yE389fPN~`y6R_qY^mqIotB! z_ssVHXJ^2M*Py)KV1M(z%n-QGKxR9(=MhKEo@$HUH|zK_;-fc-uN3UUgKcEveg?mt7hof7`fo)I1&Sb$KfgNLz1FNpV&cFosQCtr%4_pVY#z9R$=`LF1FD&>Y G@b?exqN;2F literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_recv_lo/normal_recv_lo b/offloading_binaries/Normal_recv_lo/normal_recv_lo new file mode 100755 index 0000000000000000000000000000000000000000..514b9c14ee618b40172b7fe1e176773a98326e51 GIT binary patch literal 12772 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 HGKu~#n-+|F literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp/Makefile b/offloading_binaries/Normal_udp/Makefile new file mode 100644 index 0000000..3bdff0a --- /dev/null +++ b/offloading_binaries/Normal_udp/Makefile @@ -0,0 +1,21 @@ +CC = arm-linux-androideabi-gcc +#CC = gcc +CFLAGS = -pie -fPIE -lm +TARGET = normal_udp + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_udp/main.c b/offloading_binaries/Normal_udp/main.c new file mode 100644 index 0000000..e226700 --- /dev/null +++ b/offloading_binaries/Normal_udp/main.c @@ -0,0 +1,123 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else + { + printf("Usage: UDPSender bytes rate"); + exit(1); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + sockfd=socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(9876); + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(sockfd, sendbuf, sendsize, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + if (ret < sendsize) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_udp/main.o b/offloading_binaries/Normal_udp/main.o new file mode 100644 index 0000000000000000000000000000000000000000..cefe867241b3ca9cabf6c7809d48385a71486a5b GIT binary patch literal 3604 zcmb7HUx-vy82|3v85`Y2CmnHhCcEaYji$rhX|&A>W?jvV)iD1+P_*8exvPWokD0r% z8$z-M3ME4MU=i*>J%somA`www;6sFg4?bAz!_I6stb8!o2Op&E_uV;X=6ZEYkBqdS0}_RR!|ewAx?vF67<(m%0Ps@4CQoBJzD9hlRfNj+j8?U}ScR@LdK$Bqwn zPI&ADJ$5KntEU3UD-^NWE^?~-;X@5I{V?ZTLnP$TSN7EENy#;Eu_qw+h&7+f&OLSL zfjv?_wRXtKiR8W%{KH4fr&#B>9`GS_yB{+i&Wn3Fg}9u&;e%_*b>w^z+l((%n?X!7 zEKi}{$3ApGIkBIvrj^9oYzU5p z6l%(%TEx~+6Q7nrO(HmNd+RuJ=UeMKuXotb@HxB^u_rb){e|IE`g3ZfpTd2q&G>;S z^a*vXcOqZ(z=>fHwH<^nu0Q)&03Y8a?ypZ)#PkGwY0w>HU43Gj?@rjo`93n2@!p)9 z`&P!HdvcfczN0N`-M?wvH6QYF_l3{5JgeOIZp0?fj3Y}m&#Sa|+huQR9(xZv%d+Q#Oo?JZX=9;LR|^#88yZ!UZD)z;msqaJ$?tGiG1Z$EV9o%Ewd0o0dsd{gAg z=ap;Jd3~s%pZxw-=vjO~e){aCO93?CLm#EKEuo;F=*&8z!?-AZ{EmGP@2Ax1)K~Ij zG(Rc_s>UI6t9D@fo_%I9YgV-MxMfzgieZ`5o9K)8_V&iN^u-eiou~>8ZN$jsVXr4Y zvdA&Jb6{Yr7Tfvyf%RH4{-T!9dy{%!;sq^Mu9y`wZyHr|J@s#Zu3;MK94Q*6fzA7O z&;ox@S*R@ahn3~Z3bjjFsjTv?UO@5cc)>E#K&#Tk!*T|DamyUDD4sPegW~CGmEx6B zlVnPTf?0&DShCDG0@_ryjLZ>=_wU^uH!Q1?OOGNoc=rzXciK;X&$;F5eP3}R6@T1A zB^2K^R0oeuCA>zip;AlHSyi$7IhUM$ z^m+Jp4}ZhM-|_Gx9zN#bCp`R&;8}#W6d8Z&k)QMMFFgFbhhO&aA3Xd=5C7T2Z+Q4G z9zN~iR4{VIc!s*Olq+sAvf0Y8Q5-{Ea%c%B`S|vRT{14O|wjye5q<8=L`5naTsR>`f(AWi;2PlyBU|@->w1& z8F8TAX6(XyBi4^GK1p;|@C%I4yDIoiA-~Ot563-$Q6Kn9qN9wf5C>y~D2OW-jpBYV zK1DRfxSHs5#;1wCWYmc6FhW0!E68!`jEEyE_!#3d#3lGe#xT)!!EZ4xM?8#(D~LCh z?Is!55ba`w{W2r$f5Zs;R|KD8M4opT;in7do#WORv40S#LbgZXet`!CqU?_}kTPx& zwQhP6bG}=0Abe*aRQ#`kDCIDs%Xp!=H~diZe%9l+sYh^>&lzW3ws?VcdGI^J`v0e= zLx=aEea>Ke2gRI0#>ejv>#;tMyU<(LoH~EAjDP(Cokje$`u-=c6(7G_h^_3_bH9CT yiw9cP%7OW7uxIc@45`N`b70X0=xJE!z#P}Y$ph_nYAkC4O4m^I-+3a2wD&KA;Id)> literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp/normal_udp b/offloading_binaries/Normal_udp/normal_udp new file mode 100755 index 0000000000000000000000000000000000000000..efdea1a017f3b44d2d95b9f20915089cbac8a1a2 GIT binary patch literal 51092 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 327680 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=58320, packet_num, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else + { + printf("Usage: UDPSender bytes rate"); + exit(1); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + sockfd=socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(9876); + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(sockfd, sendbuf, sendsize, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); +// printf("%d, %d\n", ret, errno); + if (ret < sendsize) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_udp_lo/main.o b/offloading_binaries/Normal_udp_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..297265b325b436e0bf6a1582efa9e4f25d9cfb4f GIT binary patch literal 3608 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp_recv/Makefile b/offloading_binaries/Normal_udp_recv/Makefile new file mode 100644 index 0000000..34bb5e8 --- /dev/null +++ b/offloading_binaries/Normal_udp_recv/Makefile @@ -0,0 +1,21 @@ +#CC = gcc +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = normal_udp_recv + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Normal_udp_recv/main.c b/offloading_binaries/Normal_udp_recv/main.c new file mode 100644 index 0000000..898a192 --- /dev/null +++ b/offloading_binaries/Normal_udp_recv/main.c @@ -0,0 +1,111 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; +// struct ether_header *eh = (struct ether_header *) sendbuf; +// struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); +// struct sockaddr_ll socket_address; +// char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num, offset = 0, port = 32000; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr,cliaddr; +//printf("init"); + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); +//printf("sockfd"); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(port); +//printf("servaddr"); +// bind(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)); + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); +//printf("gettime"); + // if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) +// { +// fprintf(stderr, "unable to connect the server.\n"); +// exit(1); +// } +// printf("bind"); + sendto(sockfd, "0\n",strlen("0\n"),0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + while (offset < packet_num) + { + // clilen= sizeof(cliaddr); + ret = recvfrom(sockfd, sendbuf, sendsize, 0, NULL, NULL); +// printf("%d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("recv fail\n"); + usleep(100); + continue; + } + if (sendbuf[50] != '0') continue; + write(fd, sendbuf, ret); + offset += ret; +// printf("%d\n", offset); + } +// close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_udp_recv/main.o b/offloading_binaries/Normal_udp_recv/main.o new file mode 100644 index 0000000000000000000000000000000000000000..35d3a2e89699b190422ca02ebd44a00c47c9ce20 GIT binary patch literal 2912 zcma)8U2GIp6h5;viv=28p-BJ4L5f+hOs8vwm0;2zT1Y5@P!kgq*V)}!I$?Kbvoi&n zpdw&GR6?R8`atZy$pa4r2~nd755yS5L*o-Mnsj%ai0Fg97$1!FJF|1!VIGvz?0o0D z_uO;OIrrR~zBxWQAxRPmktj*ajOf%#el=PAP%7D%r(d-c`c)o12B70A2;`1-C|vlA%RT+-Ki5*==~ z5q&SlY8X@WGY!%|@MNmh|5;r8H9@PP(>+!1@m||B=e;k>3yFxI82mgG@zWOZ(+NK@ zsx@PYT9edTlYRGL?DX@kd=%uwSh&u+`>&dbDt<;<+>lYS8?C@6?Hm6kC z>qHJWQv2#RQm@qIp;}!|*Xo;+HJ@)19Ao}Cqkei>XIuPYTM@51+PIb;t-l=F@8Fs_ zk8|orPW{+NBB!~EsC!q)Mndjgh_&AzyZG~E)QHze)T+l@K`r`G3(kRH&-3@yNI&l- zaHa~dk9xeH27{avh>dH8IbM_GGrQU237>sS^*!%#ofWmUUdFn1)Jd$<5x*TW_5U_kuq+jJbo$eNhSdn|=U) zCnNq8>=nmeT=VE2Q?M2Ns9^s%Vq-h5iEody;&X1F-`CL3eRcOUT(oO(6!F~{EyRe< z;x`f?KM8xG|IQD_@P*-Tc;LT98ce0N!NEaods<7SbfSU0;Ti))J7*LJ+)`yAYaJwrHxZt=bi{th&>t%5xgdlXQHlX6~3;Fsvf@=3;?|iS~?*?NpO{UU+GX zI;1_Pru4xfJ)PR2CM#95Y8FkyF}KjjR#+OQk+n!tp~jz`8mARXo3v6|qjX5?r1f&A z)FpMtHmo4cnJu|S7U))6I4v~z(_Hg}OB!cETGnw$tJ*D+vr8qjjJdMyni>My=D0@g zC}|^y_G^agR;}!eYdY9HD&hB6p+6SG^YVSKGm(tHu*jr@DQ4q@_cSDNS{*Rl7kG=) zdLZk94@pNR>`yrd1ICwvz&Kr|5g^Nc8Mx8u0u0U(KIX6T2rZ7Ww$`N zqV1TJ*)w@ybYwDfU}EC%_*7s?25h4C?> z1x7URUB*rr;XUf@A{t`sCMq)a5WUCPOLUR(aiZId8;BJ2HQOf{A12z(_z2O7fL~-p z(_UtLlxUvu38FiUDiPm{u8l;00cE_Ce+Q_bSDCi~yPqU#4|pQL&Hxed0|~bDZ@#!) z{Qnr=2O&a5s`w8L&v7vE5ib8-==?aMME>i5A=(^pgzL*e;UM5_%ffe;?f=hChYhbm zS$$!DrvjZpxKBf8JGN(;$HY@D)&KGw|3(7z2l4q+I0y#VhK1h>#8&YMK5Q3$Z-gC= wZYc-0-H5X>SP4YfF^U{`>MZPZ4Dg$Y_VDvSJNPvgH36mTcn0gN1S0(X3sGZ?0RR91 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp_recv/normal_udp_recv b/offloading_binaries/Normal_udp_recv/normal_udp_recv new file mode 100755 index 0000000000000000000000000000000000000000..91675683d5cc56c0a9a4383f348f416900c4d832 GIT binary patch literal 12776 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; +// struct ether_header *eh = (struct ether_header *) sendbuf; +// struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); +// struct sockaddr_ll socket_address; +// char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num, offset = 0, port = 32000; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr,cliaddr; +//printf("init"); + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); +//printf("sockfd"); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(port); +//printf("servaddr"); +// bind(sockfd, (struct sockaddr *)&servaddr,sizeof(servaddr)); + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); +//printf("gettime"); + // if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) +// { +// fprintf(stderr, "unable to connect the server.\n"); +// exit(1); +// } +// printf("bind"); + sendto(sockfd, "0\n",strlen("0\n"),0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + while (offset < packet_num) + { + // clilen= sizeof(cliaddr); + ret = recvfrom(sockfd, sendbuf, sendsize, 0, NULL, NULL); +// printf("%d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("recv fail\n"); + usleep(100); + continue; + } + if (sendbuf[50] != '0') continue; + write(fd, sendbuf, ret); + offset += ret; +// printf("%d\n", offset); + } +// close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_udp_recv_lo/main.o b/offloading_binaries/Normal_udp_recv_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..3ad2ad56f90c08af723e2adfd4b881881b04bfea GIT binary patch literal 2912 zcma)8U2GIp6h5;viv=28p-BJ4L5f+hOs8vsLNMtMZAmDCP!kgq*V)}!I$?HavpWTv zpdw&GR6?R8`atZy$pa4r2~nd755yS5L*o-Mnsj%ai0Fg97$1!FJF|1!VIGvz?0o0D z_uO;OIrrR~zBx8IE=dvzktj*ajOg@Aep=P5%M7f7!*y7krGwddwM70A2|`1+n|qa7<-Mim5*=x@ z5PdJksu)xBvvtxx@MNmi{#ji7H9@PP(|uL%@?P6C=e;k>3yFxI82mgE@zWCV(+)o| zsy1SYYJ=2jgMIg4?9B7cd=%uwlYV9?C@6;Hm6nD zYex<@Q~PT-Q?JzIfoe@2tkyOqt3KZ(IL7>OM*YmP&bIi)wjy42q<(#Hr1o-Xze8*0 zJkF^XIrU;6i7Jg%M4fv=HWG60K&-v~*rlJZphmn#qGmnb3Tn}dT5t{od!B!wM*0OW zfiqQrJ=Ep>)F0%WKx|wy%<-BepV_T0Px$Ovs_zAl>#V5F^)lAAqE2F+j`(%NPdL*R zMBknl{)2wV1+gaJU(`0GAMte9qit6q=lkJ3dl4h=p{refecFKRAGKZJzGR+YPKRsX zEiQf`)(%8!AogZ~7tp zor?HVuvZ*=am}N9Ou<(4qk{e8h>h*ICcZt+iqE-qet%s*|JA+EaM7;EQN(v+v=AdY zhu?63{3Psy{yRSyLl=j>;er1asee~W>)$b`^=tjx*|aZbxJIAtWDUE|EtL8)*3rCW zo9Ppnn<*L@+f-dgbxLMYb*D|0=QNxr>G+h*>~S@3ST^`(JI}*J6QiTM)#StrFKtl= zv|VaS?;p?yQ#;jUsce=_+cYZX78>3POT#oW7D+19`1YwWTA{Q^E2T9`o3u_^FSkn_ zQfF+#3eqaG1=q*`-EtGBg$93`Yo2sT<19$aR4SyEohHdTg@RecT+wk&4FPSdxJLFE zX~TyPXol;St;~#TRSkx2=k8iSQ32{No7!B*L#o_@@#6d4%7J@UJ8MhX|*FVHLG3_2kGZ?l5w> za@r`)F6p-8lrr3DJqD%IewU}MRBlPn6=v*ZlCzF46ZrC-li@lRRh;ZG(}iEtP4h0q z*O2lj%9d-AdD3#}sOh>^!F2LDW0oprG3Pq|t<0C50+nXm3e8k((=1VQO{r`Z-8^M& zr(#liV)Ed~@MQYn`1p~rsr1zF$mCcWp;X2>-Bb8=uO+%2;9bTxqCvD@_d24hj870P zFrtC)F}A}9?@@OL(Ewv7kl<`jf9iW0;y*Mz$HBx$xcv8^^W%sT`L6?pXmh|3t}lm#gMhOw3*TL~|35n&HoOL9 z^@aVN4s-_Leh@m_u|3N?CZ1`k{+H+YHyofph|izGK`_8JEc{j=wvtcqVY~2qBkXW= vOF6LZMx2eoN+80HQRKi==U}H}fZt5Cho1-9!LPBX2`JsbGgxCK5aI7%$>WQo literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp_recv_lo/normal_udp_recv_lo b/offloading_binaries/Normal_udp_recv_lo/normal_udp_recv_lo new file mode 100755 index 0000000000000000000000000000000000000000..1542a67b32211ff3f1e0f86a215cfffffa394e3e GIT binary patch literal 12776 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 wC^M# +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "usb0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + else + { + printf("Usage: UDPSender bytes rate"); + exit(1); + } + + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + + sockfd=socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("10.42.0.1"); + servaddr.sin_port=htons(9876); + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(sockfd, sendbuf, sendsize, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); +// printf("%d, %d\n", ret, errno); + if (ret < sendsize) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Normal_udp_usb/main.o b/offloading_binaries/Normal_udp_usb/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c07d53fe775e34fd7c08095f43fb3c81e4347fc9 GIT binary patch literal 3600 zcmb7HUx-vy82|3v85`Y2CmnHhCcEaYji#6DHkw(%tgE@O8s;AelD0cDcXe?7F>^O| zLrB&@p+qPjETSFAhY%k`Bq9n7e2^&c!3T?d*qQByl@A8{;DfaNzB}j4T(7R_f!W{r zo$ou}-*e7oKiIMBbwyD~4uulbW<*A(D+wiCNKhxuCu3m4pPd&^HC9dTZUnXtHad;| z#tf;BoZpS8PI&W#(`|G(L0|+(Mr}F@RDfNACxGLxHTOqhW4(_rG>$h6tX9`GS_yPq%~&Wn3FiMZUn;e%_*b>w^z+jJmOn?_92 zEKi}{$3`isJ+^yk*fIEDLCn+^g~ z=o9K%??k@nfg8gBYC8a5Tz~d44?e!{y}v$L5z|xfr9pRqb&c^UzB^G5=ljT9#(Q&i z_B$Di;mcjt`;NAxb^oSt*8<4P+ZR6H@~m>-yAhi_Gp;PvJg?H;ZI8XlIqW^`EYI`| z;!MVzF2v90aIP3`K+pA$xCnQAG0}o2+K1YEbCR}N{?He$V;5pk@LurS#x;+N{*0og z+(+IgYnzy(wzoXBc%0h)Y&^QQzkBS>Ravcaq@>-k>~LN`RVglE``v5j{=n1wur((qBCoV4&$N_e#bu4`zUofb4$?ofUb%YT7o1DW1#S_mE_p)8o1nP+lX#3Imor9{@Dh23N-afqRmJWXJaYE2#mBe% z_?tfdj*lPl@lhW?;p1ln&my$N$oMm#{7WDI%E!<9_+=me(Z{d(_%A+w!^eO1@hKmt zf|)Do8S2hbuDIFEW-CKxajZ4ZmrCU{pR8_^hKAfzJ(SDl-fNTIY-^tN3bKWfd|T3+ zd%sQKrA;!0@*%rTt0QSQBr@$%jxrW5V6~JvV%Z4EvWGZ8I%L^)u3(jhv*s9;E4iXQ zOx9@5b}y}6qVkAcrIBjhvdWanm#P+WzJOmGhjB(=5Emi7kSHp!n{g3QQs4k14%9)$ zF1$5j{TSoZL}vxRzzDsog5MPK+l=^V+!GiNfG;OH%D4h?Fvf_&xMJ}*?g!&DM5Bx= ziN0WbmgpR#Ms$Y}`cYg#j?-X799h9f8J8d~!7nmKiLMKNi*YI9VMJVEyr*n8$+(JW z7bEPK8DalpM%ce1_#`9pyu%1TT{!O?x5kM513(qBJp%U&d{-dK{#XMk;}%itrYAAy zyCnz0cLzene-uP1ml0jW3(dXZhnn}Z9=}aJf}?!yIP0;+3#`k7-x1dTKRp9Fya(-b z2irR+<_t1Eeur3(^?A%dZ%uRR{$&~e`UJX*__N~vC$AMBzgvi{?A7zWeQb*dTGq;e s`3~4Kc_N0?W0X0t=xgX{Sm?kU*TT&M?RIM{YXVBwQ1m}|B8Ig0AH@T)E&u=k literal 0 HcmV?d00001 diff --git a/offloading_binaries/Normal_udp_usb/normal_udp_usb b/offloading_binaries/Normal_udp_usb/normal_udp_usb new file mode 100755 index 0000000000000000000000000000000000000000..1a060cd8244a9b2a3aa3c5e548ef9a08acfe43e7 GIT binary patch literal 51092 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 gqRL(2(jJhFOm(AM<_1xV^KEx +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include "/media/Lucifer/android/ndk-profiler/jni/prof.h" + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "usb0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + + struct sockaddr_in servaddr; + +// monstartup("normal"); + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("10.42.0.1"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + read(fd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096); + ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); +// printf("%d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + +// moncleanup(); + return 0; +} diff --git a/offloading_binaries/Normal_usb/main.o b/offloading_binaries/Normal_usb/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c7b98299b7202146f593dd51abbedd372ce1dbf9 GIT binary patch literal 3720 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

4w4rW!=K($9A}U;oQ1iR_;w0Kx;)m+^qeryY-uK zrMB(k{C~AOuq+{2<~WNXc*jF8#*}Y>pFLIHHJsudU>Z@kUqFw*E1=JO2QkF)B*7Q+ z2ewl)d1E#fyImhu>qX}L0C>c%ye~M!r0b(9&u8yDAiOIi7H{yGUon@wP2d=uHd*Hq ziy0I?dCDaap7l8KajAxC6Q2M3AX0%on*h(fy1lysV0n88&kG`=fHg7C5Nuq zH?ZC2v`(erEzs3y8)M=CjXH9!X@9_)e)9doG30$;WgdPgtXXVtj`x1Olt-ujOFw19D7UM!aoq5B;T1iUb9b)G(osAe*^0RAl3i? literal 0 HcmV?d00001 diff --git a/offloading_binaries/Sendfile/Makefile b/offloading_binaries/Sendfile/Makefile new file mode 100644 index 0000000..9fa0981 --- /dev/null +++ b/offloading_binaries/Sendfile/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = sendfile + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Sendfile/main.c b/offloading_binaries/Sendfile/main.c new file mode 100644 index 0000000..8fb2710 --- /dev/null +++ b/offloading_binaries/Sendfile/main.c @@ -0,0 +1,127 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + int sockfd; + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + int outstanding; + + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendfile(sockfd, fd, (off_t *)&offset, quota - sentInSlot); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } + //offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //if (outstanding > 0) + //{ + // continue; + //} + //ret = sendfile(sockfd, fd, (off_t *)&offset, 4096); + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Sendfile/old.c_orig b/offloading_binaries/Sendfile/old.c_orig new file mode 100644 index 0000000..8875c21 --- /dev/null +++ b/offloading_binaries/Sendfile/old.c_orig @@ -0,0 +1,94 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=4096, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*1488; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(4444); + + connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + fd = open("bigfile"); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + if (ret <= 0) + { + printf("sendfile fail\n"); + usleep(100); + continue; + } + offset += sendsize; + } + gettimeofday(&t_end, NULL); + printf("time cost is: %lfms.\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + close(sockfd); + + return 0; +} diff --git a/offloading_binaries/Sendfile/sendfile b/offloading_binaries/Sendfile/sendfile new file mode 100755 index 0000000000000000000000000000000000000000..2988ebf7636070b2ce5d54f7c43968af957fc61c GIT binary patch literal 51160 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Sendfile_lo/Makefile b/offloading_binaries/Sendfile_lo/Makefile new file mode 100644 index 0000000..fcac9d2 --- /dev/null +++ b/offloading_binaries/Sendfile_lo/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = sendfile_lo + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Sendfile_lo/main.c b/offloading_binaries/Sendfile_lo/main.c new file mode 100644 index 0000000..a4f4859 --- /dev/null +++ b/offloading_binaries/Sendfile_lo/main.c @@ -0,0 +1,128 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + int sockfd; + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + int outstanding; + + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendfile(sockfd, fd, (off_t *)&offset, quota - sentInSlot); +// printf("err: %d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } +// offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //if (outstanding > 0) + //{ + // continue; + //} + //ret = sendfile(sockfd, fd, (off_t *)&offset, 4096); + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Sendfile_lo/main.o b/offloading_binaries/Sendfile_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..d9e60bd00e9df507ef34ca4a9412483e1db04b58 GIT binary patch literal 3396 zcmb7GU2GIp6h5=Fi-lHMYYF{XakNDjmFaX{uqZLxLW@a@AYfwR&vtfaN+;}JcBWWJ z6OEYIL=27g0gbWypo!tdKJY-QCOq&!NKAOpgcxGF-E2hU0TUB>AlC29&g@P{P`sO& z?|%25bM86k-g{=>9vU4M1cBTpP?Q>sNNcudLU9|S)Iw`Xd2#EnEejtm&s^TSJWI{h zxo~s!-0t~mFmY<>Y<#{dDb3XdU>HbBsnP}%fbGCHUMN+1oN)~}t8`TbI#^jl^wS*r zLFL3UDIZrwDwY3QS@|sj`y$cx9?XsP%vV1W#ifX&7l7Uaj$V^bkM@_!@gRH&cU9RA z{3wTDQw-PaGH3q+RH_K!QiY^ah2^4H@1!!a%$%eXHGl4*A3%KH_K%b=JTqSvl~YTu z|Gdr&)>**#Vr-fhGXl1|2yrmxnI6Qo>)hqnr;TMvahZ!jy+0URnAiwdT#CrxrXgCw_=U> z*!CvKEZJlKw4KAgY49r|byWjWdMS*)NC(Q;&olLLg~yw#?T`&at_?B)jEUzbQda(QG~ znfdP8*&tE)2^6_YpFY3tg8(H4*Aq5_UVo72G;kIVw^xDJ0z~h;Cl65KRN_W$_}|__ z-;S8vx4mEPll!)@V6UcHYHuc=Rx`a;w$Ph04v!ldohEZ?Dx*tQUdk8roMcVt5|7Kc zcb>U)K9|$emOX9i#iM$W1x!7sN#m-Kf$ZkYII9rt*|qCADZ1ySSGGuTd508J`r=A| z>{%&VDC$K$qpPOAg$AC4q^heag9HiP(6&QEv?kajtQA^=ZNdg&qu4HV2%UjVYe+Va zWi2%Yw2C#HaC@*PTl$nmGDk;p$}~wX=4&LK&t~-;=5l#Um*LP>(^At%NFF$_S5_^n zXrv}B-Nfqt=KU50>Gu`yytwL1MI_?qZ6aY)Jx!z#HF-E>Sn#(@%s0zk`@Wo$(XAx=MqCJJ{H>y4>7-8?79G|t%gE~aaZNo&PARZ2zgPc)p-Z6FyaFpMJ^*9L?;uE;t1S9J3n8T+S@d4zz%<~J34-s8pY$LkN2)nl#A0ukP zeP#O+Bjk57!v2`Urx`b(#xr7_bBx`Hj}iKO-#dCx_kkkr%}odYaPSteb2HX+ILe4E z*Ww`3cTWwe!HuMP)!_f!d{5m5^L9f@@h=>Cu^CYi)qV_$T=ZF=<+#qlC7UA+cH8Z- z#RDwMjcXFi|CgKs8P>rz*^TX;cKQsie_Yd8j^(*sh1}z{uKngYeg+)02k{E5E|+!x zxCX+vf>+L4N7)uPY+XGD=38M;<&M)_IYu`Io|=W+7zX%TfMajRf#YH4*v$zj-9(aF JT_fOb_ivQ&KcfHu literal 0 HcmV?d00001 diff --git a/offloading_binaries/Sendfile_lo/old.c_orig b/offloading_binaries/Sendfile_lo/old.c_orig new file mode 100644 index 0000000..8875c21 --- /dev/null +++ b/offloading_binaries/Sendfile_lo/old.c_orig @@ -0,0 +1,94 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=4096, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end; + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*1488; + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(4444); + + connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + fd = open("bigfile"); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + if (ret <= 0) + { + printf("sendfile fail\n"); + usleep(100); + continue; + } + offset += sendsize; + } + gettimeofday(&t_end, NULL); + printf("time cost is: %lfms.\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + close(sockfd); + + return 0; +} diff --git a/offloading_binaries/Sendfile_lo/sendfile_lo b/offloading_binaries/Sendfile_lo/sendfile_lo new file mode 100755 index 0000000000000000000000000000000000000000..0b26bc97f453835dcf4db801799146fd6b2ee367 GIT binary patch literal 51160 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 uz-P$TU?95BEj3zZael|uu850kKrzaGI- literal 0 HcmV?d00001 diff --git a/offloading_binaries/Sendfile_usb/Makefile b/offloading_binaries/Sendfile_usb/Makefile new file mode 100644 index 0000000..85a0d83 --- /dev/null +++ b/offloading_binaries/Sendfile_usb/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = sendfile_usb + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Sendfile_usb/main.c b/offloading_binaries/Sendfile_usb/main.c new file mode 100644 index 0000000..9c1fc4c --- /dev/null +++ b/offloading_binaries/Sendfile_usb/main.c @@ -0,0 +1,128 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "usb0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + int sockfd; + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + struct timeval t_start,t_end,t_now; + int outstanding; + + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("10.42.0.1"); + servaddr.sin_port=htons(4444); + + + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendfile(sockfd, fd, (off_t *)&offset, quota - sentInSlot); +// printf("err: %d\t%d\n", ret, errno); + if (ret <= 0) + { + printf("send fail\n"); + usleep(100); + continue; + } +// offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //if (outstanding > 0) + //{ + // continue; + //} + //ret = sendfile(sockfd, fd, (off_t *)&offset, 4096); + + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Sendfile_usb/main.o b/offloading_binaries/Sendfile_usb/main.o new file mode 100644 index 0000000000000000000000000000000000000000..89527e8cbe2eaaf37021d01df9e2f82ede3914b3 GIT binary patch literal 3392 zcmb7GU2GIp6h5=Fi-lHMYYF{XakPsrD%0t@YE@!dpv9y`5bBdZyR*AfI$`!FJ5wyA ziAGFpVhu$5pvKsJ(8Ta!A9x^D6CQXVBqls)LX0upt{W@zfQgAb5bAekXLg4X6z^u{ zyWhR%oO{l>_nz4|hsQ<)K_IsY6r(01O10WEp@a=FYNPd}ys-VZw#D~XW-sntIZ3Ux z`EYCP%BK@!Qd(<^z%Y=MaH3$+hKaXI4X1)z72qu1ioqy6PdA_!l?JvFui zKPn;E6vK79%-O#Hm8(LyTqUVoWw{vEn^Q(tn3Ht8?#~_c1BmaNfzisjCl+d=a$?!_ zpVyhiI*S-zijP*7;;&T11pF8%S9)V*oAl%oaeRXYd>@n)8ah}4^b8|#Pc0y2mc!_abfAL$Jk=Oic)YdN3E42@Iv^9kn0U5a$vVC$ zVdzQaN*i*?{v;4@0&?sV&dr5Mk54?Gbzy6m`Qfv1t$(3@uH3mn%HzN=aI6anWwn?tVnT(F+y z%b5kaJIUF3<<>bXLjQI-^X7ckr+=$_1_tZ}gXg9nnfGU~2iSG@VyDn0bO*MqBiTHfv(z-u zD%Ek)?ZKXGY10_*n}OVSdF&>6!Pfu2 zVb<#%uYcD~(juWUd723A$2^?Z81V7kKK_!AzwYBXA3x^f@A~+>!^0t>c0~NKZ~ikM z|H8+=^6}F?{;?(X1ra2s881ZqAA(xRZ)Ir8>%ro{7oo9>?U1GeS=nCT&JgAX8A7#Y+4C4btpE62BpEEuP zJx11J+(^`dYaGF5JC!h_d4T4L~XdQY+qu8 zy&a6OpK|yN<0hh$j9BLkV=v-kgg)Q*t|-weP{h5t>foOaUITV-#d;1$8L{Qs97Ou= zs3A4Dk<_Rf{C}J8soP-QZb&Kqfg>+A!wc0u1w}6Utj}^>=irjfkp{c%_SoV9mgUAZ ziRJ%GPJs;TV4Lj5_S|~H1FnBu(^!t>xm|+X!}YHH<~e?b9JB}Vx^Wx-xCX+vqF2sa zN7)uPY+WM;=G#zyRqi;=m1A^c;Hf#tr7*zX0vvlg4jd0V$8JtQ=?aq6?ivAiyMF_1 CmO#G% literal 0 HcmV?d00001 diff --git a/offloading_binaries/Sendfile_usb/sendfile_usb b/offloading_binaries/Sendfile_usb/sendfile_usb new file mode 100755 index 0000000000000000000000000000000000000000..278a5d8180bd8e2d87271cab3cebfc80faced635 GIT binary patch literal 51160 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret=0, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + int outstanding; + struct timeval t_start,t_end,t_now; + ssize_t bytes, bytes_sent, bytes_in_pipe; + size_t total_bytes_sent = 0; + + int filedes [2]; + ret = pipe (filedes); + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(4444); + + connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + //setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &ret, sizeof(int)); + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //printf("outstanding:%d\n", outstanding); + + gettimeofday(&t_start, NULL); + while (total_bytes_sent < packet_num) + { + if ((packet_num - total_bytes_sent) < quota) + { + quota = packet_num - offset; + } + + while (sentInSlot < quota) + { + // Splice the data from in_fd into the pipe + if ((bytes_sent = splice(fd, NULL, filedes[1], NULL, + quota - sentInSlot, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + continue; + } + perror("splice"); + return -1; + } + + // Splice the data from the pipe into out_fd + bytes_in_pipe = bytes_sent; + while (bytes_in_pipe > 0) { + if ((bytes = splice(filedes[0], NULL, sockfd, NULL, bytes_in_pipe, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + continue; + } + perror("splice"); + return -1; + } + bytes_in_pipe -= bytes; + } + total_bytes_sent += bytes_sent; + sentInSlot += bytes_sent; + } + + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + /* + for(;;) + { + ioctl(sockfd, SIOCOUTQ, &outstanding); + printf("outstanding:%d\n", outstanding); + if (outstanding>0) + { + usleep(100); + } + else + { + break; + } + } + */ + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Splice/splice b/offloading_binaries/Splice/splice new file mode 100755 index 0000000000000000000000000000000000000000..7cdec1d32f2e24cf5a35c9c15acba85cdbdd826b GIT binary patch literal 51208 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret=0, sendsize=1488, packet_num, offset = 0; + int fd; /* file descriptor for file to send */ + int outstanding; + struct timeval t_start,t_end,t_now; + ssize_t bytes, bytes_sent, bytes_in_pipe; + size_t total_bytes_sent = 0; + + int filedes [2]; + ret = pipe (filedes); + + struct sockaddr_in servaddr; + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(4444); + + connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + + fd = open("/data/local/tmp/bigfile", O_RDONLY); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + //setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &ret, sizeof(int)); + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //printf("outstanding:%d\n", outstanding); + + gettimeofday(&t_start, NULL); + while (total_bytes_sent < packet_num) + { + if ((packet_num - total_bytes_sent) < quota) + { + quota = packet_num - offset; + } + + while (sentInSlot < quota) + { + // Splice the data from in_fd into the pipe + if ((bytes_sent = splice(fd, NULL, filedes[1], NULL, + quota - sentInSlot, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + continue; + } + perror("splice"); + return -1; + } + + // Splice the data from the pipe into out_fd + bytes_in_pipe = bytes_sent; + while (bytes_in_pipe > 0) { + if ((bytes = splice(filedes[0], NULL, sockfd, NULL, bytes_in_pipe, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + continue; + } + perror("splice"); + return -1; + } + bytes_in_pipe -= bytes; + } + total_bytes_sent += bytes_sent; + sentInSlot += bytes_sent; + } + + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime < slotLength * slot) + { + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + /* + for(;;) + { + ioctl(sockfd, SIOCOUTQ, &outstanding); + printf("outstanding:%d\n", outstanding); + if (outstanding>0) + { + usleep(100); + } + else + { + break; + } + } + */ + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Splice_lo/main.o b/offloading_binaries/Splice_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..59f706cb81a3ea9d6c48b4e577b444f4c77b5a33 GIT binary patch literal 3884 zcmbVPU5pb|6h6~w5!e+fyM+CzFvu=02xWFHxFC}5FC<$8VM$0t%WON#HuNv;tO73* zFp+2oMtM*lpot+NW*>M!V#u1T2@gOp*#{B{;bFUVBB&3TkjRVH?@Z^m!zhT}P5a&N z+;h*IpL@@A-y4VwN|HokNYp_!MihD0TJeP}=%9Lbcv&}_Zh zH~WBOQ_LUwWpixstmzG(nu%{XYj&u0=6;|bNNSf`uLo*_DbeoIT%y}mUm^3tKB=FY zVov~jWTKxptF7il`&si7S)K{NzSzTdJh0<;*_rFILpuw_tPk<~TTS)_u@`;tOZHcM zW6nA8P@yFG3nfwtCD!Z5^F=Ic5DUvmIbQMeDdxgY4|FGkeZ~8sv!<+`ni28AUQy`W zRb=xf)-Q#IikCuf7UdB9>n;>mbQCPULU70|Iiq^4HfLRYJgZSZrFZu7mfoV%_kL_!Lx=OyjJ=yJ+3BCoBgec)qRL+JEU#U2Ve@O$ zFQBxVZLsT6Vl#fAOuLGx>uQ#VS+26Y&fEiCk&jzb4W=LKjrKaJCruyDsuvhRENs6X z`9tk2-}l1zz0jq~dAKg>%;(7qnU`q3Q&tBVu2M@ko|$~vRTp)pbPaO0r@*f^hhKM; z2FUOnhd($sMfRs3{tAEg!JmEq!=HJ0)=bym{W%A@0{d)}^TmEyejtt?%H`|qYa7;a zCT92!He${)=6uhYi`<_pmoJNYHM;60@_!R?iuo13XLzRb+)B7J95eX@|Y3$Jq12o)7k%b{@136*~||6a44<|2Q9RLa$n1s-_LlnO++KCq zdt7dvwL0Ol_fL8Ege&#i4_(o-yvPympp|F7gLb}49Ao|T(5!mm+q>~OME)0Xv#x*f z>imy96z*L}^**9~&k=owOZYK9JZ_)?gz-80ez1qar@~h&;wODeog2G?og2D?ox#ra zthg?&8QQvJCZ;9V8L8~Lk;H+~L{g{mv^J8|6(gf$vU*xE#&m_{LG(1rXOoGTPSl

F(kDo#3V4%FcE9kzWx+GX9)H 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/Splice_recv/Makefile b/offloading_binaries/Splice_recv/Makefile new file mode 100644 index 0000000..253d69d --- /dev/null +++ b/offloading_binaries/Splice_recv/Makefile @@ -0,0 +1,20 @@ +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = splice_recv + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp $(TARGET) /media/Lucifer/yanzi/projects/offloading/RDMAMobileDemo/app/src/main/assets/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/Splice_recv/main.c b/offloading_binaries/Splice_recv/main.c new file mode 100644 index 0000000..873124f --- /dev/null +++ b/offloading_binaries/Splice_recv/main.c @@ -0,0 +1,177 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret=0, sendsize=1488, packet_num, offset = 0, port = 4445; + int fd; /* file descriptor for file to send */ + int outstanding; + struct timeval t_start,t_end; + ssize_t bytes, bytes_sent, bytes_in_pipe; + size_t total_bytes_sent = 0; + + struct sockaddr_in servaddr,cliaddr; + + + int filedes [2]; + ret = pipe (filedes); + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + //sockfd = socket(AF_INET, SOCK_STREAM, 0); + //bzero(&servaddr,sizeof(servaddr)); + //servaddr.sin_family = AF_INET; + //servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + //servaddr.sin_port=htons(4444); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + servaddr.sin_port=htons(port); + + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + //setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &ret, sizeof(int)); + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //printf("outstanding:%d\n", outstanding); + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (total_bytes_sent < packet_num) + { + // Splice the data from in_fd into the pipe + if ((bytes_sent = splice(sockfd, NULL, filedes[1], NULL, + 4096, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + printf("in error: %d\n", bytes_sent); + fflush(stdout); + usleep(100); + continue; + } + perror("splice"); + return -1; + } + + //printf("%d\n", bytes_sent); + //fflush(stdout); + + + // Splice the data from the pipe into out_fd + bytes_in_pipe = bytes_sent; + while (bytes_in_pipe > 0) { + if ((bytes = splice(filedes[0], NULL, fd, NULL, bytes_in_pipe, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + printf("out error: %d\n", bytes_sent); + fflush(stdout); + continue; + } + perror("splice"); + return -1; + } + bytes_in_pipe -= bytes; + } + + //printf("%d, %d\n", bytes_sent, total_bytes_sent); + //fflush(stdout); + + total_bytes_sent += bytes_sent; + + /* + for(;;) + { + ioctl(sockfd, SIOCOUTQ, &outstanding); + printf("outstanding:%d\n", outstanding); + if (outstanding>0) + { + usleep(100); + } + else + { + break; + } + } + */ + + //ret = splice (fd, (off64_t *)&offset, filedes[1], NULL, sendsize, SPLICE_F_MORE | SPLICE_F_MOVE); + //ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + //offset += total_bytes_sent; + //printf("sent:%d, total:%d\n", bytes_sent, total_bytes_sent); + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Splice_recv/splice_recv b/offloading_binaries/Splice_recv/splice_recv new file mode 100755 index 0000000000000000000000000000000000000000..a9fa81255124d382dde602488643913256a493fa GIT binary patch literal 12824 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 d5wgn-LdP>o&Q;OTcd +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int sockfd, listenfd; + socklen_t clilen; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret=0, sendsize=1488, packet_num, offset = 0, port = 4445; + int fd; /* file descriptor for file to send */ + int outstanding; + struct timeval t_start,t_end; + ssize_t bytes, bytes_sent, bytes_in_pipe; + size_t total_bytes_sent = 0; + + struct sockaddr_in servaddr,cliaddr; + + + int filedes [2]; + ret = pipe (filedes); + + if (argc > 1) + packet_num = atoi(argv[1]); + else + packet_num = 166666*sendsize; + + if (argc > 2) + port = atoi(argv[2]); + + //sockfd = socket(AF_INET, SOCK_STREAM, 0); + //bzero(&servaddr,sizeof(servaddr)); + //servaddr.sin_family = AF_INET; + //servaddr.sin_addr.s_addr=inet_addr("128.111.68.220"); + //servaddr.sin_port=htons(4444); + + sockfd = socket(AF_INET, SOCK_STREAM, 0); + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.1.15"); + servaddr.sin_port=htons(port); + + + fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + //setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *) &ret, sizeof(int)); + //ioctl(sockfd, SIOCOUTQ, &outstanding); + //printf("outstanding:%d\n", outstanding); + + gettimeofday(&t_start, NULL); + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) + { + fprintf(stderr, "unable to connect the server.\n"); + exit(1); + } + while (total_bytes_sent < packet_num) + { + // Splice the data from in_fd into the pipe + if ((bytes_sent = splice(sockfd, NULL, filedes[1], NULL, + 4096, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + printf("in error: %d\n", bytes_sent); + fflush(stdout); + usleep(100); + continue; + } + perror("splice"); + return -1; + } + +// printf("%d\n", bytes_sent); +// fflush(stdout); + + // Splice the data from the pipe into out_fd + bytes_in_pipe = bytes_sent; + while (bytes_in_pipe > 0) { + if ((bytes = splice(filedes[0], NULL, fd, NULL, bytes_in_pipe, + SPLICE_F_MORE | SPLICE_F_MOVE)) <= 0) { + if (errno == EINTR || errno == EAGAIN) { + // Interrupted system call/try again + // Just skip to the top of the loop and try again + printf("out error: %d\n", bytes_sent); + fflush(stdout); + continue; + } + perror("splice"); + return -1; + } + bytes_in_pipe -= bytes; + } + +// printf("%d, %d\n", bytes_sent, total_bytes_sent); +// fflush(stdout); + + total_bytes_sent += bytes_sent; + + /* + for(;;) + { + ioctl(sockfd, SIOCOUTQ, &outstanding); + printf("outstanding:%d\n", outstanding); + if (outstanding>0) + { + usleep(100); + } + else + { + break; + } + } + */ + + //ret = splice (fd, (off64_t *)&offset, filedes[1], NULL, sendsize, SPLICE_F_MORE | SPLICE_F_MOVE); + //ret = sendfile(sockfd, fd, (off_t *)&offset, sendsize); + //offset += total_bytes_sent; + //printf("sent:%d, total:%d\n", bytes_sent, total_bytes_sent); + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + + close(fd); + + return 0; +} diff --git a/offloading_binaries/Splice_recv_lo/main.o b/offloading_binaries/Splice_recv_lo/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9f831b142e40e7836bdd85118e0f135905dc0f85 GIT binary patch literal 3492 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 XXOyg~p=0l2ncfLpmg^iLWDfctY6?>+ literal 0 HcmV?d00001 diff --git a/offloading_binaries/TCPReceiver_mobile/Makefile b/offloading_binaries/TCPReceiver_mobile/Makefile new file mode 100644 index 0000000..8913c1d --- /dev/null +++ b/offloading_binaries/TCPReceiver_mobile/Makefile @@ -0,0 +1,21 @@ +#CC = /media/Lucifer/android/lib/android-18-toolchain/bin/arm-linux-androideabi-gcc +CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = TCPReceiver_mobile + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/TCPReceiver_mobile/TCPReceiver_mobile b/offloading_binaries/TCPReceiver_mobile/TCPReceiver_mobile new file mode 100755 index 0000000000000000000000000000000000000000..63c2997ad14dcd69e0e403bf4e71228b8281a7d3 GIT binary patch literal 12772 zcmeHNdvH|Oc|Z5=O31JlyON9*LF}strp9&ry(hxdR%vU?_KYhV0VVLOzXx@ zx4++gNS96Uq?2i;f9ObOzwz3k=kcvOwn>sC+~gB01hIWJLUaQjZnro! z-9ixyz*{DkidvA!bF+>zv){=+z$Pehb0ctO@~NBIo0`F7Mw3DWZT`{Qgg6?ua{(0& zBC}ocWq@~RWvU9F2JZLpMJ$$1B?e=uOsatL;K6t-UQiDL$)|=h@wA8+ zvMDi|OJxc}!lq{jA65$jgOU{K6b2|G;)8?gXhDpQ74l-}(Ojyaiea@-NR6o3p=A7! z$f<*mh_QTHRY%2OI-6I~Qhu9=smXXDj&dTOkL3&T94t^Rt%<>KJ`3%MWSRve_U#rH zkT@=jk%P#KkeSH833(wAqyREwov8`A&MN)#AB3Eh7_&@_YbMSgCeDWiR%tH2>K&Yb z@p`gDh+6?Q2cB`@a}GS`z!|_>U~Ca^2^xNt5Dos25DmUg2tzIsqTx$~Xy8pk81XhC zI-?V!!|xEH)0YY1jQ0uA`KyGO4A%%@><5I4h4_dNj`Qp7Wxsx^T(3{-byvSv?*0sn z|NgWoUpQ)ZfB0hAEwA#FmwU>~Jmn@&Ip8V#J>`#nHmCENr~JOB{Enymwx@i_Q-0l3 ze$`Wck!8_as*AS&v~K*Rx=5wN0KB}vc&aS!Y5(ayQ& z^4)uar^-#rqVg8-eUX#z1|y5g8^Du-C*KVO7g;iO;QPhbOdsS$P%AY>wwvFrRNnJn z+-`~|Ub-Az3IA6rmG_aaB40!P02#7I0D1$0ZB6S!OzY28Dp#5zzYqM2uqz0grv7QC zxdC>`>$jUtk|1G=s3R!DsrqHN&S& z+W0!3+2+C9Hh>qIG~|`=v9ig0F(Q|vsP{tmcH@Qa-!-hd>olWng=XPaUE;_-7oz@b z*`c}mzW2FJhTFd_0(K#Wg0Od$)%T@{OS|m$#ixLeeq4ebQ|-1*LD=Q$U_4Qe3_X-p zpr;o;yx2K69=Cz!j(V(egd9c1>wo_%OnAYQQ4U5I+x{ZHslq74ahSpKdoQ&~58 z1#+M7p)eBccuOT18R(j?>%{cpDK^ML1Ut(O|s)-)f zWku0_kyfl_pVFmZ+bq6T>?uXYUwT58LM3Sl{P%sW)Vk!Tfh`W!jG7{7n6lJZ@~y>O zSnJT09M+GLNgI9#a#D1Qspw^IK+G8FB5aHv zHV>}^tjU%32(eO@_LsEc3{0Le{Vk{Un&5ST*`>`+DulrjjG_-pf?LOy^>c;KSeiQ5Nw*t`<^vi`N*sLf?Gve2bkUVa5 zHXX5S3`CPQT?XAhZqy)_XnQB*+%ldNO48akQ(Dq0qwliRyS3poVhCeyaLk)A25vmy zD6$YS!T6Uj4&* zBc;VlCQ7Ks7`e>$pf?1)j5P^!ErdB1lC~W;e0!gg(2gYEI>9zB<1kAf`);drNQ_%) zyH@Ig4@58453DhN0{d?yBku|#4hA++?rF%4D>KH+AjDQzjc`Ve6!>L=tB36^s|h&WABYOvspP51`Fa^tn>hN(){;T57#-ncnu`vS2`T zhXP_vD2wAS=cI3-RX^Ht-Z;Ac6+_x<`7i|kW2~o2%P@||Up|I8td;)IJgdvCwdV2C zSzQbO-~CO@;|(QAKh{`5Ov{12CEt!$Ifqsr(`SsD-oMss2fnF)^_EHFY|Dgkq((Eo zy>Q$(R@RK47yHcxf&EiBQa&k550x~1Zr+Sy+~jzzDFwfZwPhS*-Kw8MYzKM^Ma1`c z@PA1AgpPF`@r`Go3u{Gz@$vU^Ncsu*ZwkgUc!)_W_OZ0tvEQ3CgKOX`#(&MYA-7`A zV|<=nd|dBrdPbkp|I~PPaZ#cT)|{X`_U{O6=e&S^ld@b_ys`@A%EycdWJ7DF49*+M zcKVCZH-4R7&Lb?TEpl8k?bx4P7v!H|oNKXe2(hNbn3Cf@a}sgqi#&_9qp^fJXUjyU z7)u7m(r9}ypmRJCPYWjojvG@0Pld`@U+6d5zfoFglrjm#Jc>}B%6 zUftLGn(pFKE#}-0kaf`YH*|Smn^NDawFbm^t1DB@JNGfXRno`Q1Fu&9hJp2UVNIWA zeEOjyMr{K7Vy9+2vvJCpY}JfaFV7hNh_T?hkMU^{*4VX3##riJ4)f;ujbYnU5fJ5gsMdYtF>mZ{#Sj6uNP10QiMP}h2| z(vwN%vZ$8d{Y`VeGGy#oe1XuUA&wegB?2 zmG1Dm>(RTEu1IHhWL?*1l@+5oHK(T4cwW6zd_VmCk~R!baPXrR|E&7>oN-$fc3 zRv@5gSw|XECx?yD`L!`iB`9;4Qv%IW$42abn*uf^5JzquU~a-#S=Fs!`5T76H5>g5 ze(MVe-S=zEfR5`XfTJjmw;}4I2l6TPfHRTiCYL*xFnii@Q)TR6JEigNM2#m>&I}Wn z+e*)Fr7PTpX%`XFxNSLCO}~_Z?X>y{ESmrSEtf(fSR0ZWBwyXqx;yF`xgh>Bn!QFl zqr<_mM(25MAWq^ME{hlN%hlfY0oPGCvB=L@gm9o3&Zd(}XSlNyc+X1w#OY!oDJa&g z>E9}9{dLk!(n7hx-z424-Rf(WTIAbo3m`I^tWa?K+>vh(i_M!(T|B?si zp7(wg&i%noi>&(GGwc+waQ9vgcSzRfzGA1FEu4FcodVb0TcUlGXKdK%CUJ*@S6F zw^rfzRpGm;@V!;|7pw4O6`rcXN2~C!RN<3V_#af^(;l2>#1p{Xc%pxv0e%4fm~s5^ z=T-Rgz`g!D54;)vUJhNX|D!7WZQ$PVxC}fA`KTlRA5}QE5^)Cng2NA1;hzNlJop0+ z|IR9W4RFT4JKh_Cd&m23;O_kAy}bLY@CSikcQ0=+S4gPCsZ1<+C=(w^4TcBB^0-)@ z6lCPEy?}s~uMi&=BRJmyOJ&x^lgV5xo;fsIPG_^DiTL2dxMXKv>x&&g)wG(6J(`P; zj^ak8bMel(^cRaI^I1nm#I}6l{+^xpZWgh-cRaAEXGiRTZQFKl?T_{MY}&Ck29@5M zgS~xQ@4f%t{#Z|6U(Xj}?X=G{RkObkR_*} z0<-4e0G2-L{4->pnW(P_8D?yy77k#^@wxaRWLJ*Q@66+%u^tn3Q7(Z@8~D8LKI2|O z*-eyVT8r$;aj&;B)=W3Ka`!oMY=>tWW}ai*UiL%-EMN_=xZ#|mK^u~6Obd#O|Bf|StmjwlY(0bR>A%u zkNFJ;+EmCWh%-yMO`#0aA0xYE;_KV6UwQ~`aYdEfx0l=JBGzGY<#_gU%cQ>vxhM-x za>sB6IPO!;rsg~B=L(nL_Ltv{VfLs??}prGTm;Z<>m!sIQ*Ii7+zgcPy%L7T@?Q|} d8nVX?BDhkBn5Uwv?@E +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: TCPServer port rate"); + exit(1); + } + + if (argc > 2) + packet_num = atoi(argv[2]); + + + listenfd = socket(AF_INET, SOCK_STREAM, 0); + + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + listen(listenfd, 1); + + for(;;) + { + clilen=sizeof(cliaddr); + sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + printf("Accepted.\n"); + //setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); + +// fd = open("/data/local/tmp/bigfile_w", O_WRONLY | O_CREAT | O_TRUNC); + offset = 0; + + if (fd == -1) { + fprintf(stderr, "unable to open the file.\n"); + exit(1); + } + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + ret = recv(sockfd, sendbuf, 4096, 0); + if (ret <= 0) + { + printf("recv fail\n"); + usleep(100); + break; + } +// write(fd, sendbuf, ret); + offset += ret; + } + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + } + + close(fd); + + return 0; +} diff --git a/offloading_binaries/TCPReceiver_mobile/main.o b/offloading_binaries/TCPReceiver_mobile/main.o new file mode 100644 index 0000000000000000000000000000000000000000..3401c9a3149da2d143c81bd6b5e062d5ca8e518c GIT binary patch literal 2992 zcma)8U2GIp6h5=FEk%A@p-6vL9Hr=jWi#L^D^${dNGMXFBuzw@+1*2h@X0jstucm2LwM+eF~pywvt?t%ClelcFs|R3ox2S4pq!@jo$uar z&pqefb5Hiev59d-QAmnHDSF6=);9YyZ5ba@w3Rl~+R1}|BvwADE&X=7Hn4WO7CU;X z)~S!w?vq-V`h$d8?;KsO#|N*iCo;=*P2W=A3hV=t?rx-j3a~%mI&kszrk}0wm5K1} z`cf^6vA2)A8w0?bFE7`-fb1&?+(zz(l5jWvX*B+nG2GX8))hLpv5n|wIrac!arh$r zv${&I$M%D?r4=`?iDAultZ5^(OTQji~y zk+#%~<1us@dknTK{UaXdd=fdI)O+h{zw0qJ2Gp9GaXnRAZ1SvH+Z*D02Qa5Eda(mI zV{N$hogS+XV%=)yl((9B%k$S}U2kv7^|`;6IsR3NSl`lvG3oF7W5b@zZG8{oPR49n5BZ_Ibm@6CklF*!rR;h}z=3Exqj9C(C)C*anFt5!RW(oSf z(hLs~ofsK8s-;f6aelv+Nx!BY)(>U$?BOF?s%i;Kl!Rf6{WNp{mWD9$CMg=!wpXUc zs6F1HY*u!}JC$9^ZnaD4R(fK4+9_>copp>n(6O3$S!(c?cEo~1>7wBnl+N2WrL9Vn z6e_c`qKvt6#Sv))bkKH;!WBvnojsj49LF;AbB?gFdsM=GJWhW#!t?4QU7kqAUszPa z1%*VVHtGm*M)=JL z|0%+0)-cQI0`(QiEWc_Li&oAkUv257N~N0TO6xNym-DMUXC5xL^y2JX=^-ha^A8Dp z`Oe8UFO`iF8BWEds%4g)84?SoLw2QbML3i<%S9@gwj;`9_^*|!bB;|j?^z~Z@Fn3m z=B%j96pgF?E2TNRBt(@8rHU;mcVgnq@X$o=%=q}Zv8mkD(D1}q4nf%CL|-7+^(FurpW*MA|XR9C+$B>~sup??gHHdEol} SGnQupN`Ipr{=!Ni(%-+M&$+Vz literal 0 HcmV?d00001 diff --git a/offloading_binaries/TCPSender_mobile/Makefile b/offloading_binaries/TCPSender_mobile/Makefile new file mode 100644 index 0000000..a51dee7 --- /dev/null +++ b/offloading_binaries/TCPSender_mobile/Makefile @@ -0,0 +1,21 @@ +CC = /media/Lucifer/android/lib/android-18-toolchain/bin/arm-linux-androideabi-gcc +#CC = arm-linux-androideabi-gcc +CFLAGS = -pie -fPIE +TARGET = TCPSender_mobile + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/TCPSender_mobile/TCPSender_mobile b/offloading_binaries/TCPSender_mobile/TCPSender_mobile new file mode 100755 index 0000000000000000000000000000000000000000..399a5636e2b78b533f93521e440187015f5c78f8 GIT binary patch literal 51180 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/TCPSender_mobile/main.c b/offloading_binaries/TCPSender_mobile/main.c new file mode 100644 index 0000000..5c14665 --- /dev/null +++ b/offloading_binaries/TCPSender_mobile/main.c @@ -0,0 +1,133 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: TCPServer port rate"); + exit(1); + } + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + + listenfd = socket(AF_INET, SOCK_STREAM, 0); + + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + listen(listenfd, 1); + + for(;;) + { + clilen=sizeof(cliaddr); + sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + printf("Accepted.\n"); + //setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); + if (ret <= 0) + { + printf("send fail\n"); + slot = 1; + sentInSlot = 0; + offset = 0; + goto RESTART; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } +RESTART: + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + } + + close(fd); + + return 0; +} diff --git a/offloading_binaries/TCPSender_mobile/main.o b/offloading_binaries/TCPSender_mobile/main.o new file mode 100644 index 0000000000000000000000000000000000000000..2e8738bb3d7336efdd8451f230d6fdf5e9b2eba6 GIT binary patch literal 3532 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: TCPServer port rate"); + exit(1); + } + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + + listenfd = socket(AF_INET, SOCK_STREAM, 0); + + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); + listen(listenfd, 1); + + for(;;) + { + clilen=sizeof(cliaddr); + sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + printf("Accepted.\n"); + //setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int)); + + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = send(sockfd, sendbuf, (quota - sentInSlot < 4096) ? quota - sentInSlot : 4096, 0); + if (ret <= 0) + { + printf("send fail\n"); + slot = 1; + sentInSlot = 0; + offset = 0; + goto RESTART; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } +RESTART: + close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + } + + close(fd); + + return 0; +} diff --git a/offloading_binaries/TCPServer/main.o b/offloading_binaries/TCPServer/main.o new file mode 100644 index 0000000000000000000000000000000000000000..3d3635711dc2998165feae11d427c9632954cfa0 GIT binary patch literal 3744 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/UDPReceiver_mobile/main.c b/offloading_binaries/UDPReceiver_mobile/main.c new file mode 100644 index 0000000..3d83642 --- /dev/null +++ b/offloading_binaries/UDPReceiver_mobile/main.c @@ -0,0 +1,97 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1488, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: TCPServer port rate"); + exit(1); + } + + if (argc > 2) + packet_num = atoi(argv[2]); + + + listenfd = socket(AF_INET, SOCK_DGRAM, 0); + + + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); +// listen(listenfd, 1); + + for(;;) + { + clilen=sizeof(cliaddr); + ret = recvfrom(listenfd,sendbuf, 4096, 0, (struct sockaddr *)&cliaddr, &clilen); +// sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + printf("Accepted.\n"); + + } + + close(fd); + + return 0; +} diff --git a/offloading_binaries/UDPReceiver_mobile/main.o b/offloading_binaries/UDPReceiver_mobile/main.o new file mode 100644 index 0000000000000000000000000000000000000000..1cdaf9b6594e28e2b8b575e5d4d4e2585be55805 GIT binary patch literal 2024 zcma)7Piz!b82{eRZe47Fr4*^s=p?N&ly)+dRn}4sWrL7Fkv}CdF~rR74zQuSvzZwP zJ!#rA@t`MT!W=w!@W8J|gqd{?B8PhO8iPh-w1eo({2#^pcf-xcD`D-?N?2Gt8y1av_>7cD zuD2>mw6<_BDjTEG4d57%48LCi3gAS_CxIL9CH@>^D#v#jo1qHX)%X4W3~&muG$6;C z1MVchFDicjpTXcyx%V?;ZzSk)e<#teQnm$I5wXblB2vf?*xsPgVZQ8BfX^=Yl!%@_ zIC3vijL)A)TY-JDdvLsRE}q8mU{^psq$c)N$mIEII3LSN-Arj9s; zhI7}91CcW42aJOyB~+?@pr{)OuPNblhEFd+XKVz8S=3oQ8GdgRA_IO8kDd)49{o6o zeQSO&t@$yJeVJn_65&5wr!pDuhvO%M>=~qhS=0{x+=mmW>!h*0N52mSPb&v;QGfdC_%FD`7v!b>ZxmNt z^SZUDuGTMHww&9RqxNjaQytT@h?bj8tLIrQo&8VO>x-&(`uvqcYE^$%T`-PRjoQL7 zRqHvHW35@HYaOEHSy-Bu*=Uncu`Ip4dWuGhWwAqy7bnC%v0s@KuZq_SuaA)Ku6I1M z0rZ>%Z^#wm>7I4RBfVvMCg}~=CEc+T(zH7rs|#J%_ADI<&AXo2yh-}| zh3FfgfxVYSHHK<9&Y{kY IA$z{>znK)AGXMYp literal 0 HcmV?d00001 diff --git a/offloading_binaries/UDPSender/Makefile b/offloading_binaries/UDPSender/Makefile new file mode 100644 index 0000000..87b8e37 --- /dev/null +++ b/offloading_binaries/UDPSender/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -Wall +TARGET = UDPSender + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) $(CFLAGS) -o $@ + +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/UDPSender/UDPSender b/offloading_binaries/UDPSender/UDPSender new file mode 100755 index 0000000000000000000000000000000000000000..a02851ab6507bf9c76365aa812dfb222f3c1c9cc GIT binary patch literal 9100 zcmeHNU2GiH6~3FqV8AfzDnhRK(I&#wwNu9g1f~YDh8QL#XiX_e+??HzkpS?^lA zYvG^(3CaM&WFk|MHbFcjQl+B4B(1RIpgK4$%9=hv)rY7Li1JdjmOzTk111mIe&3xt z_U?oqRpJF{j&$$&x#ygF?zv}X$M^b!E1zAxUWnLgAr7q)Ld4PbH3?yh1SlbXh-RWm zIoSWiz^@0M`URzp5Nl+=lB1svOd#csf!#YARg^s^t_RH{Hi2-&b$U$7vNc&=Q4IS_ z-iXCuc-I z+>aC5-|~9Fhkexhm(t3}kz#7h@}=SUKGy!)v=MpK+SdZ>q!$|~<>vk!{dH=nhlV-{ z>ZPtu=r`~!Wj-fM2gZg9IXPY~eyzX24GTZ8<*eM#77`ky94*w9-8KH=uxEVDTAzH_ zAGUfKq|BwhDZV!CZ=bdxU+<641yZ>TE6?fHEkA#9VDpyX8B2un2A*(KJEI?!S0xo< zJ>CO7q!a#Hnt^-CYe*)9m;t>6Og+{H_jY`p|L*t@4$gwV32hLq9;nM!pNIN!(&Mnd zEi432n*!lsv6ZOD(deJz>n1z_dYb3TZH|F1dpj5WTx*zRE9N8hIB<=>{d>zOK zYvIS5?*UKfLgP63Bya>#2BHi^8Th_tV5jN)*F5|wU;i^VV-e=Lm|lwM9Y6b@T5YS_ z^d>&wwz*=fGq6;#4?;!_XLb^l=}eCURqP!4_>Y9B*cmGPLKlD|QQYm8WJ>0H-p8u#; zGmbq@#hR1IXq@oLpK?&@E-aBcC9QzbvuBKJ^Z>aEnTP`97PsDyit8I=r zD!PSTH3l*J&xWK_Kj$RpS)PPN)9Acty3VrifVw8Gq?u}4{=K9;Ie(7-l9 zd*!Khm8z~?S}kn5iiNmMCy@Zt6=vVSl40}Fok0`k;dl8G`OV*}7#35t_Gf@=?FUu= zoazs${sq+^QT>ame_8e1k6Qat)gM#+6#A{+9qWMlx7XTRfu}N@YvGext(M`Z-NJ{Y zxM2(bBGp4`p43C6&XXD>^%kiVsXvh_kUB-`SyI0v<&ru|>LjTbNd1x2B&eOG)Ts5- z#Lmrw+pT=sDkh4lvL)_$a8vg^_xE;h>fR(ukS9h`*_`?kMXcg>G(tT_O{s6y`+(W_ z_b7oh9zA>?$MAhgYXz~j0rAXJA~qS1#apg#W?sGxF2gU?u4udlbw>UcjoUO{uki+r z@7Fk~@y|5gq48dgzis|#Jjy_nfhYq}2BHi^8Hh3vWgyBxlz}J%Q3j$6L>c(*GSIrd zZ4bS*CMB=JQ^Wh^aAv<8ok$ha;+MtvRFao$>XKXz;ocaR+J~w*&rlGX62-QVB~LH} zX_Cy)m;&S z^{;O^V8r6&mGZ5M_s?|bkY_!>fp5_r;`>AV6Cr+Eh~FOKQz1SV;>#iaV2D2w;*W;- z*FyXoA)f1BgT^E>QM`ZVJ?RZ-Jow_hF|*0L1RibSxQLMC+1CGSo4_sowfig8{x(#* ps@VpKU;lmq`=#p_ZDYCC6>3nTL2(9U85Cqtia`-x^HgDd{{t6j&};wz literal 0 HcmV?d00001 diff --git a/offloading_binaries/UDPSender/main.c b/offloading_binaries/UDPSender/main.c new file mode 100644 index 0000000..15ca5a0 --- /dev/null +++ b/offloading_binaries/UDPSender/main.c @@ -0,0 +1,125 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ +//#define _BSD_SOURCE +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +//#include +//#include +//#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 +//ca:e0:eb:61:b7:64 +#define MY_DEST_MAC0 0xca +#define MY_DEST_MAC1 0xe0 +#define MY_DEST_MAC2 0xeb +#define MY_DEST_MAC3 0x61 +#define MY_DEST_MAC4 0xb7 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1; + double elapsedTime; + double packetPerSlot; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); +// struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num=1000000000, offset = 0, port; + //int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + quota = atoi(argv[1]) / (1000000 / slotLength); + else + { + printf("Usage: UDPSender rate"); + exit(1); + } + for (i = 0; i < sendsize; i++) sendbuf[i] = '0'; + // fix packet size problem + packetPerSlot = ceil(((double)quota) / sendsize); + slotLength = (int)(packetPerSlot * sendsize / quota * slotLength); + quota = (int)packetPerSlot * sendsize; + //printf("TESThere1"); + sockfd=socket(AF_INET, SOCK_DGRAM, 0); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr=inet_addr("192.168.2.2"); + servaddr.sin_port=htons(4444); + //printf("testhere1"); + gettimeofday(&t_start, NULL); + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(sockfd, sendbuf, sendsize, 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); + if (ret < sendsize) + { + printf("send fail\n"); + usleep(100); + } + offset += ret; + sentInSlot = sentInSlot + ret; + } +//printf("here3"); + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } + + + //close(fd); + + return 0; +} diff --git a/offloading_binaries/UDPServer/Makefile b/offloading_binaries/UDPServer/Makefile new file mode 100644 index 0000000..aab23bd --- /dev/null +++ b/offloading_binaries/UDPServer/Makefile @@ -0,0 +1,20 @@ +CC = gcc +CFLAGS = -pie -fPIE +TARGET = UDPServer + +OBJS = $(patsubst %.c, %.o, $(wildcard *.c)) +HEADERS = $(wildcard *.h) + +all: $(TARGET) + +%.o: %.c $(HEADERS) + $(CC) $(CFLAGS) -c $< -o $@ + +.PRECIOUS: $(TARGET) $(OBJS) + +$(TARGET): $(OBJS) + $(CC) $(OBJS) -Wall $(CFLAGS) -o $@ + cp UDPServer ~/mobileRDMABeach/ +clean: + -rm -f *.o + -rm -f $(TARGET) diff --git a/offloading_binaries/UDPServer/UDPServer b/offloading_binaries/UDPServer/UDPServer new file mode 100755 index 0000000000000000000000000000000000000000..7b054bc80bdec3b550c7c43a9c6d287b9782688f GIT binary patch literal 13484 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1, defaulttimeperiod = 500000000; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: UDPServer port rate"); + exit(1); + } + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + if (argc > 3) + defaulttimeperiod = atoi(argv[3])*1000000; + + listenfd = socket(AF_INET, SOCK_DGRAM, 0); + +// printf("listen"); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); +// listen(listenfd, 1); +// printf("bind"); + for(;;) + { + clilen=sizeof(cliaddr); + printf("start receiving..\n"); + ret = recvfrom(listenfd,sendbuf,4096, 0, (struct sockaddr *)&cliaddr, &clilen); +// printf("msg: %s\n",sendbuf); + if (sendbuf[0] == '0') { + printf("Accepted.\n"); + gettimeofday(&t_start, NULL); + for (i = 0; i < BUF_SIZ; i++) sendbuf[i] = '0'; + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(listenfd, sendbuf, sendsize, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); + if (ret < sendsize) + { + printf("send fail\n"); + slot = 1; + sentInSlot = 0; + offset = 0; + goto RESTART; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime > defaulttimeperiod) { + slot = 1; + sentInSlot = 0; + offset = 0; + goto AUTOCLOSE; + } + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } +// sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + } + + + RESTART: + // close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + } + AUTOCLOSE: + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + close(fd); + + return 0; +} diff --git a/offloading_binaries/UDPServer/main.o b/offloading_binaries/UDPServer/main.o new file mode 100644 index 0000000000000000000000000000000000000000..17d23e6dcc40c7b2a18facf64be1c9c0111168d8 GIT binary patch literal 4320 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 literal 0 HcmV?d00001 diff --git a/offloading_binaries/UDPServer_mobile/main.c b/offloading_binaries/UDPServer_mobile/main.c new file mode 100644 index 0000000..47c4868 --- /dev/null +++ b/offloading_binaries/UDPServer_mobile/main.c @@ -0,0 +1,149 @@ +/* + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ETH_P_IP 0x0800 /* Internet Protocol packet */ +#define ETH_ALEN 6 /* from */ +#define ETH_P_ALL 0x0003 + +#define MY_DEST_MAC0 0xba +#define MY_DEST_MAC1 0xf6 +#define MY_DEST_MAC2 0xb1 +#define MY_DEST_MAC3 0x71 +#define MY_DEST_MAC4 0x09 +#define MY_DEST_MAC5 0x64 + +#define DEFAULT_IF "wlan0" +#define BUF_SIZ 8192 + +int main(int argc, char *argv[]) +{ + int slotLength = 10000; // in microseconds + int quota = 1000000000; // Bytes per slot, default 1GB/slot + int sentInSlot = 0, slot = 1, defaulttimeperiod = 500000000; + double elapsedTime; + + struct iovec iov; + int sockfd, listenfd; + struct ifreq if_idx; + struct ifreq if_mac; + int tx_len = 0; + char sendbuf[BUF_SIZ]; + struct ether_header *eh = (struct ether_header *) sendbuf; + struct iphdr *iph = (struct iphdr *) (sendbuf + sizeof(struct ether_header)); + struct sockaddr_ll socket_address; + char ifName[IFNAMSIZ]; + int i, j, ret, sendsize=1458, packet_num=1000000000, offset = 0, port; + int fd; /* file descriptor for file to send */ + struct sockaddr_in servaddr,cliaddr; + socklen_t clilen; + struct timeval t_start,t_end,t_now; + + signal(SIGPIPE, SIG_IGN); + + if (argc > 1) + port = atoi(argv[1]); + else + { + printf("Usage: UDPServer port rate"); + exit(1); + } + + if (argc > 2) + quota = atoi(argv[2]) / (1000000 / slotLength); + + if (argc > 3) + defaulttimeperiod = atoi(argv[3])*1000000; + + listenfd = socket(AF_INET, SOCK_DGRAM, 0); + +// printf("listen"); + bzero(&servaddr,sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(port); + bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); +// listen(listenfd, 1); +// printf("bind"); + for(;;) + { + clilen=sizeof(cliaddr); + printf("start receiving..\n"); + ret = recvfrom(listenfd,sendbuf,4096, 0, (struct sockaddr *)&cliaddr, &clilen); +// printf("msg: %s\n",sendbuf); + if (sendbuf[0] == '0') { + printf("Accepted.\n"); + gettimeofday(&t_start, NULL); + for (i = 0; i < BUF_SIZ; i++) sendbuf[i] = '0'; + while (offset < packet_num) + { + if ((packet_num - offset) < quota) + { + quota = packet_num - offset; + } + while (sentInSlot < quota) + { + ret = sendto(listenfd, sendbuf, sendsize, 0, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); + if (ret < sendsize) + { + printf("send fail\n"); + slot = 1; + sentInSlot = 0; + offset = 0; + goto RESTART; + } + offset += ret; + sentInSlot = sentInSlot + ret; + } + gettimeofday(&t_now, NULL); + elapsedTime = (t_now.tv_sec-t_start.tv_sec)*1000000.0+(t_now.tv_usec-t_start.tv_usec); + if (elapsedTime > defaulttimeperiod) { + slot = 1; + sentInSlot = 0; + offset = 0; + goto AUTOCLOSE; + } + //printf("sent %d, quota %d, packet_num %d, usleep %lf\n", offset, quota, packet_num, slotLength * slot - elapsedTime); + if (elapsedTime < slotLength * slot) + { + usleep((int)(slotLength * slot - elapsedTime)); + } + sentInSlot = 0; + slot++; + + } +// sockfd = accept(listenfd,(struct sockaddr *)&cliaddr, &clilen); + } + + + RESTART: + // close(sockfd); + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + } + AUTOCLOSE: + gettimeofday(&t_end, NULL); + printf("%lf\n", (t_end.tv_sec-t_start.tv_sec)*1000.0+(t_end.tv_usec-t_start.tv_usec)/1000.0); + close(fd); + + return 0; +} diff --git a/offloading_binaries/UDPServer_mobile/main.o b/offloading_binaries/UDPServer_mobile/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0bc320073ea5fa0433e83436618eae19bad14b24 GIT binary patch literal 4192 zcmb_fUuaWT82@f=+C>{R{+rcCcU`NCt_{~NYUV1WTBodabaoD55A`Ow?Sg3%lG~yp zII0gm=!9(#vI*v44#gdB0d#$@n$G*FzL&p!Dm18^00qA))b(j76*0NVoZQ1wD zSMB2)&)6Zo!9E5I0AXul5l{g(0xgUO#ds@lbaT~C5Vmv|pQ|4!M=;g}ohUE@>;SUO z7T_EzPAGxm#1;4~eekYZXe-n=F^A}PIp)Kd7q&?M#O9bd#u(z3^Q_~6&JyU<5#7GA z;f$^7C%f^}F&%CkM6%O1swr7!9cyCa8Q&S9Xs9_N(vA#L!QD%PCs^3(6Os})N< z@aJPy9p}7x;EM+_lUDVq3vnC~ISe3&>~jF~PJca+z0kI`#Ch8R8$0wSTWu|t7$-Z_ zvKoP(+Gv$W)pE0gH+Nu8A1!&-qE6bD@>Shq$DnsH(p|b3dB0TAjTTGIp<;zsbeZE( zB|^W}7h}@i_Z?eGPXD{G4>@N65uePLiaZ41|4m+h{q*{bwpD!#!ar$CLoP@^QOivW z?^STNkNlOCwa6jtah`e|d*QU+XX~iTH$=N#vRBXviySdE4o)#(CC9 z$4^6EM?9qcWb>GU8nZn2J+u2J?oUo$JO$kjt;ufTF)cA3U|rgUGf3xZ<2sKw*sCEM z{jte@THKr~XS{yo&lzto){2TX;P<%)uT76to>$i4^UKI*E|0Zapxev3h>gbvCM;~#@vxj|Nf-fcP`^s73ecuCLxo)+&80LB*BWyf$ z*t<1@JwBUt*auEKk5+Y;f+X%h*ScevtH{C^!v3fynmtpF639^q`DsKR_}tDEi`(V` z*!*95E+3_Twe>{p8sQ7?Ilh0nb{(SbaYt<;Gt}mRBbU!oo3GYAy*Bq8_GYS$v(`zM zy(iVpBkJD)S$S`Jk()ZyigWVUDd3wtef?O6jk?`wUyS^@>N82}QpK$TIPS$-WBpu>Rbx2p;vc#A=PrKM#lHsUSUJW8i0`6n z{s$NT*~Ncx@!wqhhKv8<;$;`VQ zvqLm!T2^Yv%nl@t1C{&1%F=KlZJIesq_YK+f=EYj9)6Ic;4-3C#wOI85tF@Qd@m!C zmlJqaj9+G4PIQxT1<_d#@Fk+Fj2e+2$1%7P_87r?7+)rO#Mn%v;dt`+QAUiPWt>lR zi4iaEhl2ZYp9U8~o)Pm=#zjPy;Kvyk6P*|Q661?RHyClCZ!)$(AIFc^>0*SPy^L7r zQ^7AVHe!87taq0Y`S4-yvtBDB^mZ^p?~vf97@>Eb5qj4dp*P033i-t)p~45BK)=9% zz@R`)AT*w-A=QM`*KQR)r!BA{8`4*4aE1RvrC5a#-SQKif+D{pSfAxsja_Aq@>JR$ zhb5yR^4<2r8FIVkWex-j=FqUI^ZkHjqy4tP$@*F>%0xN^~`FjTc z-oYGvt1ZQH^4?}$w#5ylti`~5DUxJxM>HwNC}ZHMLy+5xfd=&X_;4HnJe*^h6Le_| L0)A-(Tz3Bf!sLK5 literal 0 HcmV?d00001 diff --git a/offloading_binaries/old/parseSS.py b/offloading_binaries/old/parseSS.py new file mode 100755 index 0000000..90abf46 --- /dev/null +++ b/offloading_binaries/old/parseSS.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +import sys +# Yanzi + +wifiRSS = [] +gsmRSS = [] + +with open(sys.argv[1], 'rU') as f: # it must be sorted + for line in f: + tmp = line.split(" ") + time = int(tmp[0]) # ms + stuff = tmp[1:] + if "wifi" in stuff: + wifiRSS.append( (time, stuff) ) + elif "gsm" in stuff: + gsmRSS.append( (time, stuff) ) + +wifilen = len(wifiRSS) +gsmlen = len(gsmRSS) +print "WiFi has {0} records, GSM has {1} records".format(wifilen, gsmlen) + +for i in range(wifilen-1): + start = False + for j in range(wifiRSS[i][0], wifiRSS[i+1][0], 50): + if not start: + start = True + continue + wifiRSS.append((j, wifiRSS[i][1])) + +wifiRSS.sort(key=lambda tup: tup[0]) +# print wifiRSS + +for i in range(gsmlen-1): + start = False + for j in range(gsmRSS[i][0], gsmRSS[i+1][0], 50): + if not start: + start = True + continue + gsmRSS.append((j, gsmRSS[i][1])) + +gsmRSS.sort(key=lambda tup: tup[0]) +# print gsmRSS + + +