Auteur Sujet: PATCH UDHCPC(6) publié sur la liste de diffusion BusyBox  (Lu 209 fois)

0 Membres et 1 Invité sur ce sujet

basilix

  • Abonné Orange Fibre
  • *
  • Messages: 261
Est-ce qu'on pourrait vérifier si ces correctifs pour udhcp(6) sont fiables ?

J'aurais bien aimé les ajouter dans mon image personnalisée OpenWrt.

Mais hélas ! Je ne suis pas suffisamment compétent pour vérifier moi-même ces modifications.

Source : https://www.mail-archive.com/busybox@busybox.net/msg29197.html

diff --git a/networking/udhcp/Config.src b/networking/udhcp/Config.src
index 7ba7f48fc..731cf12fa 100644
--- a/networking/udhcp/Config.src
+++ b/networking/udhcp/Config.src
@@ -176,3 +176,13 @@ config FEATURE_UDHCP_8021Q
  help
  If selected, both client and server will support passing of VLAN
  ID and priority via options 132 and 133 as per 802.1Q.
+
+config FEATURE_UDHCPC_SK_PRIO
+ bool "Enable '-K' option for udhcpc"
+ default y
+ depends on UDHCPC || UDHCPC6
+ help
+ If selected, enables -K option to set the kernel priority of DHCP
+ packets. Useful together with some egress QoS mapping to send
+ requests with a specific VLAN priority tag, as required by some
+ ISPs.
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index 49a0b593d..30ee68375 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -359,12 +359,14 @@ int udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd) FAST_FUNC;
 int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
  uint32_t source_nip, int source_port,
  uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
- int ifindex) FAST_FUNC;
+ int ifindex
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio)) FAST_FUNC;
 
 int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
  uint32_t source_nip, int source_port,
  uint32_t dest_nip, int dest_port,
- const char *ifname) FAST_FUNC;
+ const char *ifname
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio)) FAST_FUNC;
 
 void udhcp_sp_setup(void) FAST_FUNC;
 void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC;
diff --git a/networking/udhcp/d6_common.h b/networking/udhcp/d6_common.h
index 3cbfbb89e..05a5dc2b4 100644
--- a/networking/udhcp/d6_common.h
+++ b/networking/udhcp/d6_common.h
@@ -180,12 +180,14 @@ int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex(
  struct d6_packet *d6_pkt, unsigned d6_pkt_size,
  struct in6_addr *src_ipv6, int source_port,
  struct in6_addr *dst_ipv6, int dest_port, const uint8_t *dest_arp
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio)
 );
 
 int FAST_FUNC d6_send_kernel_packet_from_client_data_ifindex(
  struct d6_packet *d6_pkt, unsigned d6_pkt_size,
  struct in6_addr *src_ipv6, int source_port,
  struct in6_addr *dst_ipv6, int dest_port
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio)
 );
 
 #if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 2
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index cdd06188e..173aa2914 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -127,6 +127,7 @@ static const char udhcpc6_longopts[] ALIGN1 =
  USE_FOR_MMU(
  "background\0"     No_argument       "b"
  )
+ IF_FEATURE_UDHCPC_SK_PRIO("sk-priority\0" Required_argument "K")
 /// IF_FEATURE_UDHCPC_ARPING("arping\0" No_argument       "a")
  IF_FEATURE_UDHCP_PORT("client-port\0" Required_argument "P")
  ;
@@ -152,12 +153,14 @@ enum {
  OPT_d = 1 << 16,
 /* The rest has variable bit positions, need to be clever */
  OPTBIT_d = 16,
- USE_FOR_MMU(             OPTBIT_b,)
- ///IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,)
- IF_FEATURE_UDHCP_PORT(   OPTBIT_P,)
- USE_FOR_MMU(             OPT_b = 1 << OPTBIT_b,)
- ///IF_FEATURE_UDHCPC_ARPING(OPT_a = 1 << OPTBIT_a,)
- IF_FEATURE_UDHCP_PORT(   OPT_P = 1 << OPTBIT_P,)
+ USE_FOR_MMU(              OPTBIT_b,)
+ IF_FEATURE_UDHCPC_SK_PRIO(OPTBIT_K,)
+ ///IF_FEATURE_UDHCPC_ARPING( OPTBIT_a,)
+ IF_FEATURE_UDHCP_PORT(    OPTBIT_P,)
+ USE_FOR_MMU(              OPT_b = 1 << OPTBIT_b,)
+ IF_FEATURE_UDHCPC_SK_PRIO(OPT_K = 1 << OPTBIT_K,)
+ ///IF_FEATURE_UDHCPC_ARPING( OPT_a = 1 << OPTBIT_a,)
+ IF_FEATURE_UDHCP_PORT(    OPT_P = 1 << OPTBIT_P,)
 };
 
 #if ENABLE_FEATURE_UDHCPC6_RFC4704
