ArpaExtras.mesa
Demers, August 26, 1987 4:11:03 pm PDT
This stuff should be folded into Arpa.mesa at the next opportunity.
DIRECTORY
Arpa USING [Address, Net],
Basics USING [DoubleAnd, DoubleNot, DoubleOr]
;
ArpaExtras: CEDAR DEFINITIONS
IMPORTS Basics
~ {
Address: TYPE ~ Arpa.Address;
broadcastAddress: Address = [255, 255, 255, 255];
Address Manipulations
BEWARE: nullAddress looks like a class A net, and broadcastAddress looks like a class C net. Use IsSpecificNet[address] if this matters to you.
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]]]] };
This machine
MyAddress: PROC RETURNS [Address];
Return an address for this machine.
May return nullAddress if no address is known.
MyAddresses: PROC RETURNS [LIST OF Address];
Return all known addresses for this machine.
Return NIL if no address is known.
}...