@@ -45,11 +45,21 @@ static void ws_eapol_relay_mpx_data_confirm(const mpx_api_t* api, const struct m
45
45
static void ws_eapol_relay_mpx_data_indication (const mpx_api_t * api , const struct mcps_data_ind_s * data );
46
46
static void ws_eapol_relay_data_request_primitiv_set (mcps_data_req_t * dataReq , protocol_interface_info_entry_t * cur );
47
47
48
+ typedef struct {
49
+ uint8_t handle ;
50
+ void * data_ptr ;
51
+ ns_list_link_t link ;
52
+ } eapol_relay_msdu_entry_t ;
53
+
54
+ typedef NS_LIST_HEAD (eapol_relay_msdu_entry_t , link ) eapol_relay_msdu_list_t ;
55
+
48
56
typedef struct {
49
57
protocol_interface_info_entry_t * interface_ptr ; /**< List link entry */
50
58
int8_t relay_socket_id ; /**< Socket ID for relay */
51
59
mpx_api_t * mpx_api ; /**< mpx api */
52
60
uint16_t mpx_user_id ; /**< mpx user identifier */
61
+ eapol_relay_msdu_list_t msdu_list ; /**< msdu list */
62
+ uint8_t msdu_handle ; /**< msdu handle */
53
63
} eapol_relay_data_t ;
54
64
55
65
static eapol_relay_data_t * eapol_relay_data ;
@@ -61,6 +71,8 @@ void ws_eapol_relay_init(protocol_interface_info_entry_t *cur)
61
71
}
62
72
eapol_relay_data -> interface_ptr = cur ;
63
73
eapol_relay_data -> relay_socket_id = socket_open (IPV6_NH_UDP , 10253 , & ws_eapol_relay_socket_cb );
74
+ ns_list_init (& eapol_relay_data -> msdu_list );
75
+ eapol_relay_data -> msdu_handle = 0 ;
64
76
}
65
77
66
78
static void ws_eapol_relay_socket_cb (void * cb )
@@ -82,14 +94,20 @@ static void ws_eapol_relay_socket_cb(void *cb)
82
94
return ;
83
95
}
84
96
85
- memcpy (data_request .DstAddr , pdu -> eui_64 , 8 );
97
+ eapol_relay_msdu_entry_t * msdu_entry = ns_dyn_mem_temporary_alloc (sizeof (eapol_relay_msdu_entry_t ));
98
+ if (!msdu_entry ) {
99
+ ns_dyn_mem_free (pdu );
100
+ return ;
101
+ }
102
+ msdu_entry -> data_ptr = pdu ;
103
+ msdu_entry -> handle = eapol_relay_data -> msdu_handle ++ ;
104
+ ns_list_add_to_start (& eapol_relay_data -> msdu_list , msdu_entry );
86
105
87
- data_request .msdu = & (pdu -> kmp_id );
106
+ memcpy (data_request .DstAddr , pdu -> eui_64 , 8 );
107
+ data_request .msdu = & pdu -> kmp_id ;
88
108
data_request .msduLength = cb_data -> d_len - 8 ;
89
109
90
110
eapol_relay_data -> mpx_api -> mpx_data_request (eapol_relay_data -> mpx_api , & data_request , eapol_relay_data -> mpx_user_id );
91
-
92
- ns_dyn_mem_free (pdu );
93
111
}
94
112
95
113
static void ws_eapol_relay_data_request_primitiv_set (mcps_data_req_t * dataReq , protocol_interface_info_entry_t * cur )
@@ -116,8 +134,20 @@ int8_t ws_eapol_relay_mpx_register(struct mpx_api_s *mpx_api, uint16_t mpx_user_
116
134
117
135
static void ws_eapol_relay_mpx_data_confirm (const mpx_api_t * api , const struct mcps_data_conf_s * data )
118
136
{
119
- (void ) api ;
120
- (void ) data ;
137
+ (void ) api ;
138
+
139
+ if (!eapol_relay_data ) {
140
+ return ;
141
+ }
142
+
143
+ ns_list_foreach (eapol_relay_msdu_entry_t , msdu , & eapol_relay_data -> msdu_list ) {
144
+ if (msdu -> handle == data -> msduHandle ) {
145
+ ns_dyn_mem_free (msdu -> data_ptr );
146
+ ns_list_remove (& eapol_relay_data -> msdu_list , msdu );
147
+ ns_dyn_mem_free (msdu );
148
+ return ;
149
+ }
150
+ }
121
151
}
122
152
123
153
static void ws_eapol_relay_mpx_data_indication (const mpx_api_t * api , const struct mcps_data_ind_s * data )
0 commit comments