Handling MED value
Eiichiro Watanabe
watanabe at mfeed.ad.jp
Mon Dec 19 02:19:49 CET 2011
> But it seems that your problem is not exactly with signedness, but with
> overflow (instead of saturation). Overflow works also the same for
> signed and unsigned ones.
>
> I thought about this some time ago and probably the best solution would
> be to switch BIRD completely to unsigned behavior (as most route properties
> with 32bit ranage are defined as unsigned) in some major release.
>
It's good idea.
>> I tried a workaround below, but it fails to load bird.conf with a syntax error message.
>>
>> bird> configure
>> Reading configuration from /etc/bird.conf
>> /etc/bird.conf, line 123: Number out of range
>
> What version of BIRD do you use? In the current version, it loads just fine (when i fixed missing
> '}'). But the code does not do what you expect, even if the numeric operations (comparison)
> would be unsigned 32bit - in that case the condition 'bgp_med + 100< 4294967295' would be
> always satisfied.
>
I am using 1.3.4 on Debian/GNU Linux(64bit).
> You can write the function like this:
>
> function TEST()
> int n;
> {
> if (source = RTS_BGP) then {
> n = bgp_med + 100;
> if (n>= 0&& n< 100) then
> bgp_med = n;
> else
> bgp_med = 4294967295;
> }
>
uum..., It's strange.
That fails on my environment.
"bgp_med = 4294967295;" statement in line 93 also looks to fail.
bird> configure
Reading configuration from /etc/bird.conf
/etc/bird.conf, line 93: Number out of range
However, I've realized this as a workaround.
function TEST()
int n;
{
if (source = RTS_BGP ) then {
if defined(bgp_med) then {
n = bgp_med + 100;
if (n >= 0 && n < 100) then
bgp_med = 0 - 1;
else
bgp_med = n;
} else {
bgp_med = 100;
}
}
return true;
}
Any comments?
Thanks,
Eiichiro
--
###################################################
Eiichiro Watanabe
Internet Multifeed Co.
More information about the Bird-users
mailing list