@@ -561,6 +564,7 @@ static int d6_mcast_from_client_data_ifindex(struct d6_packet *packet, uint8_t *
  packet, (end - (uint8_t*) packet),
  /*src*/ &client6_data.ll_ip6, CLIENT_PORT6,
  /*dst*/ (struct in6_addr*)FF02__1_2, SERVER_PORT6, MAC_DHCP6MCAST_ADDR
+ IF_FEATURE_UDHCPC_SK_PRIO(, client_data.sk_prio)
  );
 }
 
@@ -866,6 +870,7 @@ static NOINLINE int send_d6_renew(struct in6_addr *server_ipv6, struct in6_addr
  &packet, (opt_ptr - (uint8_t*) &packet),
  our_cur_ipv6, CLIENT_PORT6,
  server_ipv6, SERVER_PORT6
+ IF_FEATURE_UDHCPC_SK_PRIO(, client_data.sk_prio)
  );
  return d6_mcast_from_client_data_ifindex(&packet, opt_ptr);
 }
@@ -899,6 +904,7 @@ int send_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cur_ipv6)
  &packet, (opt_ptr - (uint8_t*) &packet),
  our_cur_ipv6, CLIENT_PORT6,
  server_ipv6, SERVER_PORT6
+ IF_FEATURE_UDHCPC_SK_PRIO(, client_data.sk_prio)
  );
 }
 
@@ -1129,7 +1135,7 @@ static void client_background(void)
 //usage:# define IF_UDHCP_VERBOSE(...)
 //usage:#endif
 //usage:#define udhcpc6_trivial_usage
-//usage:       "[-fbq"IF_UDHCP_VERBOSE("v")"R] [-t N] [-T SEC] [-A SEC|-n] [-i IFACE] [-s PROG]\n"
+//usage:       "[-fbq"IF_UDHCP_VERBOSE("v")"R]"IF_FEATURE_UDHCPC_SK_PRIO(" [-K PRIO]")" [-t N] [-T SEC] [-A SEC|-n] [-i IFACE] [-s PROG]\n"
 //usage:       " [-p PIDFILE]"IF_FEATURE_UDHCP_PORT(" [-P PORT]")" [-ldo] [-r IPv6] [-x OPT:VAL]... [-O OPT]..."
 //usage:#define udhcpc6_full_usage "\n"
 //usage:     "\n -i IFACE Interface to use (default "CONFIG_UDHCPC_DEFAULT_INTERFACE")"
@@ -1150,6 +1156,9 @@ static void client_background(void)
 //usage: IF_FEATURE_UDHCP_PORT(
 //usage:     "\n -P PORT Use PORT (default 546)"
 //usage: )
+//usage: IF_FEATURE_UDHCPC_SK_PRIO(
+//usage:     "\n -K PRIO Set kernel packet priority (default 0)"
+//usage: )
 ////usage: IF_FEATURE_UDHCPC_ARPING(
 ////usage:     "\n -a Use arping to validate offered address"
 ////usage: )
@@ -1199,6 +1208,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
  /* Default options */
  IF_FEATURE_UDHCP_PORT(SERVER_PORT6 = 547;)
  IF_FEATURE_UDHCP_PORT(CLIENT_PORT6 = 546;)
+ IF_FEATURE_UDHCPC_SK_PRIO(client_data.sk_prio = 0;)
  client_data.interface = CONFIG_UDHCPC_DEFAULT_INTERFACE;
  client_data.script = CONFIG_UDHCPC6_DEFAULT_SCRIPT;
  client_data.sockfd = -1;
@@ -1212,6 +1222,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
  /* O,x: list; -T,-t,-A take numeric param */
  "i:np:qRr:s:T:+t:+SA:+O:*ox:*fld"
  USE_FOR_MMU("b")
