--- relay/dhcrelay.c-orig Sat Apr 27 05:34:20 2002 +++ relay/dhcrelay.c Wed Feb 19 12:44:19 2003 @@ -88,6 +88,7 @@ did not match any known circuit ID. */ int missing_circuit_id = 0; /* Circuit ID option in matching RAI option was missing. */ +int max_hop_count = 4; /* Maximum hop count */ /* Maximum size of a packet with agent options added. */ int dhcp_max_agent_option_packet_length = 576; @@ -182,6 +183,15 @@ quiet_interface_discovery = 1; } else if (!strcmp (argv [i], "-a")) { add_agent_options = 1; + } else if (!strcmp (argv [i], "-c")) { + int hcount; + if (++i == argc) + usage (); + hcount = atoi(argv[i]); + if (hcount <= 16) + max_hop_count = hcount; + else + usage (); } else if (!strcmp (argv [i], "-A")) { if (++i == argc) usage (); @@ -425,6 +435,17 @@ packet -> giaddr = ip -> primary_address; if (packet -> hops != 255) packet -> hops = packet -> hops + 1; + + /* ftp://ftp.rfc-editor.org/in-notes/rfc1542.txt + * 4.1.1 BOOTREQUEST Messages + * The relay agent MUST silently discard BOOTREQUEST messages whose + * 'hops' field exceeds the value 16. A configuration option SHOULD be + * provided to set this threshold to a smaller value if desired by the + * network manager. The default setting for a configurable threshold + * SHOULD be 4. + */ + if (packet -> hops >= max_hop_count) + return; /* Otherwise, it's a BOOTREQUEST, so forward it to all the servers. */ @@ -470,7 +470,7 @@ static void usage () { log_fatal ("Usage: dhcrelay [-p ] [-d] [-D] [-i %s%s%s", - "interface]\n ", + "interface] [-c max_hop_count]\n ", "[-q] [-a] [-A length] [-m append|replace|forward|discard]\n", " [server1 [... serverN]]"); }