attrib = MMRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MMRP
+ printf("MMRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TXLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MMRP_db->mrp_db), MRP_EVENT_TXLA);
attrib = MMRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MMRP
+ printf("MMRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_RLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MMRP_db->mrp_db), MRP_EVENT_RLA);
attrib = MMRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MMRP
+ printf("MMRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TX);
attrib = attrib->next;
}
attrib = MMRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MMRP
+ printf("MMRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant),
MRP_EVENT_PERIODIC);
attrib = attrib->next;
free(rattrib);
}
+#if LOG_MMRP
+ printf("MMRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), event);
/* remap local requests into registrar events */
switch (event) {
/* state machine controls */
int p2pmac;
+static char *mrp_event_string(int e)
+{
+ switch (e) {
+ case MRP_EVENT_BEGIN:
+ return "BEGIN";
+ case MRP_EVENT_NEW:
+ return "NEW";
+ case MRP_EVENT_JOIN:
+ return "JOIN";
+ case MRP_EVENT_LV:
+ return "LV";
+ case MRP_EVENT_TX:
+ return "TX";
+ case MRP_EVENT_TXLA:
+ return "TXLA";
+ case MRP_EVENT_TXLAF:
+ return "TXLAF";
+ case MRP_EVENT_RNEW:
+ return "RNEW";
+ case MRP_EVENT_RJOININ:
+ return "RJOININ";
+ case MRP_EVENT_RIN:
+ return "RIN";
+ case MRP_EVENT_RJOINMT:
+ return "RJOINMT";
+ case MRP_EVENT_RMT:
+ return "RMT";
+ case MRP_EVENT_RLV:
+ return "RLV";
+ case MRP_EVENT_RLA:
+ return "RLA";
+ case MRP_EVENT_FLUSH:
+ return "FLUSH";
+ case MRP_EVENT_REDECLARE:
+ return "REDECLARE";
+ case MRP_EVENT_PERIODIC:
+ return "PERIODIC";
+ case MRP_EVENT_PERIODIC_ENABLE:
+ return "ENABLE";
+ case MRP_EVENT_PERIODIC_DISABLE:
+ return "DISABLE";
+ case MRP_EVENT_LVTIMER:
+ return "LVTIMER";
+ case MRP_EVENT_LVATIMER:
+ return "LVATIMER";
+ default:
+ return "UNKNOWN";
+ }
+}
+
+static char *mrp_state_string(int s)
+{
+ switch (s) {
+ case MRP_VO_STATE:
+ return "VO";
+ case MRP_VP_STATE:
+ return "VO";
+ case MRP_VN_STATE:
+ return "VO";
+ case MRP_AN_STATE:
+ return "VO";
+ case MRP_AA_STATE:
+ return "VO";
+ case MRP_QA_STATE:
+ return "VO";
+ case MRP_LA_STATE:
+ return "VO";
+ case MRP_AO_STATE:
+ return "VO";
+ case MRP_QO_STATE:
+ return "VO";
+ case MRP_AP_STATE:
+ return "VO";
+ case MRP_QP_STATE:
+ return "VO";
+ case MRP_LO_STATE:
+ return "VO";
+
+ case MRP_IN_STATE:
+ return "VO";
+ case MRP_LV_STATE:
+ return "VO";
+ case MRP_MT_STATE:
+ return "VO";
+ default:
+ return"??";
+ }
+}
+
static int client_lookup(client_t * list, struct sockaddr_in *newclient)
{
client_t *client_item;
int mrp_state = attrib->mrp_state;
int sndmsg = MRP_SND_NULL;
+#if LOG_MVRP || LOG_MSRP || LOG_MMRP
+ printf("APP FSM evt %s, state %s\n", mrp_event_string(event), mrp_state_string(mrp_state));
+#endif
switch (event) {
case MRP_EVENT_BEGIN:
mrp_state = MRP_VO_STATE;
}
attrib->tx = tx;
+ /*
+ See note 6, table 10.3
+ */
+ if ((attrib->mrp_state != mrp_state) && (event != MRP_EVENT_TX) ) {
+ switch (mrp_state) {
+ case MRP_VP_STATE:
+ case MRP_VN_STATE:
+ case MRP_AN_STATE:
+ case MRP_AA_STATE:
+ case MRP_LA_STATE:
+ case MRP_AP_STATE:
+ case MRP_LO_STATE:
+ mrp_schedule_tx_event();
+ break;
+ default:
+ break;
+ }
+#if LOG_MVRP || LOG_MSRP || LOG_MMRP
+ printf("APP FSM state transition to %s\n", mrp_state_string(mrp_state));
+#endif
+ }
attrib->mrp_state = mrp_state;
attrib->sndmsg = sndmsg;
attrib->encode = (optional ? MRP_ENCODE_OPTIONAL : MRP_ENCODE_YES);
******************************************************************************/
+#define LOG_MRP 1
+#define LOG_MVRP 1
+#define LOG_MMRP 1
+#define LOG_MSRP 1
+
+
#define MRP_ENCODE_YES 0 /* must send */
#define MRP_ENCODE_OPTIONAL 1 /* send if smaller */
int mrp_decode_state(mrp_registrar_attribute_t * rattrib,
mrp_applicant_attribute_t * aattrib, char *str,
int strlen);
+void mrp_schedule_tx_event(void);
pkt_event_wpcap_timeout,
pkt_event_localhost_timeout,
app_event_kill_all,
+ tx_request_event,
loop_time_tick
};
int msrp_enable;
int logging_enable;
int mrpd_port;
-HANDLE pkt_events[6];
+HANDLE pkt_events[7];
HANDLE sem_kill_wpcap_thread;
HANDLE sem_kill_localhost_thread;
struct que_def *que_wpcap;
}
+void mrp_schedule_tx_event(void)
+{
+ if (!SetEvent(pkt_events[tx_request_event]))
+ printf("SetEvent tx_request_event failed (%d)\n", GetLastError());
+}
+
+
HANDLE kill_packet_capture;
void process_events(void)
ExitProcess(0);
}
}
- pkt_events[pkt_event_wpcap] = que_data_available_object(que_wpcap);
+ pkt_events[pkt_event_wpcap] =
+ que_data_available_object(que_wpcap);
pkt_events[pkt_event_localhost] =
que_data_available_object(que_localhost);
break;
switch (dwEvent) {
+ case WAIT_OBJECT_0 + tx_request_event:
+ mmrp_event(MRP_EVENT_TX, NULL);
+ mvrp_event(MRP_EVENT_TX, NULL);
+ msrp_event(MRP_EVENT_TX, NULL);
+ break;
case WAIT_TIMEOUT:
case WAIT_OBJECT_0 + loop_time_tick:
/* timeout - run protocols */
attrib = MSRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MSRP
+ printf("MSRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TXLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MSRP_db->mrp_db), MRP_EVENT_TXLA);
attrib = MSRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MSRP
+ printf("MSRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_RLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MSRP_db->mrp_db), MRP_EVENT_RLA);
attrib = MSRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MSRP
+ printf("MSRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TX);
attrib = attrib->next;
}
attrib = MSRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MSRP
+ printf("MSRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant),
MRP_EVENT_PERIODIC);
attrib = attrib->next;
attrib = MVRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MVRP
+ printf("MVRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TXLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MVRP_db->mrp_db), MRP_EVENT_TXLA);
attrib = MVRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MVRP
+ printf("MVRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_RLA);
mrp_registrar_fsm(&(attrib->registrar),
&(MVRP_db->mrp_db), MRP_EVENT_RLA);
attrib = MVRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MVRP
+ printf("MVRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), MRP_EVENT_TX);
attrib = attrib->next;
}
attrib = MVRP_db->attrib_list;
while (NULL != attrib) {
+#if LOG_MVRP
+ printf("MVRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant),
MRP_EVENT_PERIODIC);
attrib = attrib->next;
free(rattrib);
}
+#if LOG_MVRP
+ printf("MVRP -> mrp_applicant_fsm\n");
+#endif
mrp_applicant_fsm(&(attrib->applicant), event);
/* remap local requests into registrar events */
switch (event) {