+ IF_FEATURE_UDHCPC_SK_PRIO("K:+")
  ///IF_FEATURE_UDHCPC_ARPING("a")
  IF_FEATURE_UDHCP_PORT("P:")
  "v"
@@ -1222,6 +1233,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
  , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */
  , &list_O
  , &list_x
+ IF_FEATURE_UDHCPC_SK_PRIO(, &client_data.sk_prio)
  IF_FEATURE_UDHCP_PORT(, &str_P)
  IF_UDHCP_VERBOSE(, &dhcp_verbose)
  );
diff --git a/networking/udhcp/d6_packet.c b/networking/udhcp/d6_packet.c
index 142de9b43..501497154 100644
--- a/networking/udhcp/d6_packet.c
+++ b/networking/udhcp/d6_packet.c
@@ -54,7 +54,8 @@ int FAST_FUNC d6_recv_kernel_packet(struct in6_addr *peer_ipv6 UNUSED_PARAM,
 int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex(
  struct d6_packet *d6_pkt, unsigned d6_pkt_size,
  struct in6_addr *src_ipv6, int source_port,
- struct in6_addr *dst_ipv6, int dest_port, const uint8_t *dest_arp)
+ struct in6_addr *dst_ipv6, int dest_port, const uint8_t *dest_arp
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio))
 {
  struct sockaddr_ll dest_sll;
  struct ip6_udp_d6_packet packet;
@@ -68,6 +69,13 @@ int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex(
  goto ret_msg;
  }
 
+#if ENABLE_FEATURE_UDHCPC_SK_PRIO
+ if (setsockopt_SOL_SOCKET_int(fd, SO_PRIORITY, sk_prio) < 0) {
+ msg = "setsockopt(%s)";
+ goto ret_close;
+ }
+#endif
+
  memset(&dest_sll, 0, sizeof(dest_sll));
  memset(&packet, 0, offsetof(struct ip6_udp_d6_packet, data));
  packet.data = *d6_pkt; /* struct copy */
@@ -139,7 +147,8 @@ int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex(
 int FAST_FUNC d6_send_kernel_packet_from_client_data_ifindex(
  struct d6_packet *d6_pkt, unsigned d6_pkt_size,
  struct in6_addr *src_ipv6, int source_port,
- struct in6_addr *dst_ipv6, int dest_port)
+ struct in6_addr *dst_ipv6, int dest_port
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio))
 {
  struct sockaddr_in6 sa;
  int fd;
@@ -151,6 +160,14 @@ int FAST_FUNC d6_send_kernel_packet_from_client_data_ifindex(
  msg = "socket(%s)";
  goto ret_msg;
  }
+
+#if ENABLE_FEATURE_UDHCPC_SK_PRIO
+ if (setsockopt_SOL_SOCKET_int(fd, SO_PRIORITY, sk_prio) < 0) {
+ msg = "setsockopt(%s)";
+ goto ret_close;
+ }
+#endif
+
  setsockopt_reuseaddr(fd);
 
  memset(&sa, 0, sizeof(sa));
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index c757fb37c..8108f6856 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -75,6 +75,7 @@ static const char udhcpc_longopts[] ALIGN1 =
  "background\0"     No_argument       "b"
  )
  "broadcast\0"      No_argument       "B"
+ IF_FEATURE_UDHCPC_SK_PRIO("sk-priority\0" Required_argument "K")
  IF_FEATURE_UDHCPC_ARPING("arping\0" Optional_argument "a")
  IF_FEATURE_UDHCP_PORT("client-port\0" Required_argument "P")
  ;
