--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/esockapiextensions/internetsockets/inc/in6_opt.h Tue Jan 26 15:23:49 2010 +0200
@@ -0,0 +1,395 @@
+// Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// in6_opt.h - new socket options and MEventService data e.g.
+// for accessing the network interface and route
+// information.
+// New socket options and MEventService data e.g. for accessing the network interface
+// and route information.
+//
+
+
+
+/**
+ @file in6_opt.h
+ @publishedAll
+ @released
+*/
+
+#ifndef __INSOCK_IN6_ROUTE_H__
+#define __INSOCK_IN6_ROUTE_H__
+
+#include <in_sock.h>
+
+
+// PS: I'm declaring the following rule:
+// ** Use socket option names above 0x1000 for all options defined in this file **
+// (don't want to accidentally collide with in_sock.h, even though the probability is
+// small considering the number of different sockopt levels)
+
+
+// -- Socket option level: KSolInetIp --
+
+/**
+Controls the use of Explicit Congestion Notification. Values:
+@li 0 = ECN disabled
+@li 1 = ECN enabled with ECT(1)
+@li 2 = ECN enabled with ECT(0) (recommended over ECT(1), because some implementations may
+not implement ECT(1))
+
+See RFC 3168 for more information.
+@publishedAll
+@released
+*/
+const TUint KSoIpEcn = 0x1010;
+
+/**
+Next hop route selection.
+
+Set forces the next hop route selection on the flow.
+The option parameter is not used in set.
+
+Get returns information about the current next hop
+selection. The option parameter is TInetRouteInfo.
+
+If the link layer is using addresses, the information
+refers to neighbor cache entry. If the interface is not
+using link layer addresses, the returned information just
+describes the currently attached route entry.
+
+To be successful, the flow must be assigned to the
+interface and the source address must be set at the
+time of the call.
+
+This option is provided for hook implementations, for
+example ISATAP tunneling hook can use this¨to force
+next hop selection on the virtual interface to find the
+actual link layer address (= outer IPv4 address).
+*/
+const TUint KSoNextHop = 0x1011;
+
+
+// -- Socket option level: KSolInetTcp --
+/**
+If set, only full-sized TCP segments are sent before closing the connection. This is like
+Nagle, but stricter.
+@publishedAll
+@released
+*/
+const TUint KSoTcpCork = 0x1020;
+
+/**
+Send only full-sized TCP segments. Separate option in addition to KSoTcpCork is needed for
+BSD compatibility.
+@publishedAll
+@released
+*/
+const TUint KSoTcpNoPush = 0x1021;
+
+/**
+Do not return from close immediately, but linger for given maximum time to wait that the
+send buffers are emptied. Socket option parameter is TSoTcpLingerOpt struct.
+@publishedAll
+@released
+*/
+const TUint KSoTcpLinger = 0x1022;
+
+
+/**
+Parameter struct for KSoTcpLinger socket option. The following combinations are possible:
+
+@li <b>iOnOff == 0</b>: Close() call returns immediately, but TCP still
+ tries to transmit the data remaining in its send buffers.
+@li <b>iOnOff == 1, iLinger == 0</b>: Close() returns immediately, and the TCP sender discards
+ all data in its send buffers. TCP RST is sent to the other end. Note: the TCP sender
+ avoids the TIME_WAIT state.
+@li <b>iOnOff == 1, iLinger > 0</b>: Close() call blocks until the data in TCP send buffers
+ is succesfully transmitted and the connection is graciously terminated.
+ If the sender cannot transmit all data before the linger time expires,
+ the Close() call wakes up, but the stack continues towards terminating the
+ connection as usual.
+
+A similar structure is used in BSD Unix sockets, hence porting Unix apps using linger option
+should be straight forward.
+@publishedAll
+@released
+*/
+class TSoTcpLingerOpt
+ {
+public:
+ TInt iOnOff; //< 0=Linger off; nonzero=Linger on.
+ TInt iLinger; //< Linger time in seconds.
+ };
+
+
+// -- Socket option level: KSolInetIfQuery --
+
+// The options below are on KSolInetIfQuery level, although they use different option format
+// than the rest of the options.
+// There are no incoming parameters for these queries
+
+/**
+Return array of TInetInterfaceInfo objects as the response of GetOptions call.
+@publishedAll
+@released
+*/
+const TUint KSoInetInterfaceInfo = 0x1001;
+
+/**
+Return array of TInetAddressInfo objects as the response of GetOptions call.
+@publishedAll
+@released
+*/
+const TUint KSoInetAddressInfo = 0x1002;
+
+/**
+Return array of TInetRouteInfo objects as the response of GetOptions call.
+@publishedAll
+@released
+*/
+const TUint KSoInetRouteInfo = 0x1003;
+
+/**
+Information of an address attached to interface.
+Used by the event service (EClassAddress events) and KSoInetAddressInfo socket option.
+@publishedAll
+@released
+*/
+class TInetAddressInfo
+ {
+public:
+ TUint32 iInterface; //< Network interface index to which this address is bound.
+ TIp6Addr iAddress; //< Prefix or Id part of the address described.
+ TUint8 iPrefixLen; //< Length of the prefix part in bits.
+ TUint32 iScopeId; //< ScopeId of this address.
+ TUint32 iPrefLifetime; //< Remaining Preferred lifetime of this address.
+ TUint32 iValidLifetime; //< Remaining Valid lifetime of this address.
+ TUint iFlags; //< Is address entry for prefix or id, etc. See enum TFlags
+ TUint iState; //< Address state, copied from TIp6AddressInfo, see enum TAddressState
+ TUint iType; //< Address type copied from TIp6AddressInfo, see enum TAddressType
+ TUint iGenerations; //< Number of times the address Id is generated (or randomly re-generated)
+ TUint iNS; //< Number of neighbour solicitations sent for DAD.
+
+ // Values used in iFlags field.
+ enum TFlags
+ {
+ EF_Prefix = 0x1, //< This address entry specifies prefix
+ EF_Id = 0x2, //< This address entry specifies id part of the address
+ EF_Deprecated = 0x4 //< Address is deprecated
+ };
+
+ // Values used in iState field. The field is directly copied from iface.cpp.
+ enum TAddressState
+ {
+ ENoAddress = 0, //< 0 0 - unassigned initial state (no address present)
+ EDuplicate = 1, //< 0 1 - address is duplicate
+ EAssigned = 2, //< 1 0 - address fully available
+ ETentative = 3 //< 1 1 - address is tentative (DAD in progress)
+ };
+
+ // Values used in iType field. The field is directly copied from iface.cpp.
+ enum TAddressType
+ {
+ EProxy = 2, //< Do DAD, is not for me (forward)
+ EAnycast = 1, //< Don't do DAD, is for me address
+ ENormal = 0 //< Do DAD, is for me
+ };
+ };
+
+
+/**
+Information of a network interface.
+Used by event service (EClassInterface events) and KSoInetInterfaceInfo socket option.
+@publishedAll
+@released
+*/
+class TInetInterfaceInfo
+ {
+public:
+ TUint32 iIndex;
+ TName iName; //< Interface name
+ TInt iState; //< State
+ TInt iSMtu; //< Maximum transmit unit size
+ TInt iRMtu; //< Maximum receive unit size
+ TInt iSpeedMetric; //< Metric - bigger is better
+ TUint iFeatures; //< Feature flags
+ TSockAddr iHwAddr; //< Hardware address
+
+ // Possible interface states.
+ // Can also have negative values when on error state.
+ enum
+ {
+ IfState_READY = 0, //< Ready to receive data from protocol
+ IfState_PENDING = 1, //< Not ready for data yet
+ IfState_HOLD = 2
+ };
+ };
+
+
+/**
+Information of a route entry in IP stack.
+Used by event service (EClassRoute events) and KSoInetRouteInfo socket option.
+@publishedAll
+@released
+*/
+class TInetRouteInfo
+ {
+public:
+ TUint32 iIndex; //< Route index
+ TUint iType; //< Type of route (kernel generated have 0 at the present)
+ TUint iState; //< State of route (copied from iState in CIp6Route)
+ TInt iMetric; //< Smaller is better (less hops and/or faster link)
+ TUint32 iInterface; //< Network interface index of the route
+ TIp6Addr iGateway; //< IP address of gateway (might be the interface)
+ TIp6Addr iDstAddr; //< Destination network or host
+ TUint8 iPrefixLen; //< Length of the route prefix in bits
+ TUint32 iScopeId; //< Scope Id of this route
+ TUint32 iLifetime; //< Route lifetime in seconds
+
+ enum
+ {
+ EDeprecated = 0x80000000 //< This bit is set in iType if the route is deprecated
+ };
+
+ // Values used in iState field
+ enum TState
+ {
+ EIncomplete = 0,
+ ELoopback = 1,
+ EOnlink = 2,
+ EGateway = 3,
+ EAnycast = 5,
+ ERedirect = 7,
+ EReachable = 8,
+ EStale = 16
+ };
+ };
+
+
+/**
+Information on a neighbour cache entry in the IP stack.
+Used by event service (EClassNeighbour events).
+@publishedAll
+@released
+*/
+class TInetNeighbourInfo
+ {
+public:
+ TUint32 iIndex; //< Route index.
+ TIp6Addr iDstAddr; //< Neighbour's IP address.
+ TUint iState; //< State of neigbour entry. @see TInetRouteInfo::TState.
+ TInt iMetric; //< Smaller is better (less hops and/or faster link).
+ TUint32 iInterface; //< Network interface index of the route.
+ TUint32 iScopeId; //< Scope Id of this neighbour.
+ TUint32 iLifetime; //< Cache entry lifetime in seconds.
+
+ // Hardware address (e.g. Ethernet MAC).
+ TBuf8<KMaxSockAddrSize> iHwAddr;
+ };
+
+
+/**
+For building an array on top of TDes8. This is like casting a TDes8 data pointer to an array, but
+it provides protection against array boundary violations, and some small helpful utilities.
+The motivation of this class is to help in handling the information accessed by MNetworkInfo
+interface.
+@publishedAll
+@released
+*/
+template<class T> class TOverlayArray
+ {
+public:
+ inline TOverlayArray(TDes8& aDes) : iDes(aDes)
+ { }
+
+ /**
+ * Returns pointer to the given element location in the array. If the index exceeds the
+ * maximum length of the array, NULL is returned.
+ */
+ inline T* IndexPtr(TInt aIndex)
+ { if (aIndex >= MaxLength()) return NULL; else return &((T*)iDes.Ptr())[aIndex]; }
+
+ /**
+ * Return the given element of the array. No boundary checking.
+ */
+ inline T& operator[](TInt aIndex)
+ { return ((T*)iDes.Ptr())[aIndex]; }
+
+ /**
+ * Returns the maximum length of the array in the number of array elements.
+ */
+ inline TInt MaxLength()
+ { return (iDes.MaxLength() / sizeof(T)); }
+
+ /**
+ * Returns the current length of the array in the number of array elements.
+ * The length information is based
+ * on the current underlaying descriptor length, which may not always be the desired result.
+ */
+ inline TInt Length()
+ { return (iDes.Length() / sizeof(T)); }
+
+ /**
+ * Set the length of the underlaying descriptor. The parameter is given in the number of array
+ * elements, which is then multiplied by a length of one element to determine the needed
+ * descriptor length.
+ */
+ inline void SetLength(TInt aLength)
+ { iDes.SetLength(aLength * sizeof(T)); }
+
+private:
+ TDes8& iDes;
+ };
+
+
+/**
+Information of a multicast group joined by the IP stack. This class is not currently
+used by socket options, only EClassMulticast events.
+@publishedAll
+@released
+*/
+class TInetMulticastInfo
+ {
+public:
+ TIp6Addr iMulticastGroup; //< IP address of the multicast group.
+ TUint32 iInterface; //< Interface index of the group.
+ TUint32 iLifetime; //< Lifetime of the group in seconds.
+ };
+
+
+// -- Socket option level: KSolInetIfCtrl --
+
+/**
+Control the use of link-local addresses per interface.
+Argument: TSoInetIpv4LinkLocalInfo (SetOpt only).
+@publishedAll
+@released
+
+@capability ECapabilityNetworkControl Configuring IPv4 Link-local addresses is restricted.
+@ref RSocket::SetOpt()
+*/
+const TUint KSoIpv4LinkLocal = 0x1001;
+
+/**
+Used as a parameter in KSoIpv4LinkLocal.
+@publishedAll
+@released
+*/
+class TSoInetIpv4LinkLocalInfo
+ {
+public:
+ TUint iInterface; //< Interface index to be affected.
+ TUint iFlag; //< Indicates whether IPv4 link locals are used (0='no'; 1='yes').
+ };
+
+#endif // __INSOCK_IN6_ROUTE_H__