version 1.1.1.2, 2021/03/17 00:56:46
|
version 1.1.1.3, 2023/09/27 11:02:07
|
Line 318 void usage(const char* arg, FILE* stream)
|
Line 318 void usage(const char* arg, FILE* stream)
|
fprintf (stream, "Usage: %s %s\n", arg, usage_string); |
fprintf (stream, "Usage: %s %s\n", arg, usage_string); |
} |
} |
|
|
|
static void fail_fatal(const char *errstr, int exitcode) |
|
{ |
|
perror(errstr); |
|
exit(exitcode); |
|
} |
|
|
int send_release_packet(const char* iface, struct dhcp6_packet* packet) |
int send_release_packet(const char* iface, struct dhcp6_packet* packet) |
{ |
{ |
struct sockaddr_in6 server_addr, client_addr; |
struct sockaddr_in6 server_addr, client_addr; |
Line 343 int send_release_packet(const char* iface, struct dhcp
|
Line 349 int send_release_packet(const char* iface, struct dhcp
|
client_addr.sin6_port = htons(DHCP6_CLIENT_PORT); |
client_addr.sin6_port = htons(DHCP6_CLIENT_PORT); |
client_addr.sin6_flowinfo = 0; |
client_addr.sin6_flowinfo = 0; |
client_addr.sin6_scope_id =0; |
client_addr.sin6_scope_id =0; |
inet_pton(AF_INET6, "::", &client_addr.sin6_addr); | if (inet_pton(AF_INET6, "::", &client_addr.sin6_addr) <= 0) |
bind(sock, (struct sockaddr*)&client_addr, sizeof(struct sockaddr_in6)); | fail_fatal("inet_pton", 5); |
inet_pton(AF_INET6, DHCP6_MULTICAST_ADDRESS, &server_addr.sin6_addr); | if (bind(sock, (struct sockaddr*)&client_addr, sizeof(struct sockaddr_in6)) != 0) |
| perror("bind"); /* continue on bind error */ |
| if (inet_pton(AF_INET6, DHCP6_MULTICAST_ADDRESS, &server_addr.sin6_addr) <= 0) |
| fail_fatal("inet_pton", 5); |
server_addr.sin6_port = htons(DHCP6_SERVER_PORT); |
server_addr.sin6_port = htons(DHCP6_SERVER_PORT); |
int16_t recv_size = 0; | ssize_t recv_size = 0; |
| int result; |
for (i = 0; i < 5; i++) |
for (i = 0; i < 5; i++) |
{ |
{ |
if (sendto(sock, packet->buf, packet->len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) |
if (sendto(sock, packet->buf, packet->len, 0, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) |
{ | fail_fatal("sendto failed", 4); |
perror("sendto failed"); | |
exit(4); | |
} | |
|
|
recv_size = recvfrom(sock, response, sizeof(response), MSG_DONTWAIT, NULL, 0); |
recv_size = recvfrom(sock, response, sizeof(response), MSG_DONTWAIT, NULL, 0); |
if (recv_size == -1) |
if (recv_size == -1) |
Line 367 int send_release_packet(const char* iface, struct dhcp
|
Line 374 int send_release_packet(const char* iface, struct dhcp
|
else |
else |
{ |
{ |
perror("recvfrom"); |
perror("recvfrom"); |
|
result = UNSPEC_FAIL; |
} |
} |
} |
} |
| else |
int16_t result = parse_packet(response, recv_size); | |
if (result == NOT_REPLY_CODE) | |
{ |
{ |
sleep(1); | result = parse_packet(response, recv_size); |
continue; | if (result == NOT_REPLY_CODE) |
| { |
| sleep(1); |
| continue; |
| } |
} |
} |
|
|
close(sock); |
close(sock); |
return result; |
return result; |
} |
} |