@@ -102,12 +103,14 @@ enum {
  OPT_B = 1 << 18,
 /* The rest has variable bit positions, need to be clever */
  OPTBIT_B = 18,
- USE_FOR_MMU(             OPTBIT_b,)
- IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,)
- IF_FEATURE_UDHCP_PORT(   OPTBIT_P,)
- USE_FOR_MMU(             OPT_b = 1 << OPTBIT_b,)
- IF_FEATURE_UDHCPC_ARPING(OPT_a = 1 << OPTBIT_a,)
- IF_FEATURE_UDHCP_PORT(   OPT_P = 1 << OPTBIT_P,)
+ USE_FOR_MMU(              OPTBIT_b,)
+ IF_FEATURE_UDHCPC_SK_PRIO(OPTBIT_K,)
+ IF_FEATURE_UDHCPC_ARPING( OPTBIT_a,)
+ IF_FEATURE_UDHCP_PORT(    OPTBIT_P,)
+ USE_FOR_MMU(              OPT_b = 1 << OPTBIT_b,)
+ IF_FEATURE_UDHCPC_SK_PRIO(OPT_K = 1 << OPTBIT_K,)
+ IF_FEATURE_UDHCPC_ARPING( OPT_a = 1 << OPTBIT_a,)
+ IF_FEATURE_UDHCP_PORT(    OPT_P = 1 << OPTBIT_P,)
 };
 
 
@@ -704,7 +707,8 @@ static int raw_bcast_from_client_data_ifindex(struct dhcp_packet *packet, uint32
  return udhcp_send_raw_packet(packet,
  /*src*/ src_nip, CLIENT_PORT,
  /*dst*/ INADDR_BROADCAST, SERVER_PORT, MAC_BCAST_ADDR,
- client_data.ifindex);
+ client_data.ifindex
+ IF_FEATURE_UDHCPC_SK_PRIO(, client_data.sk_prio));
 }
 
 static int bcast_or_ucast(struct dhcp_packet *packet, uint32_t ciaddr, uint32_t server)
@@ -713,7 +717,8 @@ static int bcast_or_ucast(struct dhcp_packet *packet, uint32_t ciaddr, uint32_t
  return udhcp_send_kernel_packet(packet,
  ciaddr, CLIENT_PORT,
  server, SERVER_PORT,
- client_data.interface);
+ client_data.interface
+ IF_FEATURE_UDHCPC_SK_PRIO(, client_data.sk_prio));
  return raw_bcast_from_client_data_ifindex(packet, ciaddr);
 }
 
@@ -1161,7 +1166,7 @@ static void client_background(void)
 //usage:# define IF_UDHCP_VERBOSE(...)
 //usage:#endif
 //usage:#define udhcpc_trivial_usage
-//usage:       "[-fbq"IF_UDHCP_VERBOSE("v")"RB]"IF_FEATURE_UDHCPC_ARPING(" [-a[MSEC]]")" [-t N] [-T SEC] [-A SEC|-n]\n"
+//usage:       "[-fbq"IF_UDHCP_VERBOSE("v")"RB]"IF_FEATURE_UDHCPC_SK_PRIO(" [-K PRIO]")IF_FEATURE_UDHCPC_ARPING(" [-a[MSEC]]")" [-t N] [-T SEC] [-A SEC|-n]\n"
 //usage:       " [-i IFACE]"IF_FEATURE_UDHCP_PORT(" [-P PORT]")" [-s PROG] [-p PIDFILE]\n"
 //usage:       " [-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... [-O OPT]..."
 //usage:#define udhcpc_full_usage "\n"
@@ -1183,6 +1188,9 @@ static void client_background(void)
 //usage:     "\n -R Release IP on exit"
 //usage:     "\n -f Run in foreground"
 //usage:     "\n -S Log to syslog too"
+//usage: IF_FEATURE_UDHCPC_SK_PRIO(
+//usage:     "\n -K PRIO Set kernel packet priority (default 0)"
+//usage: )
 //usage: IF_FEATURE_UDHCPC_ARPING(
 //usage:     "\n -a[MSEC] Validate offered address with ARP ping"
 //usage: )
@@ -1232,6 +1240,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
  /* Default options */
  IF_FEATURE_UDHCP_PORT(SERVER_PORT = 67;)
  IF_FEATURE_UDHCP_PORT(CLIENT_PORT = 68;)
+ IF_FEATURE_UDHCPC_SK_PRIO(client_data.sk_prio = 0;)
  client_data.interface = CONFIG_UDHCPC_DEFAULT_INTERFACE;
  client_data.script = CONFIG_UDHCPC_DEFAULT_SCRIPT;
  client_data.sockfd = -1;
@@ -1246,6 +1255,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
  /* O,x: list; -T,-t,-A take numeric param */
  "CV:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB"
  USE_FOR_MMU("b")
