aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/d6_common.h3
-rw-r--r--networking/udhcp/d6_dhcpc.c13
-rw-r--r--networking/udhcp/d6_packet.c4
3 files changed, 13 insertions, 7 deletions
diff --git a/networking/udhcp/d6_common.h b/networking/udhcp/d6_common.h
index 335a0927a..fcec8c15a 100644
--- a/networking/udhcp/d6_common.h
+++ b/networking/udhcp/d6_common.h
@@ -121,7 +121,8 @@ int FAST_FUNC d6_send_raw_packet(
121int FAST_FUNC d6_send_kernel_packet( 121int FAST_FUNC d6_send_kernel_packet(
122 struct d6_packet *d6_pkt, unsigned d6_pkt_size, 122 struct d6_packet *d6_pkt, unsigned d6_pkt_size,
123 struct in6_addr *src_ipv6, int source_port, 123 struct in6_addr *src_ipv6, int source_port,
124 struct in6_addr *dst_ipv6, int dest_port 124 struct in6_addr *dst_ipv6, int dest_port,
125 int ifindex
125); 126);
126 127
127#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2 128#if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index a0cdded11..95de74f9b 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -623,7 +623,8 @@ static NOINLINE int send_d6_renew(uint32_t xid, struct in6_addr *server_ipv6, st
623 return d6_send_kernel_packet( 623 return d6_send_kernel_packet(
624 &packet, (opt_ptr - (uint8_t*) &packet), 624 &packet, (opt_ptr - (uint8_t*) &packet),
625 our_cur_ipv6, CLIENT_PORT6, 625 our_cur_ipv6, CLIENT_PORT6,
626 server_ipv6, SERVER_PORT6 626 server_ipv6, SERVER_PORT6,
627 client_config.ifindex
627 ); 628 );
628 return d6_mcast_from_client_config_ifindex(&packet, opt_ptr); 629 return d6_mcast_from_client_config_ifindex(&packet, opt_ptr);
629} 630}
@@ -645,15 +646,14 @@ static int send_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cu
645 return d6_send_kernel_packet( 646 return d6_send_kernel_packet(
646 &packet, (opt_ptr - (uint8_t*) &packet), 647 &packet, (opt_ptr - (uint8_t*) &packet),
647 our_cur_ipv6, CLIENT_PORT6, 648 our_cur_ipv6, CLIENT_PORT6,
648 server_ipv6, SERVER_PORT6 649 server_ipv6, SERVER_PORT6,
650 client_config.ifindex
649 ); 651 );
650} 652}
651 653
652/* Returns -1 on errors that are fatal for the socket, -2 for those that aren't */ 654/* Returns -1 on errors that are fatal for the socket, -2 for those that aren't */
653/* NOINLINE: limit stack usage in caller */ 655/* NOINLINE: limit stack usage in caller */
654static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6 656static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6, struct d6_packet *d6_pkt, int fd)
655 UNUSED_PARAM
656 , struct d6_packet *d6_pkt, int fd)
657{ 657{
658 int bytes; 658 int bytes;
659 struct ip6_udp_d6_packet packet; 659 struct ip6_udp_d6_packet packet;
@@ -702,6 +702,9 @@ static NOINLINE int d6_recv_raw_packet(struct in6_addr *peer_ipv6
702// return -2; 702// return -2;
703// } 703// }
704 704
705 if (peer_ipv6)
706 *peer_ipv6 = packet.ip6.ip6_src; /* struct copy */
707
705 log1("received %s", "a packet"); 708 log1("received %s", "a packet");
706 d6_dump_packet(&packet.data); 709 d6_dump_packet(&packet.data);
707 710
diff --git a/networking/udhcp/d6_packet.c b/networking/udhcp/d6_packet.c
index e166f520d..79a0ac8a8 100644
--- a/networking/udhcp/d6_packet.c
+++ b/networking/udhcp/d6_packet.c
@@ -127,7 +127,8 @@ int FAST_FUNC d6_send_raw_packet(
127int FAST_FUNC d6_send_kernel_packet( 127int FAST_FUNC d6_send_kernel_packet(
128 struct d6_packet *d6_pkt, unsigned d6_pkt_size, 128 struct d6_packet *d6_pkt, unsigned d6_pkt_size,
129 struct in6_addr *src_ipv6, int source_port, 129 struct in6_addr *src_ipv6, int source_port,
130 struct in6_addr *dst_ipv6, int dest_port) 130 struct in6_addr *dst_ipv6, int dest_port,
131 int ifindex)
131{ 132{
132 struct sockaddr_in6 sa; 133 struct sockaddr_in6 sa;
133 int fd; 134 int fd;
@@ -154,6 +155,7 @@ int FAST_FUNC d6_send_kernel_packet(
154 sa.sin6_family = AF_INET6; 155 sa.sin6_family = AF_INET6;
155 sa.sin6_port = htons(dest_port); 156 sa.sin6_port = htons(dest_port);
156 sa.sin6_addr = *dst_ipv6; /* struct copy */ 157 sa.sin6_addr = *dst_ipv6; /* struct copy */
158 sa.sin6_scope_id = ifindex;
157 if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) { 159 if (connect(fd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {
158 msg = "connect"; 160 msg = "connect";
159 goto ret_close; 161 goto ret_close;