Generic ones
Class: TYPE ~ Arpa.Net; -- Net was poor name choice; don't use it!
NetClass: PROC [address: Address] RETURNS [Class];
NetMask: PROC [address: Address] RETURNS [Address];
NetNumber: PROC [address: Address] RETURNS [Address]; (in Arpa.mesa)
SubnetAndHostNumber: PROC [address: Address] RETURNS [Address];
IsSpecificNet:
PROC [address: Address]
RETURNS [
BOOL] ~
INLINE {
Quick test that net is not unknown (net 0) or broadcast. Note the address may be a broadcast address on some specific net.
RETURN[SELECT address.a FROM 0 => FALSE, >=224 => FALSE, ENDCASE => TRUE]
};
Expensive ones — check subnet masks of all connected interfaces (hence not all that expensive unless there are several connected interfaces).
NetAndSubnetMask: PROC [address: Address] RETURNS [Address];
NetAndSubnetNumber:
PROC [address: Address]
RETURNS [Address] ~
INLINE {
RETURN[LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[address], LOOPHOLE[NetAndSubnetMask[address]]]]] };
HostNumber:
PROC [address: Address]
RETURNS [Address] ~
INLINE {
RETURN[LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[address], Basics.DoubleNot[LOOPHOLE[NetAndSubnetMask[address]]]]]] };
IsBroadcast:
PROC [address: Address]
RETURNS [
BOOL] ~
INLINE {
RETURN[(LOOPHOLE[Basics.DoubleOr[LOOPHOLE[address], LOOPHOLE[NetAndSubnetMask[address]]], Address] = broadcastAddress)] };
IsMyAddress: PROC [address: Address] RETURNS [BOOL];
Cheap ones — subnet-specific
NetAndSubnetNumberWithMask:
PROC [address: Address, mask: Address]
RETURNS [Address] ~
INLINE {
RETURN [LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[address], LOOPHOLE[mask]]]] };
HostNumberWithMask:
PROC [address: Address, mask: Address]
RETURNS [Address] ~
INLINE {
RETURN [LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[address], Basics.DoubleNot[LOOPHOLE[mask]]]]] };
IsBroadcastWithMask:
PROC [address: Address, mask: Address]
RETURNS [
BOOL]
~
INLINE {
RETURN [
(LOOPHOLE[Basics.DoubleOr[LOOPHOLE[address], LOOPHOLE[mask]], Address] = broadcastAddress)
];
};
BroadcastAddressOnSubnetWithMask:
PROC [address: Address, mask: Address]
RETURNS [Address]
~
INLINE {
RETURN [
LOOPHOLE[Basics.DoubleOr[LOOPHOLE[address], Basics.DoubleNot[LOOPHOLE[mask]]], Address]
];
};
Utilities — for rolling your own
AddressAnd:
PROC [address: Address, mask: Address]
RETURNS [Address] ~
INLINE {
RETURN[LOOPHOLE[Basics.DoubleAnd[LOOPHOLE[address], LOOPHOLE[mask]]]] };
AddressOr:
PROC [address: Address, mask: Address]
RETURNS [Address] ~
INLINE {
RETURN[LOOPHOLE[Basics.DoubleOr[LOOPHOLE[address], LOOPHOLE[mask]]]] };
MaskNot:
PROC [address: Address]
RETURNS [Address] ~
INLINE {
RETURN[LOOPHOLE[Basics.DoubleNot[LOOPHOLE[address]]]] };