<div dir="ltr"><p>Hello,</p><p>I've been trying for a few days to configure a new freeradius server with mysql IP pools support and I noticed there's a few errors with the syntax of some queries on sqlippool.conf for mysql.</p>
<p>First of all, some queries would never match because the schema provided with freeradius for the radippools table would set the 'expiry_time' field as default to NULL and then the queries would try something like expiry_time < NOW(), which would never match if the field as NULL.</p>
<p>So, the correct schema for the database would be:<br>CREATE TABLE radippool (<br>  id                    int(11) unsigned NOT NULL auto_increment,<br>  pool_name             varchar(30) NOT NULL,<br>  framedipaddress       varchar(15) NOT NULL default '',<br>
  nasipaddress          varchar(15) NOT NULL default '',<br>  calledstationid       VARCHAR(30) NOT NULL,<br>  callingstationid      VARCHAR(30) NOT NULL,<br>  expiry_time           DATETIME NOT NULL,<br>  username              varchar(64) NOT NULL default '',<br>
  pool_key              varchar(30) NOT NULL,<br>  PRIMARY KEY (id)<br>);<br><br>And the, the complete ippool.conf should be:</p><p>-- begin -----------</p><p># ## This series of queries allocates an IP address<br> allocate-clear = "UPDATE ${ippool_table} \<br>
  SET nasipaddress = '', pool_key = 0, \<br>  callingstationid = '', username = '', \<br>  expiry_time = '0000-00-00' \<br>  WHERE pool_key = '${pool-key}'"<br><br>## This series of queries allocates an IP address<br>
## (Note: If your pool-key is set to Calling-Station-Id and not NAS-Port<br>## then you may wish to delete the "AND nasipaddress = '%{Nas-IP-Address}'<br>## from the WHERE clause)<br><br> allocate-clear = "UPDATE ${ippool_table} \<br>
  SET nasipaddress = '', pool_key = 0, \<br>  callingstationid = '', username = '', \<br>  expiry_time = '0000-00-00' \<br>  WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \<br>  AND nasipaddress = '%{Nas-IP-Address}'"<br>
<br>## The ORDER BY clause of this query tries to allocate the same IP-address<br>## which user had last session...<br>allocate-find = "SELECT framedipaddress FROM ${ippool_table} \<br> WHERE pool_name = '%{control:Pool-Name}' AND expiry_time < NOW() \<br>
 ORDER BY (username <> '%{User-Name}'), \<br> (callingstationid <> '%{Calling-Station-Id}'), \<br> expiry_time \<br> LIMIT 1 \<br> FOR UPDATE"<br><br># ## If you prefer to allocate a random IP address every time, i<br>
# ## use this query instead<br><br># allocate-find = "SELECT framedipaddress FROM ${ippool_table} \<br>#  WHERE pool_name = '%{control:Pool-Name}' \<br>#  AND expiry_time IS NULL \<br>#  ORDER BY RAND() \<br>
#  LIMIT 1 \<br>#  FOR UPDATE"<br><br>## If an IP could not be allocated, check to see if the pool exists or not<br>## This allows the module to differentiate between a full pool and no pool<br>## Note: If you are not running redundant pool modules this query may be<br>
## commented out to save running this query every time an ip is not allocated.<br>pool-check = "SELECT id FROM ${ippool_table} \<br> WHERE pool_name='%{control:Pool-Name}' LIMIT 1"<br><br>## This is the final IP Allocation query, which saves the allocated ip details<br>
allocate-update = "UPDATE ${ippool_table} \<br> SET nasipaddress = '%{NAS-IP-Address}', pool_key = '${pool-key}', \<br> callingstationid = '%{Calling-Station-Id}', username = '%{User-Name}', \<br>
 expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \<br> WHERE framedipaddress = '%I'"<br><br>## This series of queries frees an IP number when an accounting<br>## START record arrives<br>start-update = "UPDATE ${ippool_table} \<br>
 SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \<br> WHERE nasipaddress = '%{NAS-IP-Address}' AND  pool_key = '${pool-key}'"<br><br>## This series of queries frees an IP number when an accounting<br>
## STOP record arrives<br>stop-clear = "UPDATE ${ippool_table} \<br> SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \<br> expiry_time = '0000-00-00' \<br> WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \<br>
 AND username = '%{User-Name}' \<br> AND callingstationid = '%{Calling-Station-Id}' \<br> AND framedipaddress = '%{Framed-IP-Address}'"<br><br>## This series of queries frees an IP number when an accounting<br>
## ALIVE record arrives<br>alive-update = "UPDATE ${ippool_table} \<br> SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \<br> WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \<br>
 AND username = '%{User-Name}' \<br> AND callingstationid = '%{Calling-Station-Id}' \<br> AND framedipaddress = '%{Framed-IP-Address}'"<br><br>## This series of queries frees the IP numbers allocate to a<br>
## NAS when an accounting ON record arrives<br>on-clear = "UPDATE ${ippool_table} \<br> SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \<br> expiry_time = '0000-00-00' \<br>
 WHERE nasipaddress = '%{Nas-IP-Address}'"<br><br>## This series of queries frees the IP numbers allocate to a<br>## NAS when an accounting OFF record arrives<br>off-clear = "UPDATE ${ippool_table} \<br>
 SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \<br> expiry_time = '0000-00-00' \<br> WHERE nasipaddress = '%{Nas-IP-Address}'"<br><br>-- end of file --------------<br>
</p><p></p><p>I might add I'm not any Mysql expert so any opinions about what I said are really welcome... I've tested it and apparently it works and I couldn't find any potential bugs so far...</p><p>I hope my english is not that rusty :)</p>
<p>--<br>Marcelus Trojahn<br></p>
</div>