summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaditya Dhruv <[email protected]>2025-07-31 22:18:27 -0500
committerAaditya Dhruv <[email protected]>2025-07-31 22:18:27 -0500
commitb385a2eda3a12b1b578aef4d0ef9037da3d947e4 (patch)
tree9d537c19c8b24c2a56f38a9be0120537605c8c57
parent4c595bf45e87269d541b30b8012512cba15521f7 (diff)
Parse arp_packet struct and return to caller in eth_recv
-rw-r--r--include/junk/network.h8
-rw-r--r--src/network.c82
2 files changed, 47 insertions, 43 deletions
diff --git a/include/junk/network.h b/include/junk/network.h
index 12a3af0..c88e7f7 100644
--- a/include/junk/network.h
+++ b/include/junk/network.h
@@ -9,10 +9,6 @@ int ipv4_bind(char* ip, char* port, char* data);
//Layer 2, Ethernet
-int eth_bind(char address[]);
-int eth_send(int sockfd, char* data);
-int eth_recv(int sockfd);
-
typedef struct ethhdr ethhdr;
typedef struct arp_packet {
@@ -26,3 +22,7 @@ typedef struct arp_packet {
unsigned char target_hardware_address[6];
unsigned char target_protocol_address[4];
} arp_packet;
+
+int eth_bind(char address[]);
+int eth_send(int sockfd, char* data);
+int eth_recv(int sockfd, arp_packet* packet);
diff --git a/src/network.c b/src/network.c
index 0e32677..58fe663 100644
--- a/src/network.c
+++ b/src/network.c
@@ -1,22 +1,21 @@
#include "junk/network.h"
-#include <stddef.h>
-#include <sys/socket.h>
-#include <linux/if_packet.h>
+#include <arpa/inet.h>
+#include <errno.h>
#include <linux/if_ether.h>
+#include <linux/if_packet.h>
#include <net/ethernet.h> /* the L2 protocols */
-#include <unistd.h>
-#include <errno.h>
+#include <netdb.h>
#include <netinet/in.h>
+#include <stddef.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
-#include <arpa/inet.h>
-#include <netdb.h>
+#include <unistd.h>
#define TAG "network"
-int tcp_ipv4_send(char* ip, char* port, char* data) {
+int tcp_ipv4_send(char *ip, char *port, char *data) {
int sock;
struct addrinfo hints, *p, *res;
@@ -26,11 +25,13 @@ int tcp_ipv4_send(char* ip, char* port, char* data) {
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(ip, port, &hints, &res) != 0) {
- fprintf(stderr, "%s: getaddrinfo (%d): %s\n", TAG, errno, gai_strerror(errno));
+ fprintf(stderr, "%s: getaddrinfo (%d): %s\n", TAG, errno,
+ gai_strerror(errno));
return errno;
}
- if ((sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1) {
+ if ((sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) ==
+ -1) {
fprintf(stderr, "%s: socket (%d): %s\n", TAG, errno, strerror(errno));
return errno;
}
@@ -59,7 +60,6 @@ int tcp_ipv4_send(char* ip, char* port, char* data) {
return 0;
}
-
/* eth_bind
* Bind to a L2 Ethernet address.
*
@@ -80,20 +80,18 @@ int eth_bind(char address[]) {
addrinfo.sll_protocol = htons(ETH_P_ARP);
addrinfo.sll_ifindex = 0;
addrinfo.sll_pkttype = PACKET_BROADCAST;
- sscanf((char*)address, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
- &addrinfo.sll_addr[0],
- &addrinfo.sll_addr[1],
- &addrinfo.sll_addr[2],
- &addrinfo.sll_addr[3],
- &addrinfo.sll_addr[4],
- &addrinfo.sll_addr[5]
- );
+ sscanf((char *)address, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
+ &addrinfo.sll_addr[0], &addrinfo.sll_addr[1], &addrinfo.sll_addr[2],
+ &addrinfo.sll_addr[3], &addrinfo.sll_addr[4], &addrinfo.sll_addr[5]);
addrinfo.sll_halen = 6;
- fprintf(stderr, "%s: target mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG, addrinfo.sll_addr[0], addrinfo.sll_addr[1], addrinfo.sll_addr[2], addrinfo.sll_addr[3], addrinfo.sll_addr[4], addrinfo.sll_addr[5]);
+ fprintf(stderr, "%s: target mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG,
+ addrinfo.sll_addr[0], addrinfo.sll_addr[1], addrinfo.sll_addr[2],
+ addrinfo.sll_addr[3], addrinfo.sll_addr[4], addrinfo.sll_addr[5]);
int status = 0;
- if ((status = bind(sock, (struct sockaddr*) &addrinfo, sizeof(addrinfo))) != 0) {
+ if ((status = bind(sock, (struct sockaddr *)&addrinfo, sizeof(addrinfo))) !=
+ 0) {
fprintf(stderr, "%s: bind (%d): %s\n", TAG, errno, strerror(errno));
return status;
}
@@ -105,7 +103,7 @@ int eth_bind(char address[]) {
* Recv on a L2 Ethernet address.
*
*/
-int eth_recv(int sockfd) {
+int eth_recv(int sockfd, arp_packet *packet) {
int buffer_len = 200;
char buffer[buffer_len];
memset(buffer, 0, buffer_len);
@@ -113,24 +111,30 @@ int eth_recv(int sockfd) {
int total_bytes_read = 0;
while (1) {
- bytes_read = recv(sockfd, &buffer[total_bytes_read], buffer_len - total_bytes_read, 0);
- if (bytes_read == -1) {
+ bytes_read = recv(sockfd, &buffer[total_bytes_read],
+ buffer_len - total_bytes_read, 0);
+ if (bytes_read == -1) {
fprintf(stderr, "%s: recv (%d): %s\n", TAG, errno, strerror(errno));
return -1;
- }
- else if (bytes_read > 0) {
- fprintf(stderr, "%s: recv: read %d bytes, total %d\n", TAG, bytes_read, total_bytes_read);
- total_bytes_read += bytes_read;
- }
- else {
- fprintf(stderr, "\nCharacters:\n");
- ethhdr* recv_struct = (ethhdr*) buffer;
- fprintf(stderr, "%s: source mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG, recv_struct->h_source[0], recv_struct->h_source[1], recv_struct->h_source[2], recv_struct->h_source[3], recv_struct->h_source[4], recv_struct->h_source[5]);
- fprintf(stderr, "%s: dest mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG, recv_struct->h_dest[0], recv_struct->h_dest[1], recv_struct->h_dest[2], recv_struct->h_dest[3], recv_struct->h_dest[4], recv_struct->h_dest[5]);
-
- arp_packet* packet = (arp_packet*) (buffer + sizeof (ethhdr));
-
- return 0;
- }
+ } else if (bytes_read > 0) {
+ fprintf(stderr, "%s: recv: read %d bytes, total %d\n", TAG, bytes_read,
+ total_bytes_read);
+ total_bytes_read += bytes_read;
+ } else {
+
+ ethhdr *recv_struct = (ethhdr *)buffer;
+ fprintf(stderr, "%s: source mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG,
+ recv_struct->h_source[0], recv_struct->h_source[1],
+ recv_struct->h_source[2], recv_struct->h_source[3],
+ recv_struct->h_source[4], recv_struct->h_source[5]);
+ fprintf(stderr, "%s: dest mac (%02x:%02x:%02x:%02x:%02x:%02x)\n", TAG,
+ recv_struct->h_dest[0], recv_struct->h_dest[1],
+ recv_struct->h_dest[2], recv_struct->h_dest[3],
+ recv_struct->h_dest[4], recv_struct->h_dest[5]);
+
+ memcpy((char *)packet, (char *)(buffer + sizeof(ethhdr)),
+ sizeof(arp_packet));
+ return 0;
+ }
}
}