int rtcfg_main_state_client_0(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; switch (event_id) { case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_STAGE_1_CFG: rtcfg_client_recv_stage_1(ifindex, rtskb); break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); kfree_rtskb(rtskb); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); break; default: rtos_res_unlock(&device[ifindex].dev_lock); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }
int rtcfg_main_state_client_all_known(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; switch (event_id) { case RTCFG_CMD_ANNOUNCE: return rtcfg_client_get_frag(ifindex, call); case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_STAGE_2_CFG_FRAG: rtcfg_client_recv_stage_2_frag(ifindex, rtskb); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_send_announce_reply(ifindex, rtskb->mac.ethernet->h_source); rtos_res_unlock(&device[ifindex].dev_lock); } kfree_rtskb(rtskb); break; case RTCFG_FRM_DEAD_STATION: rtcfg_client_recv_dead_station(ifindex, rtskb); break; case RTCFG_FRM_STAGE_1_CFG: /* ignore */ rtos_res_unlock(&device[ifindex].dev_lock); kfree_rtskb(rtskb); break; default: rtos_res_unlock(&device[ifindex].dev_lock); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }
int rtcfg_main_state_client_ready(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; struct rtcfg_device *rtcfg_dev; switch (event_id) { case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) { rtcfg_dev = &device[ifindex]; if (rtcfg_dev->stations_ready == rtcfg_dev->other_stations) rtcfg_complete_cmd(ifindex, RTCFG_CMD_READY, 0); rtos_res_unlock(&rtcfg_dev->dev_lock); } break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_send_announce_reply(ifindex, rtskb->mac.ethernet->h_source); rtos_res_unlock(&device[ifindex].dev_lock); } kfree_rtskb(rtskb); break; case RTCFG_FRM_DEAD_STATION: rtcfg_client_recv_dead_station(ifindex, rtskb); break; case RTCFG_FRM_STAGE_1_CFG: rtcfg_client_update_server(ifindex, rtskb); break; default: rtos_res_unlock(&device[ifindex].dev_lock); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }
int rtcfg_main_state_client_1(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtcfg_device *rtcfg_dev = &device[ifindex]; struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; struct rtcfg_cmd *cmd_event; int ret; switch (event_id) { case RTCFG_CMD_CLIENT: /* second trial (buffer was probably too small) */ rtcfg_queue_blocking_call(ifindex, (struct rt_proc_call *)event_data); rtcfg_next_main_state(ifindex, RTCFG_MAIN_CLIENT_0); rtos_res_unlock(&rtcfg_dev->dev_lock); return -CALL_PENDING; case RTCFG_CMD_ANNOUNCE: cmd_event = rtpc_get_priv(call, struct rtcfg_cmd); if (cmd_event->args.announce.burstrate == 0) { rtos_res_unlock(&rtcfg_dev->dev_lock); return -EINVAL; } rtcfg_queue_blocking_call(ifindex, (struct rt_proc_call *)event_data); rtcfg_dev->flags = cmd_event->args.announce.flags & (RTCFG_FLAG_STAGE_2_DATA | RTCFG_FLAG_READY); if (cmd_event->args.announce.burstrate < rtcfg_dev->burstrate) rtcfg_dev->burstrate = cmd_event->args.announce.burstrate; rtcfg_next_main_state(ifindex, RTCFG_MAIN_CLIENT_ANNOUNCED); ret = rtcfg_send_announce_new(ifindex); if (ret < 0) { rtcfg_dequeue_blocking_call(ifindex); rtos_res_unlock(&rtcfg_dev->dev_lock); return ret; } rtos_res_unlock(&rtcfg_dev->dev_lock); return -CALL_PENDING; case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_send_announce_reply(ifindex, rtskb->mac.ethernet->h_source); rtos_res_unlock(&device[ifindex].dev_lock); } kfree_rtskb(rtskb); break; case RTCFG_FRM_ANNOUNCE_REPLY: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); kfree_rtskb(rtskb); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); break; case RTCFG_FRM_STAGE_1_CFG: /* ignore */ rtos_res_unlock(&rtcfg_dev->dev_lock); kfree_rtskb(rtskb); break; default: rtos_res_unlock(&rtcfg_dev->dev_lock); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }
int rtcfg_main_state_client_2(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; struct rtcfg_device *rtcfg_dev; switch (event_id) { case RTCFG_CMD_READY: rtcfg_dev = &device[ifindex]; if (rtcfg_dev->stations_ready == rtcfg_dev->other_stations) rtpc_complete_call(call, 0); else rtcfg_queue_blocking_call(ifindex, call); rtcfg_next_main_state(ifindex, RTCFG_MAIN_CLIENT_READY); if ((rtcfg_dev->flags & RTCFG_FLAG_READY) == 0) { rtcfg_dev->flags |= RTCFG_FLAG_READY; rtcfg_send_ready(ifindex); } rtos_res_unlock(&rtcfg_dev->dev_lock); return -CALL_PENDING; case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) rtos_res_unlock(&device[ifindex].dev_lock); break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_send_announce_reply(ifindex, rtskb->mac.ethernet->h_source); rtos_res_unlock(&device[ifindex].dev_lock); } kfree_rtskb(rtskb); break; case RTCFG_FRM_DEAD_STATION: rtcfg_client_recv_dead_station(ifindex, rtskb); break; case RTCFG_FRM_STAGE_1_CFG: /* ignore */ rtos_res_unlock(&device[ifindex].dev_lock); kfree_rtskb(rtskb); break; default: rtos_res_unlock(&device[ifindex].dev_lock); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }
int rtcfg_main_state_client_all_frames(int ifindex, RTCFG_EVENT event_id, void* event_data) { struct rtskb *rtskb = (struct rtskb *)event_data; struct rt_proc_call *call = (struct rt_proc_call *)event_data; struct rtcfg_device *rtcfg_dev; switch (event_id) { case RTCFG_CMD_DETACH: rtcfg_client_detach(ifindex, call); break; case RTCFG_FRM_ANNOUNCE_NEW: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_send_announce_reply(ifindex, rtskb->mac.ethernet->h_source); rtcfg_dev = &device[ifindex]; if (rtcfg_dev->stations_found == rtcfg_dev->other_stations) { rtcfg_complete_cmd(ifindex, RTCFG_CMD_ANNOUNCE, 0); rtcfg_next_main_state(ifindex, test_bit(RTCFG_FLAG_READY, &rtcfg_dev->flags) ? RTCFG_MAIN_CLIENT_READY : RTCFG_MAIN_CLIENT_2); } rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); } kfree_rtskb(rtskb); break; case RTCFG_FRM_ANNOUNCE_REPLY: if (rtcfg_client_recv_announce(ifindex, rtskb) == 0) { rtcfg_dev = &device[ifindex]; if (rtcfg_dev->stations_found == rtcfg_dev->other_stations) { rtcfg_complete_cmd(ifindex, RTCFG_CMD_ANNOUNCE, 0); rtcfg_next_main_state(ifindex, test_bit(RTCFG_FLAG_READY, &rtcfg_dev->flags) ? RTCFG_MAIN_CLIENT_READY : RTCFG_MAIN_CLIENT_2); } rtdm_mutex_unlock(&rtcfg_dev->dev_mutex); } kfree_rtskb(rtskb); break; case RTCFG_FRM_READY: if (rtcfg_client_recv_ready(ifindex, rtskb) == 0) rtdm_mutex_unlock(&device[ifindex].dev_mutex); break; case RTCFG_FRM_DEAD_STATION: rtcfg_client_recv_dead_station(ifindex, rtskb); break; case RTCFG_FRM_STAGE_1_CFG: /* ignore */ rtdm_mutex_unlock(&device[ifindex].dev_mutex); kfree_rtskb(rtskb); break; default: rtdm_mutex_unlock(&device[ifindex].dev_mutex); RTCFG_DEBUG(1, "RTcfg: unknown event %s for rtdev %d in %s()\n", rtcfg_event[event_id], ifindex, __FUNCTION__); return -EINVAL; } return 0; }