NAME | SYNOPSIS | API RESTRICTIONS | FEATURES | DESCRIPTION | EXTENDED DESCRIPTION | RETURN VALUES | ERRORS | ATTRIBUTES
#include <ddi/net/netFrame.h> #include <iom/osiStackAttach.h>int ethOsiStackAttach(const *device, OsiToEthConf* in, EthToOsiConf* out);
The function or functions documented here may not be used safely in all application contexts with all APIs provided in the ChorusOS 5.0 product.
See API(5FEA) for details.
IOM_OSI
ethOsiStackAttach() attaches an OSI stack that you provide to an Ethernet
device handled by the C_OS
.
ethOsiStackAttach() works by causing the C_OS to scan its network its
ifnet
interfaces until it finds the interface attached to the corresponding Ethernet hardware
device. Once that interface is found, it processes OSI traffic. If
device is NULL, the first C_OS
Ethernet network interface is used.
Once attached, the OSI stack cannot be detached. OSI stacks may be attached to multiple Ethernet hardware devices and each device may be attached to multiple OSI stacks.
typedef void (*EthFrameSend) (void* ethCookie, struct NetFrame* outFrame); typedef void (*OsiFrameReceive) (void* osiCookie, struct NetFrame* inFrame); typedef struct { void* osiCookie; OsiFrameReceive osiFrameReceive; } OsiToEthConf; typedef struct { void* ethCookie; char etherAddr[6]; EthFrameSend ethFrameSend; } EthToOsiConf;
The OSI stack provider must provide both (i) a cookie and (ii) an upcall for processing OSI network frames received in the in parameter.
It must also return (i) an Ethernet cookie, (ii) the Ethernet address of the Ethernet device, and (iii) a function pointer for sending OSI frames in the out parameter.
After ethOsiStackAttach() succeeds, the C_OS
will invoke the osiFrameReceive() function you provide each time it receives an OSI network frame. The first argument is the cookie given before in the in parameter passed to ethOsiStackAttach(), the second parameter is the frame whose type is defined as follows (<ddi/net/netFrame.h>):
typedef struct NetBuf { struct NetBuf* next; /* next buffer in the list or NULL */ uint32_f bufSize; /* size of memory buffer */ char* bufAddr; /* starting address of memory buffer */ } NetBuf; typedef struct NetFrame* NetFramePtr; typedef void (*NetFrameFree)(NetFramePtr); typedef struct NetFrame { struct NetFrame* next; /* to build list of NetFrames */ uint32_f frameSize; /* total length of frame */ NetBuf* bufList; /* list of memory buffers holding the data */ NetFrameFree freeFrame; /* the free function of the frame */ } NetFrame;
The OSI stack is given ownership of the NetFrame
. Once done with it, it must invoke the freeFrame() function to free it.
The osiFrameReceive() function is called at interrupt level. It it highly recommended that you optimize it in order to process the frame as fast as possible.
Upon successful completion, ethOsiStackAttach() returns 0; otherwise it returns -1 and sets errno to indicate the error.
ethOsiStackAttach() was called by a user actor.
Only supervisor actors can invoke ethOsiStackAttach().
No network interface attached to device was found.
See attributes(5) for descriptions of the following attributes:
ATTRIBUTE TYPE | ATTRIBUTE VALUE |
---|---|
Interface Stability | Evolving |
NAME | SYNOPSIS | API RESTRICTIONS | FEATURES | DESCRIPTION | EXTENDED DESCRIPTION | RETURN VALUES | ERRORS | ATTRIBUTES