+ IF_FEATURE_UDHCPC_SK_PRIO("K:+")
  IF_FEATURE_UDHCPC_ARPING("a::")
  IF_FEATURE_UDHCP_PORT("P:")
  "v"
@@ -1258,6 +1268,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
  , &discover_timeout, &discover_retries, &tryagain_timeout /* T,t,A */
  , &list_O
  , &list_x
+ IF_FEATURE_UDHCPC_SK_PRIO(, &client_data.sk_prio)
  IF_FEATURE_UDHCPC_ARPING(, &str_a)
  IF_FEATURE_UDHCP_PORT(, &str_P)
  IF_UDHCP_VERBOSE(, &dhcp_verbose)
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h
index 19b054b32..733491953 100644
--- a/networking/udhcp/dhcpc.h
+++ b/networking/udhcp/dhcpc.h
@@ -9,6 +9,7 @@ PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
 
 struct client_data_t {
  uint8_t client_mac[6];          /* Our mac address */
+ IF_FEATURE_UDHCPC_SK_PRIO(int sk_prio;)
  IF_FEATURE_UDHCP_PORT(uint16_t port;)
  int ifindex;                    /* Index number of the interface to use */
  uint32_t xid;
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c
index 66750e2e6..814b791b0 100644
--- a/networking/udhcp/dhcpd.c
+++ b/networking/udhcp/dhcpd.c
@@ -603,7 +603,8 @@ static void send_packet_to_client(struct dhcp_packet *dhcp_pkt, int force_broadc
  udhcp_send_raw_packet(dhcp_pkt,
  /*src*/ server_data.server_nip, SERVER_PORT,
  /*dst*/ ciaddr, CLIENT_PORT, chaddr,
- server_data.ifindex);
+ server_data.ifindex
+ IF_FEATURE_UDHCPC_SK_PRIO(, 0));
 }
 
 /* Send a packet to gateway_nip using the kernel ip stack */
@@ -618,7 +619,8 @@ static void send_packet_to_relay(struct dhcp_packet *dhcp_pkt)
  * even those which are clients' requests and would normally
  * (i.e. without relay) use CLIENT_PORT. See RFC 1542.
  */
- server_data.interface);
+ server_data.interface
+ IF_FEATURE_UDHCPC_SK_PRIO(, 0));
 }
 
 static void send_packet(struct dhcp_packet *dhcp_pkt, int force_broadcast)
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c
index 529978189..9cd2beafe 100644
--- a/networking/udhcp/packet.c
+++ b/networking/udhcp/packet.c
@@ -106,7 +106,8 @@ int FAST_FUNC udhcp_recv_kernel_packet(struct dhcp_packet *packet, int fd)
 int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
  uint32_t source_nip, int source_port,
  uint32_t dest_nip, int dest_port, const uint8_t *dest_arp,
- int ifindex)
+ int ifindex
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio))
 {
  struct sockaddr_ll dest_sll;
  struct ip_udp_dhcp_packet packet;
@@ -121,6 +122,13 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
  goto ret_msg;
  }
 
+#if ENABLE_FEATURE_UDHCPC_SK_PRIO
+ if (setsockopt_SOL_SOCKET_int(fd, SO_PRIORITY, sk_prio) < 0) {
+ msg = "setsockopt(%s)";
+ goto ret_close;
+ }
+#endif
+
  memset(&dest_sll, 0, sizeof(dest_sll));
  memset(&packet, 0, offsetof(struct ip_udp_dhcp_packet, data));
  packet.data = *dhcp_pkt; /* struct copy */
@@ -192,7 +200,8 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt,
 int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
  uint32_t source_nip, int source_port,
  uint32_t dest_nip, int dest_port,
- const char *ifname)
+ const char *ifname
+ IF_FEATURE_UDHCPC_SK_PRIO(, int sk_prio))
 {
  struct sockaddr_in sa;
  unsigned padding;
@@ -205,6 +214,14 @@ int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt,
  msg = "socket(%s)";
  goto ret_msg;
  }
+
+#if ENABLE_FEATURE_UDHCPC_SK_PRIO
+ if (setsockopt_SOL_SOCKET_int(fd, SO_PRIORITY, sk_prio) < 0) {
+ msg = "setsockopt(%s)";
+ goto ret_close;
+ }
+#endif
+
  setsockopt_reuseaddr(fd);
 
  /* If interface carrier goes down, unless we