Home | History | Annotate | Download | only in src
      1 /*
      2  * ipc_event.c
      3  *
      4  * Copyright 2001-2009 Texas Instruments, Inc. - http://www.ti.com/
      5  *
      6  * Licensed under the Apache License, Version 2.0 (the "License");
      7  * you may not use this file except in compliance with the License.
      8  * You may obtain a copy of the License at
      9  *
     10  *     http://www.apache.org/licenses/LICENSE-2.0
     11  *
     12  * Unless required by applicable law or agreed to in writing, software
     13  * distributed under the License is distributed on an "AS IS" BASIS,
     14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     15  * See the License for the specific language governing permissions and
     16  * limitations under the License.
     17  */
     18 
     19 /****************************************************************************
     20 *
     21 *   MODULE:  IPC_Event.c
     22 *
     23 *   PURPOSE:
     24 *
     25 *   DESCRIPTION:
     26 *   ============
     27 *
     28 *
     29 ****************************************************************************/
     30 
     31 /* includes */
     32 /************/
     33 #include <sys/types.h>
     34 #include <sys/socket.h>
     35 #include <net/if.h>
     36 #include <linux/rtnetlink.h>
     37 #include <signal.h>
     38 #include <sys/mman.h>
     39 #include <unistd.h>
     40 #include <linux/wireless.h>
     41 #include "cu_osapi.h"
     42 #include "oserr.h"
     43 
     44 #include "TWDriver.h"
     45 #include "STADExternalIf.h"
     46 
     47 #include "ParsEvent.h"
     48 #include "ipc_event.h"
     49 
     50 /* defines */
     51 /***********/
     52 #define PIPE_READ 0
     53 #define PIPE_WRITE 1
     54 #define IPC_EVENT_KEY ((key_t)123456789)
     55 
     56 /* IPC evemt messages to child */
     57 #define IPC_EVENT_MSG_KILL                  "IPC_EVENT_MSG_KILL"
     58 #define IPC_EVENT_MSG_UPDATE_DEBUG_LEVEL    "IPC_EVENT_MSG_UPDATE_DEBUG_LEVEL"
     59 #define IPC_EVENT_MSG_MAX_LEN   50
     60 
     61 /* local types */
     62 /***************/
     63 typedef struct IpcEvent_Shared_Memory_t
     64 {
     65     int pipe_fields[2];
     66     u64 event_mask;
     67     union
     68     {
     69         S32 debug_level;
     70     } content;
     71 } IpcEvent_Shared_Memory_t;
     72 
     73 /* Module control block */
     74 typedef struct IpcEvent_t
     75 {
     76     IpcEvent_Shared_Memory_t* p_shared_memory;
     77     S32 child_process_id;
     78     S32 pipe_to_child;
     79 } IpcEvent_t;
     80 
     81 typedef struct IpcEvent_Child_t
     82 {
     83     S32 STA_socket;
     84     IpcEvent_Shared_Memory_t* p_shared_memory;
     85     S32 pipe_from_parent;
     86 } IpcEvent_Child_t;
     87 
     88 /* local variables */
     89 /*******************/
     90 VOID g_tester_send_event(U8 event_index);
     91 /* local fucntions */
     92 /*******************/
     93 static VOID IpcEvent_SendMessageToChild(IpcEvent_t* pIpcEvent, PS8 msg)
     94 {
     95     write(pIpcEvent->pipe_to_child, msg, os_strlen(msg));
     96 }
     97 
     98 static S32 IpcEvent_Sockets_Open(VOID)
     99 {
    100     S32 skfd;
    101     struct sockaddr_nl  local;
    102 
    103     skfd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
    104     if (skfd < 0)
    105     {
    106         return -1;
    107     }
    108 
    109     os_memset(&local, 0, sizeof(local));
    110     local.nl_family = AF_NETLINK;
    111     local.nl_groups = RTMGRP_LINK;
    112     if (bind(skfd, (struct sockaddr *) &local, sizeof(local)) < 0)
    113     {
    114         close(skfd);
    115         return -2;
    116     }
    117 
    118     return skfd;
    119 }
    120 
    121 static inline VOID IpcEvent_Sockets_Close(S32 skfd)
    122 {
    123     close(skfd);
    124 }
    125 
    126 void ProcessLoggerMessage(PU8 data, U16 len);
    127 
    128 static VOID IpcEvent_PrintEvent(IpcEvent_Child_t* pIpcEventChild, U32 EventId, TI_UINT8* pData, S32 DataLen)
    129 {
    130 
    131     if(pIpcEventChild->p_shared_memory->event_mask & ((u64)1<<EventId))
    132     {
    133         switch(EventId)
    134         {
    135             case IPC_EVENT_DISASSOCIATED:
    136             {
    137                 OS_802_11_DISASSOCIATE_REASON_T    *pDisAssoc;
    138 
    139                 if (NULL == pData)
    140                 {
    141                     return;
    142                 }
    143                 else
    144                 {
    145                     pDisAssoc = (OS_802_11_DISASSOCIATE_REASON_T*)pData;
    146                 }
    147 
    148                 switch(pDisAssoc->eDisAssocType)
    149                 {
    150                     case OS_DISASSOC_STATUS_UNSPECIFIED:
    151                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated with unspecified reason (User/SG/Recovery)\n");
    152                         break;
    153                     case OS_DISASSOC_STATUS_AUTH_REJECT:
    154                         if (pDisAssoc->uStatusCode == STATUS_PACKET_REJ_TIMEOUT)
    155                         {
    156                             os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to no Auth response \n");
    157                         }
    158                         else
    159                         {
    160                             os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to Auth response packet with reason = %d\n", pDisAssoc->uStatusCode);
    161                         }
    162                         break;
    163                     case OS_DISASSOC_STATUS_ASSOC_REJECT:
    164                         if (pDisAssoc->uStatusCode == STATUS_PACKET_REJ_TIMEOUT)
    165                         {
    166                             os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to no Assoc response \n");
    167                         }
    168                         else
    169                         {
    170                             os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to Assoc response packet with reason = %d\n", pDisAssoc->uStatusCode);
    171                         }
    172                         break;
    173                     case OS_DISASSOC_STATUS_SECURITY_FAILURE:
    174                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to RSN failure\n");
    175                         break;
    176                     case OS_DISASSOC_STATUS_AP_DEAUTHENTICATE:
    177                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to AP deAuthenticate packet with reason = %d\n", pDisAssoc->uStatusCode);
    178                         break;
    179                     case OS_DISASSOC_STATUS_AP_DISASSOCIATE:
    180                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to AP disAssoc packet with reason = %d\n", pDisAssoc->uStatusCode);
    181                         break;
    182                     case OS_DISASSOC_STATUS_ROAMING_TRIGGER:
    183                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated due to roaming trigger = %d\n", pDisAssoc->uStatusCode);
    184                         break;
    185                     default:
    186                         os_error_printf(CU_MSG_ERROR, "CLI Event - Disassociated with unknown reason = %d\n", pDisAssoc->eDisAssocType);
    187                         break;
    188                 }
    189 
    190                 break; /* the end of the IPC_EVENT_DISASSOCIATED case */
    191             }
    192             case IPC_EVENT_ASSOCIATED:
    193                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_ASSOCIATED\n");
    194                 break;
    195             case IPC_EVENT_MEDIA_SPECIFIC:
    196                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_MEDIA_SPECIFIC\n");
    197                 break;
    198             case IPC_EVENT_SCAN_COMPLETE:
    199 				os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_SCAN_COMPLETE\n");
    200                 break;
    201             /* custom events */
    202             case IPC_EVENT_SCAN_STOPPED:
    203                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_SCAN_STOPPED\n");
    204                 break;
    205             case IPC_EVENT_LINK_SPEED:
    206                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_LINK_SPEED\n");
    207                 break;
    208             case IPC_EVENT_AUTH_SUCC:
    209                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_AUTH_SUCC\n");
    210                 break;
    211             case IPC_EVENT_CCKM_START:
    212                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_CCKM_START\n");
    213                 break;
    214             case IPC_EVENT_EAPOL:
    215                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_EAPOL\n");
    216                 break;
    217             case IPC_EVENT_RE_AUTH_STARTED:
    218                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_RE_AUTH_STARTED\n");
    219                 break;
    220             case IPC_EVENT_RE_AUTH_COMPLETED:
    221                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_RE_AUTH_COMPLETED\n");
    222                 break;
    223             case IPC_EVENT_RE_AUTH_TERMINATED:
    224                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_RE_AUTH_TERMINATED\n");
    225                 break;
    226             case IPC_EVENT_BOUND:
    227                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_BOUND\n");
    228                 break;
    229             case IPC_EVENT_UNBOUND:
    230                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_UNBOUND\n");
    231                 break;
    232             case IPC_EVENT_PREAUTH_EAPOL:
    233                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_PREAUTH_EAPOL\n");
    234                 break;
    235             case IPC_EVENT_LOW_RSSI:
    236                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_LOW_RSSI\n");
    237                 break;
    238             case IPC_EVENT_TSPEC_STATUS:
    239                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_TSPEC_STATUS\n");
    240 
    241                 OS_802_11_QOS_TSPEC_PARAMS* tspec = (OS_802_11_QOS_TSPEC_PARAMS*)pData;
    242                 os_error_printf(CU_MSG_ERROR, "CLI Event - IPC_EVENT_TSPEC_STATUS -- (ReasonCode = %d) \n",tspec->uReasonCode);
    243                 os_error_printf(CU_MSG_ERROR, "Tspec Parameters (as received through event handler):\n");
    244                 os_error_printf(CU_MSG_ERROR, "-----------------------------------------------------\n");
    245                 os_error_printf(CU_MSG_ERROR, "userPriority = %d\n",tspec->uUserPriority);
    246                 os_error_printf(CU_MSG_ERROR, "uNominalMSDUsize = %d\n",tspec->uNominalMSDUsize);
    247                 os_error_printf(CU_MSG_ERROR, "uMeanDataRate = %d\n",tspec->uMeanDataRate);
    248                 os_error_printf(CU_MSG_ERROR, "uMinimumPHYRate = %d\n",tspec->uMinimumPHYRate);
    249                 os_error_printf(CU_MSG_ERROR, "uSurplusBandwidthAllowance = %d\n",tspec->uSurplusBandwidthAllowance);
    250                 os_error_printf(CU_MSG_ERROR, "uAPSDFlag = %d\n",tspec->uAPSDFlag);
    251                 os_error_printf(CU_MSG_ERROR, "MinimumServiceInterval = %d\n",tspec->uMinimumServiceInterval);
    252                 os_error_printf(CU_MSG_ERROR, "MaximumServiceInterval = %d\n",tspec->uMaximumServiceInterval);
    253                 os_error_printf(CU_MSG_ERROR, "uMediumTime = %d\n\n",tspec->uMediumTime);
    254 
    255                 break;
    256             case IPC_EVENT_TSPEC_RATE_STATUS:
    257                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_TSPEC_RATE_STATUS\n");
    258                 break;
    259             case IPC_EVENT_MEDIUM_TIME_CROSS:
    260                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_MEDIUM_TIME_CROSS\n");
    261                 break;
    262             case IPC_EVENT_ROAMING_COMPLETE:
    263                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_ROAMING_COMPLETE\n");
    264                 break;
    265             case IPC_EVENT_EAP_AUTH_FAILURE:
    266                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_EAP_AUTH_FAILURE\n");
    267                 break;
    268             case IPC_EVENT_WPA2_PREAUTHENTICATION:
    269                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_WPA2_PREAUTHENTICATION\n");
    270                 break;
    271             case IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED:
    272             {
    273                 U32 *crossInfo = (U32 *)pData;
    274                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_TRAFFIC_INTENSITY_THRESHOLD_CROSSED\n");
    275                 os_error_printf(CU_MSG_ERROR, (PS8)"Threshold(High=0,  Low=1)   crossed= %d\n", crossInfo[0]);
    276                 os_error_printf(CU_MSG_ERROR, (PS8)"Direction(Above=0, Below=1) crossed= %d\n", crossInfo[1]);
    277                 break;
    278             }
    279             case IPC_EVENT_SCAN_FAILED:
    280                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_SCAN_FAILED\n");
    281                 break;
    282             case IPC_EVENT_WPS_SESSION_OVERLAP:
    283                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_WPS_SESSION_OVERLAP\n");
    284                 break;
    285             case IPC_EVENT_RSSI_SNR_TRIGGER:
    286                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_RSSI_SNR_TRIGGER (index = %d), Data = %d\n", (S8)(*(pData + 2) - 1),(S8)(*pData));
    287                 break;
    288             case IPC_EVENT_TIMEOUT:
    289                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_TIMEOUT\n");
    290                 break;
    291             case IPC_EVENT_GWSI:
    292                 os_error_printf(CU_MSG_ERROR, (PS8)"IpcEvent_PrintEvent - received IPC_EVENT_GWSI\n");
    293                 break;
    294             case IPC_EVENT_LOGGER:
    295 #ifdef ETH_SUPPORT
    296                 ProcessLoggerMessage(pData, (U16)DataLen);
    297 #endif
    298                 break;
    299             default :
    300                 os_error_printf(CU_MSG_ERROR, (PS8)"**** Unknow EventId %d ****\n", EventId);
    301         }
    302     }
    303 }
    304 
    305 static VOID IpcEvent_wext_event_wireless(IpcEvent_Child_t* pIpcEventChild, PS8 data, S32 len)
    306 {
    307     struct iw_event     iwe;
    308     struct stream_descr stream;
    309     S32                 ret;
    310     IPC_EV_DATA*        pEvent;
    311 	U32					EventId = 0;
    312 
    313     /* init the event stream */
    314     os_memset((char *)&stream, '\0', sizeof(struct stream_descr));
    315     stream.current = (char *)data;
    316     stream.end = (char *)(data + len);
    317 
    318     do
    319     {
    320         /* Extract an event and print it */
    321         ret = ParsEvent_GetEvent(&stream, &iwe);
    322 
    323         if(ret <= 0)
    324             break;
    325 
    326         switch (iwe.cmd)
    327         {
    328             case SIOCGIWAP:
    329                 if((iwe.u.ap_addr.sa_data[0] == 0) &&
    330                     (iwe.u.ap_addr.sa_data[1] == 0) &&
    331                     (iwe.u.ap_addr.sa_data[2] == 0) &&
    332                     (iwe.u.ap_addr.sa_data[3] == 0) &&
    333                     (iwe.u.ap_addr.sa_data[4] == 0) &&
    334                     (iwe.u.ap_addr.sa_data[5] == 0))
    335                 {
    336 					EventId=IPC_EVENT_DISASSOCIATED;
    337                      IpcEvent_PrintEvent(pIpcEventChild, EventId, NULL,0);
    338                 }
    339                 else
    340                 {
    341 #ifdef XCC_MODULE_INCLUDED
    342                     /* Send a signal to the udhcpc application to trigger the renew request */
    343                     system("killall -SIGUSR1 udhcpc");
    344 #endif
    345 					EventId=IPC_EVENT_ASSOCIATED;
    346                      IpcEvent_PrintEvent(pIpcEventChild, EventId, NULL,0);
    347                 }
    348                 break;
    349             case IWEVMICHAELMICFAILURE:
    350 				EventId=IPC_EVENT_MEDIA_SPECIFIC;
    351                 IpcEvent_PrintEvent(pIpcEventChild, EventId, NULL,0);
    352                 break;
    353             case IWEVCUSTOM:
    354 				pEvent =  (IPC_EV_DATA*)iwe.u.data.pointer;
    355                 if (pEvent)
    356                 {
    357                     EventId = (U32)pEvent->EvParams.uEventType;
    358                     IpcEvent_PrintEvent (pIpcEventChild, EventId, pEvent->uBuffer, pEvent->uBufferSize);
    359                 }
    360 				break;
    361             case SIOCGIWSCAN:
    362 				EventId=IPC_EVENT_SCAN_COMPLETE;
    363                 IpcEvent_PrintEvent(pIpcEventChild, EventId, NULL,0);
    364                 break;
    365             case IWEVASSOCREQIE:
    366                 /* NOP */
    367                 break;
    368             case IWEVASSOCRESPIE:
    369                 /* NOP */
    370                 break;
    371             case IWEVPMKIDCAND:
    372 				EventId=IPC_EVENT_MEDIA_SPECIFIC;
    373                 IpcEvent_PrintEvent(pIpcEventChild, EventId, NULL,0);
    374                 break;
    375         }
    376 
    377 		g_tester_send_event((U8) EventId);
    378 
    379     }
    380     while(1);
    381 }
    382 
    383 static VOID IpcEvent_wext_event_rtm_newlink(IpcEvent_Child_t* pIpcEventChild, struct nlmsghdr *h,
    384                                             S32 len)
    385 {
    386     struct ifinfomsg *ifi;
    387     S32 attrlen, nlmsg_len, rta_len;
    388     struct rtattr * attr;
    389 
    390     if (len < sizeof(*ifi))
    391         return;
    392 
    393     ifi = NLMSG_DATA(h);
    394 
    395     /*
    396     if ((if_nametoindex("wlan") != ifi->ifi_index) && (if_nametoindex("wifi") != ifi->ifi_index))
    397     {
    398         os_error_printf(CU_MSG_ERROR, "ERROR - IpcEvent_wext_event_rtm_newlink - Ignore event for foreign ifindex %d",
    399                ifi->ifi_index);
    400         return;
    401     }
    402     */
    403 
    404     nlmsg_len = NLMSG_ALIGN(sizeof(struct ifinfomsg));
    405 
    406     attrlen = h->nlmsg_len - nlmsg_len;
    407     if (attrlen < 0)
    408         return;
    409 
    410     attr = (struct rtattr *) (((char *) ifi) + nlmsg_len);
    411 
    412     rta_len = RTA_ALIGN(sizeof(struct rtattr));
    413     while (RTA_OK(attr, attrlen)) {
    414         if (attr->rta_type == IFLA_WIRELESS)
    415         {
    416             IpcEvent_wext_event_wireless(pIpcEventChild, ((PS8) attr) + rta_len,
    417                 attr->rta_len - rta_len);
    418         }
    419         else if (attr->rta_type == IFLA_IFNAME)
    420         {
    421             os_error_printf(CU_MSG_WARNING, (PS8)"WARNING - IpcEvent_wext_event_rtm_newlink - unsupported rta_type = IFLA_IFNAME\n");
    422 
    423         }
    424         attr = RTA_NEXT(attr, attrlen);
    425     }
    426 }
    427 
    428 static VOID IpcEvent_Handle_STA_Event(IpcEvent_Child_t* pIpcEventChild)
    429 {
    430     S8 buf[512];
    431     S32 left;
    432     struct sockaddr_nl from;
    433     socklen_t fromlen;
    434     struct nlmsghdr *h;
    435 
    436     fromlen = sizeof(from);
    437     left = recvfrom(pIpcEventChild->STA_socket, buf, sizeof(buf), MSG_DONTWAIT,
    438             (struct sockaddr *) &from, &fromlen);
    439     if (left < 0)
    440     {
    441         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Handle_STA_Event - cant recv from socket %X .\n",
    442 						pIpcEventChild->STA_socket);
    443         return;
    444     }
    445 
    446     h = (struct nlmsghdr *) buf;
    447 
    448     while (left >= sizeof(*h))
    449     {
    450         S32 len, plen;
    451 
    452         len = h->nlmsg_len;
    453         plen = len - sizeof(*h);
    454         if (len > left || plen < 0) {
    455             os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Handle_STA_Event - Malformed netlink message: len=%d left=%d plen=%d",
    456                    len, left, plen);
    457             break;
    458         }
    459 
    460         switch (h->nlmsg_type)
    461         {
    462         case RTM_NEWLINK:
    463             IpcEvent_wext_event_rtm_newlink(pIpcEventChild, h, plen);
    464             break;
    465         }
    466 
    467         len = NLMSG_ALIGN(len);
    468         left -= len;
    469         h = (struct nlmsghdr *) ((char *) h + len);
    470     }
    471 
    472     if (left > 0)
    473     {
    474         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Handle_STA_Event - %d extra bytes in the end of netlink ",
    475                left);
    476         IpcEvent_Handle_STA_Event(pIpcEventChild);
    477     }
    478 
    479 }
    480 
    481 static S32 IpcEvent_Handle_Parent_Event(IpcEvent_Child_t* pIpcEventChild)
    482 {
    483     S8 msg[IPC_EVENT_MSG_MAX_LEN];
    484 
    485     S32 msgLen = read(pIpcEventChild->pipe_from_parent,msg, IPC_EVENT_MSG_MAX_LEN);
    486     msg[msgLen] = 0;
    487 
    488     if(!os_strcmp(msg, (PS8)IPC_EVENT_MSG_KILL))
    489     {
    490         return TRUE;
    491     }
    492     if(!os_strcmp(msg, (PS8)IPC_EVENT_MSG_UPDATE_DEBUG_LEVEL))
    493     {
    494 /*        g_debug_level= pIpcEventChild->p_shared_memory->content.debug_level;*/
    495         return FALSE;
    496     }else
    497         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Handle_Parent_Event - unknown msgLen=%d msg=|%s| \n",msgLen,msg);
    498 
    499 	return FALSE;
    500 
    501 }
    502 
    503 static VOID IpcEvent_Child_Destroy(IpcEvent_Child_t* pIpcEventChild)
    504 {
    505     if(pIpcEventChild->STA_socket)
    506     {
    507         IpcEvent_Sockets_Close(pIpcEventChild->STA_socket);
    508     }
    509 
    510 }
    511 
    512 static VOID IpcEvent_Child(IpcEvent_Child_t* pIpcEventChild)
    513 {
    514     /* open the socket from the driver */
    515     pIpcEventChild->STA_socket = IpcEvent_Sockets_Open();
    516     if(pIpcEventChild->STA_socket < 0)
    517     {
    518         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Create - cant open socket for communication with the driver (%d)\n",pIpcEventChild->STA_socket);
    519         return;
    520     }
    521 
    522     while(1)
    523     {
    524         fd_set      read_set;       /* File descriptors for select */
    525         S32         ret;
    526 
    527         FD_ZERO(&read_set);
    528         FD_SET(pIpcEventChild->STA_socket, &read_set);
    529         FD_SET(pIpcEventChild->pipe_from_parent, &read_set);
    530 
    531 #ifndef ANDROID
    532         ret = select(max(pIpcEventChild->pipe_from_parent,pIpcEventChild->STA_socket) + 1,
    533                     &read_set, NULL, NULL, NULL);
    534 #else
    535         ret = select(pIpcEventChild->STA_socket + 1,
    536                     &read_set, NULL, NULL, NULL);
    537 #endif
    538 
    539         if(ret < 0)
    540         {
    541             os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Child - Unhandled signal - exiting...\n");
    542             break;
    543         }
    544         if(ret == 0)    {     continue; }      /* Check for interface discovery events. */
    545         if(FD_ISSET(pIpcEventChild->STA_socket, &read_set))
    546             IpcEvent_Handle_STA_Event(pIpcEventChild);
    547 
    548 #ifndef ANDROID
    549         if(FD_ISSET(pIpcEventChild->pipe_from_parent, &read_set))
    550         {
    551             S32 exit = IpcEvent_Handle_Parent_Event(pIpcEventChild);
    552              if(exit)
    553                 break;
    554         }
    555 #endif
    556 
    557     }
    558 
    559     IpcEvent_Child_Destroy(pIpcEventChild);
    560 }
    561 
    562 /* functions */
    563 /*************/
    564 THandle IpcEvent_Create(VOID)
    565 {
    566     IpcEvent_t* pIpcEvent = (IpcEvent_t*)os_MemoryCAlloc(sizeof(IpcEvent_t), sizeof(U8));
    567     if(pIpcEvent == NULL)
    568     {
    569         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Create - cant allocate control block\n");
    570         return NULL;
    571     }
    572 
    573     /* create a shared memory space */
    574     pIpcEvent->p_shared_memory = mmap(0, sizeof(IpcEvent_Shared_Memory_t), PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0);
    575     if ( pIpcEvent->p_shared_memory == ((PVOID)-1))
    576     {
    577         os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Create - cant allocate shared memory\n");
    578         IpcEvent_Destroy(pIpcEvent);
    579         return NULL;
    580     }
    581 
    582     /* create a pipe */
    583     pipe(pIpcEvent->p_shared_memory->pipe_fields);
    584 
    585     /* set the event mask to all disabled */
    586     pIpcEvent->p_shared_memory->event_mask = 0;
    587 
    588     /* Create a child process */
    589     pIpcEvent->child_process_id = fork();
    590 
    591     if (0 == pIpcEvent->child_process_id)
    592     {
    593         /******************/
    594         /* Child process */
    595         /****************/
    596         IpcEvent_Child_t* pIpcEventChild = (IpcEvent_Child_t*)os_MemoryCAlloc(sizeof(IpcEvent_Child_t), sizeof(U8));
    597         if(pIpcEventChild == NULL)
    598         {
    599             os_error_printf(CU_MSG_ERROR, (PS8)"ERROR - IpcEvent_Create - cant allocate child control block\n");
    600             _exit(1);
    601         }
    602 
    603         pIpcEventChild->p_shared_memory = pIpcEvent->p_shared_memory;
    604 
    605         pIpcEventChild->pipe_from_parent = pIpcEventChild->p_shared_memory->pipe_fields[PIPE_READ];
    606         close(pIpcEventChild->p_shared_memory->pipe_fields[PIPE_WRITE]);
    607 
    608         IpcEvent_Child(pIpcEventChild);
    609 
    610         os_MemoryFree(pIpcEventChild);
    611 
    612         _exit(0);
    613     }
    614 
    615     pIpcEvent->pipe_to_child = pIpcEvent->p_shared_memory->pipe_fields[PIPE_WRITE];
    616     close(pIpcEvent->p_shared_memory->pipe_fields[PIPE_READ]);
    617 
    618     return pIpcEvent;
    619 }
    620 
    621 VOID IpcEvent_Destroy(THandle hIpcEvent)
    622 {
    623     IpcEvent_t* pIpcEvent = (IpcEvent_t*)hIpcEvent;
    624 
    625     if((pIpcEvent->p_shared_memory != ((PVOID)-1)) && (pIpcEvent->p_shared_memory))
    626     {
    627         munmap(pIpcEvent->p_shared_memory, sizeof(IpcEvent_Shared_Memory_t));
    628     }
    629 
    630     /* kill child process */
    631     kill(pIpcEvent->child_process_id, SIGKILL);
    632 
    633      os_MemoryFree(pIpcEvent);
    634 
    635 }
    636 
    637 S32 IpcEvent_EnableEvent(THandle hIpcEvent, U32 event)
    638 {
    639     IpcEvent_t* pIpcEvent = (IpcEvent_t*)hIpcEvent;
    640 
    641     if(pIpcEvent->p_shared_memory->event_mask & ((u64)1 << event))
    642     {
    643         return EOALERR_IPC_EVENT_ERROR_EVENT_ALREADY_ENABLED;
    644     }
    645     else
    646     {
    647        pIpcEvent->p_shared_memory->event_mask |= ((u64)1 << event);
    648     }
    649 
    650     return OK;
    651 
    652 }
    653 
    654 S32 IpcEvent_DisableEvent(THandle hIpcEvent, U32 event)
    655 {
    656     IpcEvent_t* pIpcEvent = (IpcEvent_t*)hIpcEvent;
    657 
    658     if(!(pIpcEvent->p_shared_memory->event_mask & (1 << event)))
    659     {
    660         return EOALERR_IPC_EVENT_ERROR_EVENT_ALREADY_DISABLED;
    661     }
    662     else
    663     {
    664         pIpcEvent->p_shared_memory->event_mask &= ~(1 << event);
    665     }
    666 
    667     return OK;
    668 }
    669 
    670 S32 IpcEvent_UpdateDebugLevel(THandle hIpcEvent, S32 debug_level)
    671 {
    672     IpcEvent_t* pIpcEvent = (IpcEvent_t*)hIpcEvent;
    673 
    674     pIpcEvent->p_shared_memory->content.debug_level = debug_level;
    675     IpcEvent_SendMessageToChild(pIpcEvent, (PS8)IPC_EVENT_MSG_UPDATE_DEBUG_LEVEL);
    676 
    677     return OK;
    678 }
    679 
    680