[Dnsmasq-discuss] Enable dnsmasq to return addresses of multiple tftp servers in cycle

Sushil Agrawal sushil_agrawal at hotmail.com
Sun Jun 19 23:00:46 BST 2011



Sure. I'll send the man page updates.

Regarding the overloading of the server name parameter:
    are you saying that we should have a version of the dhcp-boot option like:

dhcp-boot=/var/ftpd/pxelinux.0,boothost,boothost

and take the second 'boothost' (3rd parameter)  to indicate that
it be resolved and a resultant address returned as a tftp
server address ?

cheers
Sushil.


> Subject: Re: [Dnsmasq-discuss] Enable dnsmasq to return addresses of multiple	tftp servers in cycle
> From: simon at thekelleys.org.uk
> Date: Sat, 18 Jun 2011 22:44:25 +0100
> To: sushil_agrawal at hotmail.com; dnsmasq-discuss at lists.thekelleys.org.uk
> 
> Sushil Agrawal <sushil_agrawal at hotmail.com> wrote:
> 
> >
> >
> >Hi All,
> >
> >The attached patch enables dnsmasq(8) to return the ip addresses
> >of multiple tftp servers (for pxe boot) having a single alias
> >name (thru the /etc/hosts) in round robin fashion.
> >
> >We have a virtual environment where there are some managed hosts
> >running kvm hypervisor and some > 150  virtual machines
> >carved out of these hosts. All these virtual machines are thin
> >clients which boot of the net using pxe. The arrangement is such
> >that all of these machines boot at the same time and in order to
> >balance the load on the tftp server, we planned to have multiple
> >tftp servers (on these managed hosts themselves) running.
> >
> >dnsmasq currently returns only one address for tftp server
> >which it finds in the dhcp-boot option in the dnsmasq.conf
> >file. Although there is a provision for specifying the
> >tftp server name there but it is not used. We made
> >use of this name as an alias for multiple tftp servers
> >(using /etc/hosts) and then return the resolved addresses
> >one by one in cycle.
> >
> >The function cache_find_by_name() already takes care
> >of all this and all we had to do was to just call
> >it in dhcp_reply() to get one address and return
> >that as tftp address.
> >
> >If the tftp server address is specified in the dhcp-boot
> >option then that address is returned always. If address
> >is not specified and name is specified then this cyclic
> >stuff is done. This solution is working for us and hope it
> >will be useful to others.
> >
> >
> >Following is the patch (also attached) based on
> >dnsmasq-2.57:
> >
> >................................................................
> >
> >--- dnsmasq-2.57.origg/src/rfc2131.c    2011-02-17 21:00:15.000000000
> >+0530
> >+++ dnsmasq-2.57/src/rfc2131.c    2011-06-18 17:48:59.000000000 +0530
> >@@ -829,8 +829,23 @@
> >              and set discovery_control = 8 */
> >           if (boot)
> >             {
> >-              if (boot->next_server.s_addr)
> >+              if (boot->next_server.s_addr) {
> >             mess->siaddr = boot->next_server;
> >+              } else if (boot->sname) {
> >+
> >+                /*
> >+                 * If the pxe server name is given in the conf then
> >+                 * cycle thru its addresses.
> >+                 */
> >+
> >+                struct crec *crecp;
> >+                time_t now = dnsmasq_time();
> >+                crecp = cache_find_by_name(NULL, boot->sname, now,
> >+                               F_DHCP | F_HOSTS);
> >+                if (crecp) {
> >+                    mess->siaddr = *(struct in_addr*)&crecp->addr;
> >+                }
> >+              }
> >               
> >               if (boot->file)
> >         strncpy((char *)mess->file, boot->file, sizeof(mess->file)-1);
> >@@ -2222,8 +2237,23 @@
> >         strncpy((char *)mess->file, boot->file, sizeof(mess->file)-1);
> >     }
> >       
> >-      if (boot->next_server.s_addr)
> >+      if (boot->next_server.s_addr) {
> >     mess->siaddr = boot->next_server;
> >+      } else if (boot->sname) {
> >+
> >+        /*
> >+         * If the pxe server name is given in the conf then
> >+         * cycle thru its addresses.
> >+         */
> >+
> >+        struct crec *crecp;
> >+          time_t now = dnsmasq_time();
> >+        crecp = cache_find_by_name(NULL, boot->sname, now,
> >+                       F_DHCP | F_HOSTS);
> >+        if (crecp) {
> >+            mess->siaddr = *(struct in_addr*)&crecp->addr;
> >+        }
> >+      }
> >     }
> >   else
> >    /* Use the values of the relevant options if no dhcp-boot given and
> >................................................................
> >
> >Sushil.
> >
> >
> > 		 	   		  _______________________________________________
> >Dnsmasq-discuss mailing list
> >Dnsmasq-discuss at lists.thekelleys.org.uk
> >http://lists.thekelleys.org.uk/mailman/listinfo/dnsmasq-discuss
> 
> This looks like a great idea, but overloading the server name parameter is not correct. That can be used for other things. The correct way to do this is to check if a name is supplied instead of an address in dhcp-boot and act accordingly. That will need some code in options.c and elaboration of the dhcp boot data structure. 
> 
> A general observation for patch submitters. I'm much more likely to look kindly on a patch if it includes documentation, ie a patch to the man page.
> 
> I'm away from home at the moment, so further action on this may have to wait until next week.
> 
> Cheers, 
> 
> Simon.
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/attachments/20110619/1d33d753/attachment.htm 


More information about the Dnsmasq-discuss mailing list