/// <summary>
 /// Creates an instance from subtype, mobility security parameter index and authentication data.
 /// </summary>
 /// <param name="subtype">A number assigned to identify the entity and/or mechanism to be used to authenticate the message.</param>
 /// <param name="mobilitySecurityParameterIndex">
 /// A number in the range [0-4294967296] used to index into the shared-key-based mobility security associations.
 /// </param>
 /// <param name="authenticationData">
 /// Has the information to authenticate the relevant mobility entity.
 /// This protects the message beginning at the Mobility Header up to and including the mobility SPI field.
 /// </param>
 public IpV6MobilityOptionAuthentication(IpV6AuthenticationSubtype subtype, uint mobilitySecurityParameterIndex, DataSegment authenticationData)
     : base(IpV6MobilityOptionType.Authentication)
 {
     Subtype = subtype;
     MobilitySecurityParameterIndex = mobilitySecurityParameterIndex;
     AuthenticationData = authenticationData;
 }
 /// <summary>
 /// Creates an instance from subtype, mobility security parameter index and authentication data.
 /// </summary>
 /// <param name="subtype">A number assigned to identify the entity and/or mechanism to be used to authenticate the message.</param>
 /// <param name="mobilitySecurityParameterIndex">
 /// A number in the range [0-4294967296] used to index into the shared-key-based mobility security associations.
 /// </param>
 /// <param name="authenticationData">
 /// Has the information to authenticate the relevant mobility entity.
 /// This protects the message beginning at the Mobility Header up to and including the mobility SPI field.
 /// </param>
 public IpV6MobilityOptionAuthentication(IpV6AuthenticationSubtype subtype, uint mobilitySecurityParameterIndex, DataSegment authenticationData)
     : base(IpV6MobilityOptionType.Authentication)
 {
     Subtype = subtype;
     MobilitySecurityParameterIndex = mobilitySecurityParameterIndex;
     AuthenticationData             = authenticationData;
 }
        internal override IpV6MobilityOption CreateInstance(DataSegment data)
        {
            if (data.Length < OptionDataMinimumLength)
            {
                return(null);
            }

            IpV6AuthenticationSubtype subtype          = (IpV6AuthenticationSubtype)data[Offset.Subtype];
            uint        mobilitySecurityParameterIndex = data.ReadUInt(Offset.MobilitySecurityParameterIndex, Endianity.Big);
            DataSegment authenticationData             = data.Subsegment(Offset.AuthenticationData, data.Length - Offset.AuthenticationData);

            return(new IpV6MobilityOptionAuthentication(subtype, mobilitySecurityParameterIndex, authenticationData));
        }