Assign IP based on if giaddr is even or odd

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Assign IP based on if giaddr is even or odd

Stephen Donovan
Hello Gurus

I am trying to deploy a series of routers that can use DHCP to provide an IP address to the neighbouring router and once the router is reachable management software will push configuration to it.

All links between the routers are /31 subnets and it is possible that each router could be configured in each direction, for example if router A is up, then it will offer an address to router B, however if router B is up before A then B will offer an address to A.

I tried the sample subnet shown below and everything works, if I use the full giaddr in the match statement, however if I try to simplify it to match the class if the giaddr is even or odd doesn't work. My attempt on using a regex to match even/odd is commented out.

Does anyone have any suggestions on how I could use a different match to hand out different addresses based on if the giaddr is even or odd? Did I make a fundamental mistake in my match statement. I'm willing to use the full match, but would like to simplify if possible.

Thanks in advance
Steve

#test subnet
subnet 11.12.13.44 netmask 255.255.255.254 {
log(debug, concat ("giaddr: ", binary-to-ascii(10,8, ".", packet(27,1)))) ;
class "cw" {
#match if (binary-to-ascii(10,8, ".", packet(27,1)) ~~
#"^\d*[02468]$");
match if (binary-to-ascii(10,8, ".", packet(24,4)) =
"11.12.13.44");
}

pool
{
allow members of "cw";
range 11.12.13.45 11.12.13.45;
option routers 11.12.13.44;
option subnet-mask 255.255.255.254;
}

pool
{
deny members of "cw";
range 11.12.13.44 11.12.13.44;
option routers 11.12.13.45;
option subnet-mask 255.255.255.254;
}

}

_______________________________________________
ISC funds the development of this software with paid support subscriptions. Contact us at https://www.isc.org/contact/ for more information.

dhcp-users mailing list
[hidden email]
https://lists.isc.org/mailman/listinfo/dhcp-users
Reply | Threaded
Open this post in threaded view
|

RE: Assign IP based on if giaddr is even or odd

Thor Simon

You could easily enough do this with a funky “netmask” (the mask that picks out the “even Internet” from the “odd Internet” used to be a favorite puzzler question of mine) but ISC DHCP, like much other software these past 30 years, may not support that.

 

From: dhcp-users <[hidden email]> On Behalf Of Stephen Donovan
Sent: Wednesday, January 6, 2021 12:54 PM
To: [hidden email]
Subject: Assign IP based on if giaddr is even or odd

 

Hello Gurus

 

I am trying to deploy a series of routers that can use DHCP to provide an IP address to the neighbouring router and once the router is reachable management software will push configuration to it.

 

All links between the routers are /31 subnets and it is possible that each router could be configured in each direction, for example if router A is up, then it will offer an address to router B, however if router B is up before A then B will offer an address to A.

 

I tried the sample subnet shown below and everything works, if I use the full giaddr in the match statement, however if I try to simplify it to match the class if the giaddr is even or odd doesn't work. My attempt on using a regex to match even/odd is commented out.

 

Does anyone have any suggestions on how I could use a different match to hand out different addresses based on if the giaddr is even or odd? Did I make a fundamental mistake in my match statement. I'm willing to use the full match, but would like to simplify if possible.

 

Thanks in advance

Steve

 

#test subnet

subnet 11.12.13.44 netmask 255.255.255.254 {

log(debug, concat ("giaddr: ", binary-to-ascii(10,8, ".", packet(27,1)))) ;

class "cw" {

#match if (binary-to-ascii(10,8, ".", packet(27,1)) ~~

#"^\d*[02468]$");

match if (binary-to-ascii(10,8, ".", packet(24,4)) =

"11.12.13.44");

}

 

pool

{

allow members of "cw";

range 11.12.13.45 11.12.13.45;

option routers 11.12.13.44;

option subnet-mask 255.255.255.254;

}

 

pool

{

deny members of "cw";

range 11.12.13.44 11.12.13.44;

option routers 11.12.13.45;

option subnet-mask 255.255.255.254;

}

 

}


_______________________________________________
ISC funds the development of this software with paid support subscriptions. Contact us at https://www.isc.org/contact/ for more information.

dhcp-users mailing list
[hidden email]
https://lists.isc.org/mailman/listinfo/dhcp-users
Reply | Threaded
Open this post in threaded view
|

Re: Assign IP based on if giaddr is even or odd

Stephen Donovan
In reply to this post by Stephen Donovan

Thanks for the responses that I received, I managed to get it working.

 

Here is the match statement that I needed to use finally.

 

match if (suffix(binary-to-ascii(2,8, ".", packet(27,1)),1) = "0");

 

From: Stephen Donovan <[hidden email]>
Date: Wednesday, January 6, 2021 at 12:53 PM
To: "[hidden email]" <[hidden email]>
Subject: Assign IP based on if giaddr is even or odd

 

Hello Gurus

 

I am trying to deploy a series of routers that can use DHCP to provide an IP address to the neighbouring router and once the router is reachable management software will push configuration to it.

 

All links between the routers are /31 subnets and it is possible that each router could be configured in each direction, for example if router A is up, then it will offer an address to router B, however if router B is up before A then B will offer an address to A.

 

I tried the sample subnet shown below and everything works, if I use the full giaddr in the match statement, however if I try to simplify it to match the class if the giaddr is even or odd doesn't work. My attempt on using a regex to match even/odd is commented out.

 

Does anyone have any suggestions on how I could use a different match to hand out different addresses based on if the giaddr is even or odd? Did I make a fundamental mistake in my match statement. I'm willing to use the full match, but would like to simplify if possible.

 

Thanks in advance

Steve

 

#test subnet

subnet 11.12.13.44 netmask 255.255.255.254 {

log(debug, concat ("giaddr: ", binary-to-ascii(10,8, ".", packet(27,1)))) ;

class "cw" {

#match if (binary-to-ascii(10,8, ".", packet(27,1)) ~~

#"^\d*[02468]$");

match if (binary-to-ascii(10,8, ".", packet(24,4)) =

"11.12.13.44");

}

 

pool

{

allow members of "cw";

range 11.12.13.45 11.12.13.45;

option routers 11.12.13.44;

option subnet-mask 255.255.255.254;

}

 

pool

{

deny members of "cw";

range 11.12.13.44 11.12.13.44;

option routers 11.12.13.45;

option subnet-mask 255.255.255.254;

}

 

}


_______________________________________________
ISC funds the development of this software with paid support subscriptions. Contact us at https://www.isc.org/contact/ for more information.

dhcp-users mailing list
[hidden email]
https://lists.isc.org/mailman/listinfo/dhcp-users