Establishing Connections through HCI (Windows CE 5.0)
After loading the protocol layer, it calls the HCI_EstablishDeviceContext function for registration. The call to HCI_EstablishDeviceContext establishes a connection to the HCI layer.
The following code example shows the HCI_EstablishDeviceContext function declaration.
int HCI_EstablishDeviceContext(
void* pUserContext, /* IN */
UINT uiControl, /* IN */
BD_ADDR* pba, /* IN */
UINT class_of_device, /* IN */
UCHAR link_type, /* IN */
HCI_EVENT_INDICATION* pInd, /* IN */
HCI_CALLBACKS* pCall, /* IN */
HCI_INTERFACE* pInt, /* OUT */
in*t pcDataHeaders, /* OUT */
int* pcDataTrailers, /* OUT */
HANDLE* phDeviceContext /* OUT */
);
HCI_EstablishDeviceContext supplies a table of HCI events and HCI callbacks by passing pointers to HCI_EVENT_INDICATION and HCI_CALLBACKS structures, respectively. The upper layer receives a function table for the HCI layer interface in a pointer to the HCI_INTERFACE structure. For more information about HCI_INTERFACE, see HCI Commands.
In the call to HCI_EstablishDeviceContext, set the packet routing option by specifying a flag in the uiControl parameter. The following table shows the available packet routing options.
Flag option | Description |
---|---|
BTH_CONTROL_ROUTE_ALL | This option is typically reserved for the default handler such as the L2CAP stack. Only one stack can register to accept all the notifications.
A notification is passed up to this stack if there are no other stacks registered for this event. |
BTH_CONTROL_DEVICEONLY | Use this option to route all local device control packets here.
This is used for local device control, that is, place a device into a particular operating mode, one can register for this access, use this callback to program the device, and then deregister. Only one client at a time is allowed. This option is typically used for management layers that do not accept incoming connections at all. There may be more than one of these. |
BTH_CONTROL_ROUTE_SECURITY | Use this option to route all security events up this stack including PIN requests. This is used to implement the security manager.
With this option, link key/PIN requests for all connections will be forwarded to this stack layer. Only one stack is allowed to be handled for security events. |
BTH_CONTROL_ROUTE_BY_ADDR | This option routes all callbacks associated with a particular device up this stack. Only one client is allowed for each BD_ADDR structure. |
BTH_CONTROL_ROUTE_BY_COD | Use this option to route connection requests associated with this class of device (COD) up this stack. Only one client is allowed for each COD. |
BTH_CONTROL_ROUTE_BY_LINKTYPE | Use this option to route connection requests associated with this link type up this stack. This is used to implement SCO connections.
A sample SCO connection scenario includes registering for a particular Bluetooth device, processing all SCO data packets here, and then returning all L2CAP packets to the L2CAP layer. |
The extension layer can choose to listen to all, or selected types, of events. For example, if you want the stack to accept only connections from a specified device, set uiControl to BTH_CONTROL_ROUTE_BY_ADDR and specify the Bluetooth device as a single pointer to the device address in the pba parameter.
You can also configure the extension layer to accept only synchronous connection-oriented ( SCO) connections, set uiControl to BTH_CONTROL_ROUTE_BY_LINKTYPE and specify the appropriate link type in the link_type parameter. The same process applies to the class of the device.
If the connection is established, a pointer to the device context handle is returned in the phDeviceContext out parameter. To close the connection, pass this handle in the HCI_CloseDeviceContext function.
See Also
Host Controller Interface | Bluetooth OS Design Development | Closing Connections through HCI | Bluetooth Protocol Stack
Send Feedback on this topic to the authors