<> <> <<>> <> <<>> 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]; <
> <> <> 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]; <> <<>> SubnetAndHostNumber: PROC [address: Address] RETURNS [Address]; IsSpecificNet: PROC [address: Address] RETURNS [BOOL] ~ INLINE { <> RETURN[SELECT address.a FROM 0 => FALSE, >=224 => FALSE, ENDCASE => TRUE] }; <> 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]; <> 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] ]; }; <> 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]]]] }; <> MyAddress: PROC RETURNS [Address]; <> <> MyAddresses: PROC RETURNS [LIST OF Address]; <> <> }...