From 906538be6c98f28dea70d3a8170c2af122636093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arturo=20Iv=C3=A1n=20Artaza?= Date: Sat, 21 Jun 2025 21:31:24 -0300 Subject: [PATCH 1/3] feat(server): first steps for dhcp server implemented --- .idea/DHCP-implementation.iml | 8 ---- .idea/misc.xml | 18 ++++++++ .idea/modules.xml | 8 ---- bin/dhcp_client | Bin 15928 -> 16840 bytes include/dhcp_server.h | 9 ++++ include/net_utils.h | 2 + main.c | 8 ---- src/dhcp_server.c | 84 +++++++++++++++++++++++++++++++++- src/main.c | 6 +-- src/net_utils.c | 13 +++++- 10 files changed, 126 insertions(+), 30 deletions(-) delete mode 100644 .idea/DHCP-implementation.iml create mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml create mode 100644 include/dhcp_server.h delete mode 100644 main.c diff --git a/.idea/DHCP-implementation.iml b/.idea/DHCP-implementation.iml deleted file mode 100644 index bc2cd87..0000000 --- a/.idea/DHCP-implementation.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..53624c9 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 70baabb..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/bin/dhcp_client b/bin/dhcp_client index fd554e8423b06bf0450405bf858ba8c177c0260b..ead876b3a716c9b2af40950b4816beabbd57a704 100755 GIT binary patch literal 16840 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 TZ-i8|=+D;~jnyH85Uc(Pis-R@ delta 2196 zcmZ`)Z%kWN6hH5^kN#PK*Rrl4f7*vKU_x6!u>2`4B2XlbEN%-iA_8-+W*H^+h} z^hoHE{3ma5Pl3QgGpju6sd~d86@C(ZvN5mWDE!!z`GMciL+6v2 z#X9aN;xV?x3qrOkFUJ~r+@KH+b{ZDr($OmW!Hq{omzhDwrn-eBsf zxD80h7SFhE=02f($aE@36N$9)xzA|`X`W!gud8@J@6{6HBiuD&Aj_{Ahb8yowjKr|Zu% ziCOSgMwp=fE(I%OTu*`eq1>IH*XyuYSLP~jv-RwkOT>Y!b7x+#P>Iv^UT26OR|$(i zErrYVUMY<~)CaU9Z0*$a`X~I6AD&%j0cKG12V6;hiWbfW6`c3)Z2*2zDOnRtBR)&3 z)#oW5{4YK?;k0!~>ZGw(u|~-Ooxwg#%4Qr2?j0zA$^Y)1)IRDm6u^ZXzKQc0chgP~^~u$6f&>;%q)YJZyd)^1#I!cdnq9Ew!W4(1l;n0j!qD_ zUIbt}mtYqpv9>W{d7WlH@ZdzFyGI2NsL`yQE*vDiOD+U)E<*bn@ys4_?Blqv(R1=0 z(mG`i=!p|9gr^x#e&91mo^x2xqZLDO)ZoQ9M!buX5amhLE0UCp+&*`;7Y+Ltpq7`B zUWnvyg%s?=W}gvSeE2HkX`#7+R@pX`pGaHDUM_o@1(tWvo>!Kdhb70zn}>NPvIxs4@88nn>VM>!p?6wlPUQ z2Y993?-X?{a0WNq15Qzp0v%Y}5paq!78t~MN5CHB#Z9%o)UgL0;ST9j><@eKa@be0 zL|dliXRl3=Co_njg{!qMbF?DW0@HZMRD>O!4sAKdQj~}krr&qEvS-Z|X z_&-Rt6h%qaF)Li_RGlFonNkzDfM2wEOKuZWKwUi2;%!giXr#L2E@{~L3az+7X{Oa4 zl7>ALLYuuF{EstR#fGkceS^Ib)E-Otc2|r2mu6$?plMshzb0N* AYXATM diff --git a/include/dhcp_server.h b/include/dhcp_server.h new file mode 100644 index 0000000..8f01fa7 --- /dev/null +++ b/include/dhcp_server.h @@ -0,0 +1,9 @@ +#ifndef DHCP_SERVER_H +#define DHCP_SERVER_H + +#include +#include + +int run_server(void); + +#endif diff --git a/include/net_utils.h b/include/net_utils.h index 5be205a..7bab25d 100644 --- a/include/net_utils.h +++ b/include/net_utils.h @@ -57,4 +57,6 @@ enum DHCP_MESSAGE { DHCP_INFORM = 8, }; +int get_dhcp_type(DHCPPacket *packet); + #endif diff --git a/main.c b/main.c deleted file mode 100644 index 69de246..0000000 --- a/main.c +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - - -int main(void) { - printf("Hello World!\n"); - return 0; -} \ No newline at end of file diff --git a/src/dhcp_server.c b/src/dhcp_server.c index 96367c4..45e07b1 100644 --- a/src/dhcp_server.c +++ b/src/dhcp_server.c @@ -1,2 +1,82 @@ -//DHCP server w/ include dchp_packet.h and net_utils.h -#include "net_utils.h" \ No newline at end of file +// DHCP server w/ include dchp_packet.h and net_utils.h +#include "net_utils.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +uint8_t buffer[1024]; + +struct sockaddr_in client_addr; +struct sockaddr_in server_addr; + +socklen_t client_addr_len = sizeof(client_addr); + +int init_server() { + int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); + if (socket_fd < 0) { + perror("DHCP server socket failed"); + return -1; + } + printf("DHCP server socket created successfully (fd: %d)\n", socket_fd); + + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(67); + server_addr.sin_addr.s_addr = htonl(INADDR_ANY); + + int broadcast = 1; + + setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &broadcast, + sizeof(broadcast)); + + int result = + bind(socket_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)); + + if (result < 0) { + perror("bind failed"); + return -1; + } + + printf("DHCP server bound to port 67 successfully\n"); + return socket_fd; +} + +int receive_packet(int socket_fd) { + ssize_t len = recvfrom(socket_fd, buffer, sizeof(buffer), 0, + (struct sockaddr *)&client_addr, &client_addr_len); + if (len < 0) { + perror("elpepe receive error message"); + return -1; + } + return len; +} + +int run_server() { + + printf("Initializing DHCP server... - RUN SERVER FUNCTION\n"); + int fd = init_server(); + while (1) { + int len = receive_packet(fd); + if (len == -1) { + continue; + } + + DHCPPacket *packet = (DHCPPacket *)buffer; + + if (packet->op != 1) { + continue; + } + + int packet_type = get_dhcp_type(packet); + printf("Packet type: %d\n", packet_type); + } + + close(fd); + return 0; +} diff --git a/src/main.c b/src/main.c index f5983ea..3cb3288 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,7 @@ - #include +#include "dhcp_server.h" int main(void){ - - return 0; + printf("Starting DHCP server...\n"); + return run_server(); } \ No newline at end of file diff --git a/src/net_utils.c b/src/net_utils.c index 56448bd..60d18ec 100644 --- a/src/net_utils.c +++ b/src/net_utils.c @@ -1,4 +1,15 @@ // Funciones de utilidades de red #include "net_utils.h" +#include +#include -const uint8_t MAGIC_COOKIE[4] = {99, 130, 83, 99}; \ No newline at end of file +const uint8_t MAGIC_COOKIE[4] = {99, 130, 83, 99}; + +int get_dhcp_type(DHCPPacket *packet) { + for (size_t i = 0; i < sizeof(packet->options); i++) { + if (packet->options[i] == 53) { + return packet->options[i + 2]; // Value is two bytes to the right. + } + } + return -1; +} From a7306abb9745bc9dfc13ca3cbb7ff111f4ea5625 Mon Sep 17 00:00:00 2001 From: luischumbita Date: Fri, 18 Jul 2025 17:29:58 -0300 Subject: [PATCH 2/3] feat(dhcp): implement DHCP packet creation and client functionality --- bin/client | Bin 21624 -> 21624 bytes src/dhcp_server.c | 4 ++++ 2 files changed, 4 insertions(+) diff --git a/bin/client b/bin/client index ada9df92ee00be061f722bf49a3f7b6752ddb279..1f96fdafdae801a86ba1897b3193395a55fd14cb 100755 GIT binary patch delta 1141 zcmY*ZZERCz6n@`3%hm;(gN>Zf)2r)l+Z?&OA4eg5$-LPEH1e81}X!BsttH9wBd zT`uTK8Iy-5=b$MA(_e}rEk8dHeSc|0Slm^D6#Hr&F zwH@JfNV|1*vz8l6KbA!t&gGPjY)D#deBeP6EP1z!auZ=Xl(^Q2lqK+i)xw{ILsm!4 z69tSV;s=SKR)3iCt@g|z_Mg;}yayz3y;taKN=35Puo~0*mB2IjA8}Y-5{kd}=o#~^LJ$o8v z%H8}ksI_etk~d+GZIZ8mScO=&X`Xi5KF@bNBq`p%B&C#WvBTktWsW!gUNB(Fm!tZV zMUs-U<|1{BC%adX^lBYURap5xSX6nyT1FKKZ>oQLip4Cn+)-ox{m;$9sY-GETN%VN z-YaBs$G3_%HR4E+S7Z6ruM-zf#zd-mWudBX7LjCRaE8cXq?lTrPyCjFhwWBDHw*jC zCf)=A`$oPTPS`6g-;}_)9%NvlfJB0cSz4dLB}C12E@ z7GBc4W1D>LcK7-h#0?R#OBT2Fgd$?NGaL*DwuavfL`8Y4*cA!BDtC(^?N*NVhC`94 z*eZG2YQ%Oq`dYX%&>4!<6tk!0pd9X%Lt<0&w#y(p}) z!Q@&W{|f3njfPw+YOCQ=!N3O8nCCfx{{Y{4*YOiz@i{HW?8H-iqfMnaPQS9Htdza1 t27Ip@er?c3zf=F;AH|@*vA9L^iK4}&p7(z${0qMjxflQd delta 998 zcmYjQYeh`*ObVHa6bI zZs?d^RixxlNntL1b9!pmtgU7)rW|pnwttbL^7m}ZmF2bd9?*OTha?+k>=l=M|*~AI3RKfn})k$<#Uc#Fi8qDrJtdM z*;(yNlcZ>*1q!IQMkp{1jEQhTvV#PEXo~LwA83j^5z(=;Z33b%grT1{S@N?Jkhk?j zy1~m*R~4!lzE0;X#q1*WT1wb?nzR@f6s6AU5H$|F;rMiQlJiraE+p4;SZSrz%YIY6 zb-ipDqe1Iuc7Xb9j-2)h+^TMZ9bFQLsUv}yArMR7OOv*F&fcG#cc3cii$5tfbn61K zWF<}{h;$!Vgi!Y~T9IpJA8B3gW%E`zqH4UME-r;lsPJ}ns&d;;QtXa3j}n|eREN-} zwNGMd{GKz4F7>4DylPY&8Fs+6bIKJ5g)lUt5?>wYGXJtTMJyeqI=fk3J4zSk8(AaW zwAZrzG}Do5%10<1XJK zDefF9a^Fx}UUA-nnhORwj{`lxcfgh*&KrSEZ#bU-u6)nA70uc6f%9@;9Jn61f0*;b zWb^n;1~>{4DOF_{1QcL;FvltEak3y?_83ip*PQPYEuI=ypvV%XrylzT^E=L6LRB*j zCuHC3>1l;*R)$UzQQ~e3afgk-zq-6m$kKdJUom$;Z~fm7&Vi`|m!MFI5wBFzwwGMV z5N#lRMJX%OycH*>;ZgN@tJx7!DhK3m7W!Q2$7@;YD^-%m!8L{>vSdXn)55+QnMLTS zTFrKm$?r04vqQ&tEHYzsB1@KJkc`@9|DhQyhh7F<`m(%~SVl@nB&rR$^#A_M)1lHC PBUAtDh+BIWYL)*0#-4=~ diff --git a/src/dhcp_server.c b/src/dhcp_server.c index 9280bfd..33718a7 100644 --- a/src/dhcp_server.c +++ b/src/dhcp_server.c @@ -62,6 +62,10 @@ int run_server() { printf("Initializing DHCP server...\n"); int fd = init_server(); + if (fd < 0) { + fprintf(stderr, "[FATAL] No se pudo inicializar el socket del servidor DHCP. Terminando.\n"); + return EXIT_FAILURE; + } while (1) { int len = receive_packet(fd); if (len == -1) { From 9ecb5cbbc70ab66c6b7bef0fad20c324f1063dd9 Mon Sep 17 00:00:00 2001 From: luischumbita Date: Fri, 18 Jul 2025 18:19:04 -0300 Subject: [PATCH 3/3] refactor(makefile): separate client and server build targets; update DHCP packet creation and client logic --- bin/client | Bin 21624 -> 21376 bytes bin/server | Bin 0 -> 17232 bytes include/net_utils.h | 3 +- makefile | 22 +++++---- src/dhcp_client.c | 114 +++++++++++++++++++++++++++++++++++++++++--- src/main.c | 49 ++++++++++++++----- src/net_utils.c | 25 ++++++++-- 7 files changed, 177 insertions(+), 36 deletions(-) create mode 100755 bin/server diff --git a/bin/client b/bin/client index 1f96fdafdae801a86ba1897b3193395a55fd14cb..2ccdb509c5bb27eb280f96fbd03a5c02370c24ba 100755 GIT binary patch delta 4674 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 diff --git a/bin/server b/bin/server new file mode 100755 index 0000000000000000000000000000000000000000..a7f659bd3dc99f5b1c588669387d6f4bdfaf7776 GIT binary patch literal 17232 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 literal 0 HcmV?d00001 diff --git a/include/net_utils.h b/include/net_utils.h index 879f208..dced45d 100644 --- a/include/net_utils.h +++ b/include/net_utils.h @@ -57,7 +57,6 @@ int get_dhcp_type(DHCPPacket *packet); // Corregido el nombre a "get_mac_address" y la firma int get_mac_address(const char *if_name, uint8_t *mac_buffer); // Corregida la firma para aceptar un puntero a la MAC -DHCPPacket create_dhcp_packet(uint8_t *mac_addr, enum DHCP_OP op, - enum DHCP_MESSAGE tipo_msg, size_t *packet_size); +DHCPPacket create_dhcp_packet(uint32_t xid, uint8_t *mac_addr, enum DHCP_MESSAGE tipo_msg, uint32_t *requested_ip, uint32_t *server_id, size_t *packet_size); #endif diff --git a/makefile b/makefile index b1a8a78..8a5a9ca 100644 --- a/makefile +++ b/makefile @@ -2,18 +2,22 @@ CC = gcc CFLAGS = -Wall -Wextra -Iinclude SRC_DIR = src BIN_DIR = bin -SRC = $(wildcard $(SRC_DIR)/*.c) -OBJ = $(SRC:.c=.o) -BIN = $(BIN_DIR)/client +CLIENT_SRC = $(SRC_DIR)/main.c $(SRC_DIR)/dhcp_client.c $(SRC_DIR)/net_utils.c +SERVER_SRC = $(SRC_DIR)/main.c $(SRC_DIR)/dhcp_server.c $(SRC_DIR)/net_utils.c +CLIENT_BIN = $(BIN_DIR)/client +SERVER_BIN = $(BIN_DIR)/server -.PHONY: all clean +.PHONY: all clean client server -$(BIN): $(OBJ) +all: client server + +client: $(CLIENT_SRC) @mkdir -p $(BIN_DIR) - $(CC) $(CFLAGS) $^ -o $@ + $(CC) $(CFLAGS) -DCLIENT_MAIN $(CLIENT_SRC) -o $(CLIENT_BIN) -%.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ +server: $(SERVER_SRC) + @mkdir -p $(BIN_DIR) + $(CC) $(CFLAGS) -DSERVER_MAIN $(SERVER_SRC) -o $(SERVER_BIN) clean: - rm -f $(OBJ) $(BIN) \ No newline at end of file + rm -f $(BIN_DIR)/client $(BIN_DIR)/server \ No newline at end of file diff --git a/src/dhcp_client.c b/src/dhcp_client.c index 80b1f0b..4d83290 100644 --- a/src/dhcp_client.c +++ b/src/dhcp_client.c @@ -20,7 +20,7 @@ int start_client(const char *if_name) { srand(time(0)); uint8_t mac_addr[6]; - const char *interface_name = "enp7s0"; + const char *interface_name = "wlo1"; if (get_mac_address(interface_name, mac_addr) != 0) { fprintf(stderr, "No se pudo obtener la dirección MAC de la interfaz %s\n", interface_name); @@ -31,8 +31,13 @@ int start_client(const char *if_name) { mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); + //Generar el xid una SOLA VEZ + uint32_t xid = htonl((uint32_t)rand()); //Rand genera el numero y htonl lo convierte a big-endian + size_t packet_size; - DHCPPacket dhcp_packet = create_dhcp_packet(mac_addr, BOOTREQUEST, DHCP_DISCOVER, &packet_size); + + //NULL La ip solicitada y el server_id, porque no los tenemos xd + DHCPPacket dhcp_packet = create_dhcp_packet(xid, mac_addr, DHCP_DISCOVER, NULL,NULL, &packet_size); int socket_fd; struct sockaddr_in server_addr; @@ -105,20 +110,115 @@ int start_client(const char *if_name) { printf("Paquete recibido (%ld bytes)\n", recibido); DHCPPacket *respuesta = (DHCPPacket *)buffer; - if (respuesta->op != BOOTREPLY) { - printf("Respuesta no válida: op = %d\n", respuesta->op); + if(respuesta->op != BOOTREPLY || respuesta->xid != xid) { + printf("Respuesta no válida o xid no coincide\n"); close(socket_fd); return EXIT_FAILURE; } printf("IP ofrecida: %s\n", inet_ntoa(*(struct in_addr *)&respuesta->yiaddr)); + // PARTE DEL REQUEST DEL CLIENTE AL SERVIDOR + + //1. Definir una funcion get server id que reciba la respuesta del servidor y extraiga el server_id + + uint32_t get_server_id(DHCPPacket *pkt) { + uint8_t *options = pkt->options; + uint8_t *ptr = options + 4; // Saltar el magic cookie + uint8_t *end = options + DHCP_OPTIONS_SIZE; + while (ptr < end && *ptr != 255) { + uint8_t opt_code = *ptr++; + if (opt_code == 0) { + continue; + } + uint8_t opt_len = *ptr++; + if (opt_code == 54) { + uint32_t server_id; + memcpy(&server_id, ptr, sizeof(server_id)); + return server_id; + } + ptr += opt_len; + } + return 0; + } + + enum DHCP_MESSAGE get_dhcp_message_type(DHCPPacket *pkt) { + uint8_t *options = pkt->options; + uint8_t *ptr = options + 4; // Saltar el magic cookie + uint8_t *end = options + DHCP_OPTIONS_SIZE; + while (ptr < end && *ptr != 255) { + uint8_t opt_code = *ptr++; + if (opt_code == 0) { + continue; + } + uint8_t opt_len = *ptr++; + if (opt_code == 53) { + return (enum DHCP_MESSAGE)*ptr; + } + ptr += opt_len; + } + return 0; + } + + uint32_t server_id = get_server_id(respuesta); + + if (server_id == 0) { + printf("No se encontró el Server Identifier en la respuesta\n"); + close(socket_fd); + return EXIT_FAILURE; + } + + size_t request_packet_size; + DHCPPacket dhcp_request = create_dhcp_packet(xid, mac_addr, DHCP_REQUEST, &respuesta->yiaddr, &server_id, &request_packet_size); + + if (sendto(socket_fd, &dhcp_request, request_packet_size, 0, + (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { + perror("Error al enviar el paquete DHCP REQUEST"); + close(socket_fd); + return EXIT_FAILURE; + } + + printf("Paquete dhcp REQUEST enviado (%ld bytes)\n", request_packet_size); + + printf("Pedimos la IP %s al servidor con ID %s\n", + inet_ntoa(*(struct in_addr *)&respuesta->yiaddr), + inet_ntoa(*(struct in_addr *)&server_id)); - // PARTE DEL REQUEST DEL CLIENTE AL SERVIDOR + printf("Esperando respuesta DHCP ACK o NAK...\n"); + + memset(buffer, 0, sizeof(buffer)); - // Supongo que primero hay que crear el fuquin paquete: + recibido = recvfrom(socket_fd, buffer, sizeof(buffer), 0, NULL, NULL); + + if (recibido < 0) { + perror("Error al recibir paquete DHCP ACK o NAK"); + close(socket_fd); + return EXIT_FAILURE; + } - // DHCPPacket dhcp_request = create_dhcp_packet(); + printf("Paquete recibido (%ld bytes)\n", recibido); + + DHCPPacket *respuesta_final = (DHCPPacket *)buffer; + + if(respuesta_final->xid != xid) { + printf("Respuesta no válida o xid no coincide\n"); + close(socket_fd); + return EXIT_FAILURE; + } + + enum DHCP_MESSAGE msg_type = get_dhcp_message_type(respuesta_final); + + switch (msg_type) { + case DHCP_ACK: + printf("Mensaje tipo DHCP_ACK recibido\n"); + break; + case DHCP_NAK: + printf("Mensaje tipo DHCP_NAK recibido\n"); + break; + default: + printf("Mensaje tipo desconocido recibido: %d\n", msg_type); + break; + } close(socket_fd); return 0; diff --git a/src/main.c b/src/main.c index ed2a6d8..91a32c2 100644 --- a/src/main.c +++ b/src/main.c @@ -2,19 +2,42 @@ #include "dhcp_server.h" #include #include +#include int main(int argc, char *argv[]) { - - run_server(); - if(argc < 2) { - fprintf(stderr, "Uso: %s \n", argv[0]); - return 1; - } - - if (start_client(argv[1]) != 0) { - fprintf(stderr, "Error al iniciar el cliente DHCP.\n"); - return 1; - } - - return EXIT_SUCCESS; +#ifdef CLIENT_MAIN + if (argc < 2) { + fprintf(stderr, "Uso: %s \n", argv[0]); + return 1; + } + if (start_client(argv[1]) != 0) { + fprintf(stderr, "Error al iniciar el cliente DHCP.\n"); + return 1; + } + return EXIT_SUCCESS; +#elif defined(SERVER_MAIN) + return run_server(); +#else + if (argc < 2) { + fprintf(stderr, "Uso: %s [nombre_de_interfaz]\n", argv[0]); + return 1; + } + if (strcmp(argv[1], "server") == 0) { + return run_server(); + } else if (strcmp(argv[1], "client") == 0) { + if (argc < 3) { + fprintf(stderr, "Uso: %s client \n", argv[0]); + return 1; + } + if (start_client(argv[2]) != 0) { + fprintf(stderr, "Error al iniciar el cliente DHCP.\n"); + return 1; + } + return EXIT_SUCCESS; + } else { + fprintf(stderr, "Opción desconocida: %s\n", argv[1]); + fprintf(stderr, "Uso: %s [nombre_de_interfaz]\n", argv[0]); + return 1; + } +#endif } diff --git a/src/net_utils.c b/src/net_utils.c index 84bc8bf..4adce7e 100644 --- a/src/net_utils.c +++ b/src/net_utils.c @@ -47,15 +47,14 @@ int get_mac_address(const char *if_name, uint8_t *mac_buffer) { return 0; // Éxito } -DHCPPacket create_dhcp_packet(uint8_t *mac_addr, enum DHCP_OP op, - enum DHCP_MESSAGE tipo_msg, size_t *packet_size) { +DHCPPacket create_dhcp_packet(uint32_t xid, uint8_t *mac_addr, enum DHCP_MESSAGE tipo_msg, uint32_t *requested_ip, uint32_t *server_id, size_t *packet_size) { DHCPPacket pkt; memset(&pkt, 0, sizeof(DHCPPacket)); - pkt.op = op; + pkt.op = (tipo_msg == DHCP_DISCOVER) ? BOOTREQUEST : BOOTREQUEST; pkt.htype = Ethernet; pkt.hlen = 6; - pkt.xid = htonl((uint32_t)rand()); + pkt.xid = xid; pkt.flags = htons(0x8000); // Copia la MAC (array de bytes) al campo chaddr del paquete @@ -72,10 +71,26 @@ DHCPPacket create_dhcp_packet(uint8_t *mac_addr, enum DHCP_OP op, *opt_ptr++ = 1; *opt_ptr++ = tipo_msg; + // Si es REQUEST y hay IP solicitada, agregar opción 50 + if (tipo_msg == DHCP_REQUEST && requested_ip != NULL) { + *opt_ptr++ = 50; // Option 50: Requested IP Address + *opt_ptr++ = 4; + memcpy(opt_ptr, requested_ip, 4); + opt_ptr += 4; + } + + // Si es REQUEST y hay server_id, agregar opción 54 + if (tipo_msg == DHCP_REQUEST && server_id != NULL) { + *opt_ptr++ = 54; // Option 54: Server Identifier + *opt_ptr++ = 4; + memcpy(opt_ptr, server_id, 4); + opt_ptr += 4; + } + // Opción 255: End *opt_ptr++ = 255; - *packet_size = (size_t)(opt_ptr - (uint8_t *)&pkt); + *packet_size = sizeof(DHCPPacket); // Se envía el struct completo return pkt; }