mrpd: implement scheduling of TX event per footnote 6 of table 10-3
authorStephen Turner <sgturner@audioscience.com>
Thu, 25 Oct 2012 03:02:52 +0000 (20:02 -0700)
committerStephen Turner <sgturner@audioscience.com>
Thu, 25 Oct 2012 03:02:52 +0000 (20:02 -0700)
daemons/mrpd/mmrp.c
daemons/mrpd/mrp.c
daemons/mrpd/mrp.h
daemons/mrpd/mrpw.c
daemons/mrpd/msrp.c
daemons/mrpd/mvrp.c

index 123de1d..726098f 100644 (file)
@@ -204,6 +204,9 @@ int mmrp_event(int event, struct mmrp_attribute *rattrib)
                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);
@@ -220,6 +223,9 @@ int mmrp_event(int event, struct mmrp_attribute *rattrib)
                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);
@@ -234,6 +240,9 @@ int mmrp_event(int event, struct mmrp_attribute *rattrib)
                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;
                }
@@ -258,6 +267,9 @@ int mmrp_event(int event, struct mmrp_attribute *rattrib)
                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;
@@ -287,6 +299,9 @@ int mmrp_event(int event, struct mmrp_attribute *rattrib)
                        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) {
index ae8c774..9e37d7d 100644 (file)
 /* 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;
@@ -279,6 +368,9 @@ int mrp_applicant_fsm(mrp_applicant_attribute_t * attrib, int event)
        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;
@@ -609,6 +701,27 @@ int mrp_applicant_fsm(mrp_applicant_attribute_t * attrib, int event)
        }
 
        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);
index 59faa89..98496e6 100644 (file)
 
 ******************************************************************************/
 
+#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 */
 
@@ -190,3 +196,4 @@ int mrp_registrar_fsm(mrp_registrar_attribute_t * attrib,
 int mrp_decode_state(mrp_registrar_attribute_t * rattrib,
                     mrp_applicant_attribute_t * aattrib, char *str,
                     int strlen);
+void mrp_schedule_tx_event(void);
index 2959554..3d38a32 100644 (file)
@@ -84,6 +84,7 @@ enum {
        pkt_event_wpcap_timeout,
        pkt_event_localhost_timeout,
        app_event_kill_all,
+       tx_request_event,
        loop_time_tick
 };
 
@@ -94,7 +95,7 @@ int mvrp_enable;
 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;
@@ -722,6 +723,13 @@ int mrpd_reclaim()
 
 }
 
+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)
@@ -754,7 +762,8 @@ 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);
 
@@ -793,6 +802,11 @@ void process_events(void)
                        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 */
index dbb1d1c..e8b583d 100644 (file)
@@ -252,6 +252,9 @@ int msrp_event(int event, struct msrp_attribute *rattrib)
                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);
@@ -268,6 +271,9 @@ int msrp_event(int event, struct msrp_attribute *rattrib)
                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);
@@ -282,6 +288,9 @@ int msrp_event(int event, struct msrp_attribute *rattrib)
                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;
                }
@@ -306,6 +315,9 @@ int msrp_event(int event, struct msrp_attribute *rattrib)
                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;
index 827324b..cf453b3 100644 (file)
@@ -150,6 +150,9 @@ int mvrp_event(int event, struct mvrp_attribute *rattrib)
                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);
@@ -166,6 +169,9 @@ int mvrp_event(int event, struct mvrp_attribute *rattrib)
                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);
@@ -180,6 +186,9 @@ int mvrp_event(int event, struct mvrp_attribute *rattrib)
                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;
                }
@@ -204,6 +213,9 @@ int mvrp_event(int event, struct mvrp_attribute *rattrib)
                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;
@@ -233,6 +245,9 @@ int mvrp_event(int event, struct mvrp_attribute *rattrib)
                        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) {