Background
My French ISP (Orange) uses DHCP messages with a CoS Priority of 6, otherwise they are not processed. So in order to avoid using the set top box provided by him, you can use an OpenWRT router which comes with UDHCP (part of Busybox).
Here is a small patch to support this.
$(busybox)/networking/udhcp/dhcpc.c
In function udhcp_raw_socket(int ifindex), line 1086:
+ /* Set Kernel Priority to 6 */
+ int val = 6;
+ setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val));
if (setsockopt_1(fd, SOL_PACKET, PACKET_AUXDATA) != 0) {
if (errno != ENOPROTOOPT)
log1s("can't set PACKET_AUXDATA on raw socket");
}
$(busybox)/networking/udhcp/packet.c
In function udhcp_send_raw_packet, line 123:
+ /* Set Kernel Priority to 6 */
+ int val = 6;
+ setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val));
+ bb_info_msg("Packet priority set to %s", "6");
memset(&dest_sll, 0, sizeof(dest_sll));
memset(&packet, 0, offsetof(struct ip_udp_dhcp_packet, data));
packet.data = *dhcp_pkt; /* struct copy */
In function udhcp_send_kernel_packet, line 213:
+ /* Set Kernel Priority to 6 */
+ int val = 6;
+ setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val));
/* If interface carrier goes down, unless we
* bind socket to a particular netdev, the packet
* can go out through another interface, eg. via
* default route despite being bound to a specific
* source IP. As such, bind to device hard and fail
* otherwise. Sending renewal packets on foreign
* interfaces makes no sense.
*/
if (ifname) {
Then simply rebuild the package:
make package/busybox/compile