Hi,
On Fri, 13 Jan 2023 at 10:48, Clément Péron <peron.c...@gmail.com> wrote: > > Some ISP, like the French ISP Orange uses DHCP messages with > a CoS Priority of 6 otherwise they are not processed. > > Add an option to allow setting this property. Please note, that I get this information from this blog post https://www.lafois.com/tag/udhcp/ I'm still testing this patch and I'm unsure if we need to set the priority for all the sockets. I recovered a patch from Ubiquiti GPL archive where only udhcp_send_raw_packet() set the priority and not udhcp_send_kernel_packet(). I'm not sure which one is correct. Thanks for your help, BR, Clement > > Signed-off-by: Clément Péron <peron.c...@gmail.com> > --- > networking/udhcp/Config.src | 8 ++++++++ > networking/udhcp/d6_dhcpc.c | 6 ++++++ > networking/udhcp/d6_packet.c | 14 ++++++++++++++ > networking/udhcp/dhcpc.c | 12 +++++++++++- > networking/udhcp/dhcpc.h | 2 ++ > networking/udhcp/packet.c | 16 ++++++++++++++++ > 6 files changed, 57 insertions(+), 1 deletion(-) > > diff --git a/networking/udhcp/Config.src b/networking/udhcp/Config.src > index 7ba7f48fc..49d5d7ef1 100644 > --- a/networking/udhcp/Config.src > +++ b/networking/udhcp/Config.src > @@ -137,6 +137,14 @@ config UDHCP_DEBUG > Bigger values result in bigger code. Levels above 1 > are very verbose and useful for debugging only. > > +config FEATURE_UDHCPC_COS > + bool "Enable '-y priority' option for udhcpc" > + default n > + depends on UDHCPC || UDHCPC6 > + help > + At the cost of ~300 bytes, enables -y priority option. > + This feature is typically not needed. > + > config UDHCPC_SLACK_FOR_BUGGY_SERVERS > int "DHCP options slack buffer size" > default 80 > diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c > index cdd06188e..675914432 100644 > --- a/networking/udhcp/d6_dhcpc.c > +++ b/networking/udhcp/d6_dhcpc.c > @@ -129,6 +129,7 @@ static const char udhcpc6_longopts[] ALIGN1 = > ) > /// IF_FEATURE_UDHCPC_ARPING("arping\0" No_argument "a") > IF_FEATURE_UDHCP_PORT("client-port\0" Required_argument "P") > + IF_FEATURE_UDHCPC_COS("cos\0" Required_argument "y") > ; > #endif > /* Must match getopt32 option string order */ > @@ -1153,6 +1154,9 @@ static void client_background(void) > ////usage: IF_FEATURE_UDHCPC_ARPING( > ////usage: "\n -a Use arping to validate offered > address" > ////usage: ) > +//usage: IF_FEATURE_UDHCPC_COS( > +//usage: "\n -y PRIORITY CoS value 0 .. 7, default 0" > +//usage: ) > //usage: "\n -l Send 'information request' instead of > 'solicit'" > //usage: "\n (used for servers which do not assign > IPv6 addresses)" > //usage: "\n -r IPv6 Request this address ('no' to not > request any IP)" > @@ -1214,6 +1218,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) > USE_FOR_MMU("b") > ///IF_FEATURE_UDHCPC_ARPING("a") > IF_FEATURE_UDHCP_PORT("P:") > + IF_FEATURE_UDHCPC_COS("y:+") > "v" > "\0" IF_UDHCP_VERBOSE("vv") /* -v is a counter */ > , udhcpc6_longopts > @@ -1223,6 +1228,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) > , &list_O > , &list_x > IF_FEATURE_UDHCP_PORT(, &str_P) > + IF_FEATURE_UDHCPC_COS(, &sk_prio) > IF_UDHCP_VERBOSE(, &dhcp_verbose) > ); > requested_ipv6 = NULL; > diff --git a/networking/udhcp/d6_packet.c b/networking/udhcp/d6_packet.c > index 142de9b43..425037ada 100644 > --- a/networking/udhcp/d6_packet.c > +++ b/networking/udhcp/d6_packet.c > @@ -68,6 +68,13 @@ int FAST_FUNC d6_send_raw_packet_from_client_data_ifindex( > goto ret_msg; > } > > + IF_FEATURE_UDHCPC_COS( > + if (sk_prio) { > + if (setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, sk_prio)) { > + log1s("raw: SO_PRIORITY setsockopt() failed"); > + } > + }) > + > memset(&dest_sll, 0, sizeof(dest_sll)); > memset(&packet, 0, offsetof(struct ip6_udp_d6_packet, data)); > packet.data = *d6_pkt; /* struct copy */ > @@ -153,6 +160,13 @@ int FAST_FUNC > d6_send_kernel_packet_from_client_data_ifindex( > } > setsockopt_reuseaddr(fd); > > + IF_FEATURE_UDHCPC_COS( > + if (sk_prio) { > + if (setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, sk_prio)) { > + log1s("raw: SO_PRIORITY setsockopt() failed"); > + } > + }) > + > memset(&sa, 0, sizeof(sa)); > sa.sin6_family = AF_INET6; > sa.sin6_port = htons(source_port); > diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c > index c757fb37c..7ff5ffde8 100644 > --- a/networking/udhcp/dhcpc.c > +++ b/networking/udhcp/dhcpc.c > @@ -1085,6 +1085,13 @@ static int udhcp_raw_socket(int ifindex) > } > #endif > > +IF_FEATURE_UDHCPC_COS( > + if (sk_prio) { > + if (setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, sk_prio)) { > + log1s("raw: SO_PRIORITY setsockopt() failed"); > + } > + }) > + > if (setsockopt_1(fd, SOL_PACKET, PACKET_AUXDATA) != 0) { > if (errno != ENOPROTOOPT) > log1s("can't set PACKET_AUXDATA on raw socket"); > @@ -1162,7 +1169,7 @@ static void client_background(void) > //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: " [-i IFACE]"IF_FEATURE_UDHCP_PORT(" [-P PORT]")" [-s > PROG] [-p PIDFILE]\n" > +//usage: " [-i IFACE]"IF_FEATURE_UDHCP_PORT(" [-P PORT]")" > "IF_FEATURE_UDHCPC_COS(" [-y PRIORITY]")" [-s PROG] [-p PIDFILE]\n" > //usage: " [-oC] [-r IP] [-V VENDOR] [-F NAME] [-x OPT:VAL]... > [-O OPT]..." > //usage:#define udhcpc_full_usage "\n" > //usage: "\n -i IFACE Interface to use (default > "CONFIG_UDHCPC_DEFAULT_INTERFACE")" > @@ -1186,6 +1193,9 @@ static void client_background(void) > //usage: IF_FEATURE_UDHCPC_ARPING( > //usage: "\n -a[MSEC] Validate offered address with ARP > ping" > //usage: ) > +//usage: IF_FEATURE_UDHCPC_COS( > +//usage: "\n -y PRIORITY CoS value 0 .. 7, default 0" > +//usage: ) > //usage: "\n -r IP Request this IP address" > //usage: "\n -o Don't request any options (unless -O > is given)" > //usage: "\n -O OPT Request option OPT from server > (cumulative)" > diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h > index 19b054b32..c033eb13f 100644 > --- a/networking/udhcp/dhcpc.h > +++ b/networking/udhcp/dhcpc.h > @@ -7,6 +7,8 @@ > > PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN > > +IF_FEATURE_UDHCPC_COS(extern int sk_prio;) > + > struct client_data_t { > uint8_t client_mac[6]; /* Our mac address */ > IF_FEATURE_UDHCP_PORT(uint16_t port;) > diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c > index 529978189..0babf451f 100644 > --- a/networking/udhcp/packet.c > +++ b/networking/udhcp/packet.c > @@ -12,6 +12,8 @@ > #include <netinet/if_ether.h> > #include <netpacket/packet.h> > > +IF_FEATURE_UDHCPC_COS(int sk_prio;) > + > #if ENABLE_UDHCPC || ENABLE_UDHCPD > void FAST_FUNC udhcp_init_header(struct dhcp_packet *packet, char type) > { > @@ -121,6 +123,13 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet > *dhcp_pkt, > goto ret_msg; > } > > + IF_FEATURE_UDHCPC_COS( > + if (sk_prio) { > + if (setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, sk_prio)) { > + log1s("raw: SO_PRIORITY setsockopt() failed"); > + } > + }) > + > memset(&dest_sll, 0, sizeof(dest_sll)); > memset(&packet, 0, offsetof(struct ip_udp_dhcp_packet, data)); > packet.data = *dhcp_pkt; /* struct copy */ > @@ -207,6 +216,13 @@ int FAST_FUNC udhcp_send_kernel_packet(struct > dhcp_packet *dhcp_pkt, > } > setsockopt_reuseaddr(fd); > > + IF_FEATURE_UDHCPC_COS( > + if (sk_prio) { > + if (setsockopt_int(fd, SOL_SOCKET, SO_PRIORITY, sk_prio)) { > + log1s("raw: SO_PRIORITY setsockopt() failed"); > + } > + }) > + > /* If interface carrier goes down, unless we > * bind socket to a particular netdev, the packet > * can go out through another interface, eg. via > -- > 2.34.1 > _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox