<<>> <> <> <> <> <> <<>> <> <> <> <> <> <<>> DIRECTORY Basics32 USING [BITAND, BITNOT, BITOR] ; Arpa: CEDAR DEFINITIONS IMPORTS Basics32 = BEGIN <> Address: TYPE = PACKED RECORD [a, b, c, d: BYTE]; nullAddress: Address = [0, 0, 0, 0]; broadcastAddress: Address = [255, 255, 255, 255]; Net: TYPE = {a, b, c}; netMasks: ARRAY Net OF Address = [ a: [0FF, 0, 0, 0], b: [0FF, 0FFH, 0, 0], c: [0FF, 0FFH, 0FFH, 0] ]; NetType: PROC [address: Address] RETURNS [Net]; NetNumber: PROC [address: Address] RETURNS [Address]; <
> <> <> 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[Basics32.BITAND[LOOPHOLE[address], LOOPHOLE[NetAndSubnetMask[address]]]]] }; HostNumber: PROC [address: Address] RETURNS [Address] ~ INLINE { RETURN[LOOPHOLE[Basics32.BITAND[LOOPHOLE[address], Basics32.BITNOT[LOOPHOLE[NetAndSubnetMask[address]]]]]] }; IsBroadcast: PROC [address: Address] RETURNS [BOOL] ~ INLINE { RETURN[(LOOPHOLE[Basics32.BITOR[LOOPHOLE[address], LOOPHOLE[NetAndSubnetMask[address]]], Address] = broadcastAddress)] }; IsMyAddress: PROC [address: Address] RETURNS [BOOL]; <> NetAndSubnetNumberWithMask: PROC [address: Address, mask: Address] RETURNS [Address] ~ INLINE { RETURN [LOOPHOLE[Basics32.BITAND[LOOPHOLE[address], LOOPHOLE[mask]]]] }; HostNumberWithMask: PROC [address: Address, mask: Address] RETURNS [Address] ~ INLINE { RETURN [LOOPHOLE[Basics32.BITAND[LOOPHOLE[address], Basics32.BITNOT[LOOPHOLE[mask]]]]] }; IsBroadcastWithMask: PROC [address: Address, mask: Address] RETURNS [BOOL] ~ INLINE { RETURN [ (LOOPHOLE[Basics32.BITOR[LOOPHOLE[address], LOOPHOLE[mask]], Address] = broadcastAddress) ]; }; BroadcastAddressOnSubnetWithMask: PROC [address: Address, mask: Address] RETURNS [Address] ~ INLINE { RETURN [ LOOPHOLE[Basics32.BITOR[LOOPHOLE[address], Basics32.BITNOT[LOOPHOLE[mask]]], Address] ]; }; <> AddressAnd: PROC [address: Address, mask: Address] RETURNS [Address] ~ INLINE { RETURN[LOOPHOLE[Basics32.BITAND[LOOPHOLE[address], LOOPHOLE[mask]]]] }; AddressOr: PROC [address: Address, mask: Address] RETURNS [Address] ~ INLINE { RETURN[LOOPHOLE[Basics32.BITOR[LOOPHOLE[address], LOOPHOLE[mask]]]] }; MaskNot: PROC [address: Address] RETURNS [Address] ~ INLINE { RETURN[LOOPHOLE[Basics32.BITNOT[LOOPHOLE[address]]]] }; <> MyAddress: PROC RETURNS [Address]; <> <> MyAddresses: PROC RETURNS [LIST OF Address]; <> <> END.