@@ -151,12 +151,29 @@ static inline void remove_preencoded(seqtracker_thread_data_t *seqdata,
151151
152152}
153153
154+ static inline void preencode_etsi_fields (seqtracker_thread_data_t * seqdata ,
155+ exporter_intercept_state_t * intstate ) {
156+
157+ etsili_intercept_details_t intdetails ;
158+
159+ intdetails .liid = intstate -> details .liid ;
160+ intdetails .authcc = intstate -> details .authcc ;
161+ intdetails .delivcc = intstate -> details .delivcc ;
162+
163+ intdetails .operatorid = seqdata -> colident -> operatorid ;
164+ intdetails .networkelemid = seqdata -> colident -> networkelemid ;
165+ intdetails .intpointid = seqdata -> colident -> intpointid ;
166+
167+ intstate -> preencoded = calloc (OPENLI_PREENCODE_LAST ,
168+ sizeof (wandder_encode_job_t ));
169+ etsili_preencode_static_fields (intstate -> preencoded , & intdetails );
170+ }
171+
154172
155173static void track_new_intercept (seqtracker_thread_data_t * seqdata ,
156174 published_intercept_msg_t * cept ) {
157175
158176 exporter_intercept_state_t * intstate ;
159- etsili_intercept_details_t intdetails ;
160177
161178 /* If this LIID already exists, we'll need to replace it */
162179 HASH_FIND (hh , seqdata -> intercepts , cept -> liid , strlen (cept -> liid ),
@@ -173,6 +190,7 @@ static void track_new_intercept(seqtracker_thread_data_t *seqdata,
173190 intstate -> details .liid_len = strlen (cept -> liid );
174191 intstate -> details .authcc_len = strlen (cept -> authcc );
175192 intstate -> details .delivcc_len = strlen (cept -> delivcc );
193+ intstate -> version ++ ;
176194
177195 } else {
178196
@@ -186,47 +204,25 @@ static void track_new_intercept(seqtracker_thread_data_t *seqdata,
186204 intstate -> details .authcc_len = strlen (cept -> authcc );
187205 intstate -> details .delivcc_len = strlen (cept -> delivcc );
188206 intstate -> cinsequencing = NULL ;
207+ intstate -> version = 0 ;
189208
190209 HASH_ADD_KEYPTR (hh , seqdata -> intercepts , intstate -> details .liid ,
191210 intstate -> details .liid_len , intstate );
192211 }
193212
194- intdetails .liid = cept -> liid ;
195- intdetails .authcc = cept -> authcc ;
196- intdetails .delivcc = cept -> delivcc ;
197-
198- intdetails .operatorid = seqdata -> colident -> operatorid ;
199- intdetails .networkelemid = seqdata -> colident -> networkelemid ;
200- intdetails .intpointid = seqdata -> colident -> intpointid ;
201-
202- if (seqdata -> encoding_method == OPENLI_ENCODING_DER ){
203- intstate -> preencoded = calloc (OPENLI_PREENCODE_LAST ,
204- sizeof (wandder_encode_job_t ));
205- etsili_preencode_static_fields (intstate -> preencoded , & intdetails );
206- }
213+ preencode_etsi_fields (seqdata , intstate );
207214}
208215
209216static void reconfigure_intercepts (seqtracker_thread_data_t * seqdata ) {
210217
211218 exporter_intercept_state_t * intstate , * tmp ;
212- etsili_intercept_details_t intdetails ;
213219
214220 logger (LOG_INFO , "OpenLI configuration reloaded -- updating pre-encoded intercept fields" );
215221
216222 HASH_ITER (hh , seqdata -> intercepts , intstate , tmp ) {
217223 remove_preencoded (seqdata , intstate );
218-
219- intdetails .liid = intstate -> details .liid ;
220- intdetails .authcc = intstate -> details .authcc ;
221- intdetails .delivcc = intstate -> details .delivcc ;
222-
223- intdetails .operatorid = seqdata -> colident -> operatorid ;
224- intdetails .networkelemid = seqdata -> colident -> networkelemid ;
225- intdetails .intpointid = seqdata -> colident -> intpointid ;
226-
227- intstate -> preencoded = calloc (OPENLI_PREENCODE_LAST ,
228- sizeof (wandder_encode_job_t ));
229- etsili_preencode_static_fields (intstate -> preencoded , & intdetails );
224+ preencode_etsi_fields (seqdata , intstate );
225+ intstate -> version ++ ;
230226 }
231227
232228}
@@ -241,6 +237,39 @@ static inline void free_intercept_state(seqtracker_thread_data_t *seqdata,
241237 free (intstate );
242238}
243239
240+ static int modify_tracked_intercept (seqtracker_thread_data_t * seqdata ,
241+ published_intercept_msg_t * msg ) {
242+
243+ exporter_intercept_state_t * intstate ;
244+ HASH_FIND (hh , seqdata -> intercepts , msg -> liid , strlen (msg -> liid ), intstate );
245+ etsili_intercept_details_t intdetails ;
246+
247+ if (!intstate ) {
248+ logger (LOG_INFO , "OpenLI collector: tracker thread was told to modify intercept LIID %s, but it is not a valid ID?" ,
249+ msg -> liid );
250+ return -1 ;
251+ }
252+
253+ if (intstate -> details .authcc ) {
254+ free (intstate -> details .authcc );
255+ }
256+ intstate -> details .authcc = msg -> authcc ;
257+
258+ if (intstate -> details .delivcc ) {
259+ free (intstate -> details .delivcc );
260+ }
261+ intstate -> details .delivcc = msg -> delivcc ;
262+
263+ remove_preencoded (seqdata , intstate );
264+ preencode_etsi_fields (seqdata , intstate );
265+ intstate -> version ++ ;
266+
267+ if (msg -> liid ) {
268+ free (msg -> liid );
269+ }
270+ return 0 ;
271+ }
272+
244273static int remove_tracked_intercept (seqtracker_thread_data_t * seqdata ,
245274 published_intercept_msg_t * msg ) {
246275
@@ -253,10 +282,9 @@ static int remove_tracked_intercept(seqtracker_thread_data_t *seqdata,
253282 return -1 ;
254283 }
255284
256- /*
257- logger(LOG_INFO, "OpenLI collector: tracker thread %d removed intercept %s",
258- seqdata->trackerid, msg->liid);
259- */
285+ /* TODO All encoders need to know that they should clear all templates
286+ * for this particular intercept, somehow?
287+ */
260288 HASH_DELETE (hh , seqdata -> intercepts , intstate );
261289 if (msg -> liid ) {
262290 free (msg -> liid );
@@ -322,6 +350,7 @@ static int run_encoding_job(seqtracker_thread_data_t *seqdata,
322350 job .liid = strdup (liid );
323351 job .cinstr = strdup (cinseq -> cin_string );
324352 job .cin = (int64_t )cin ;
353+ job .cept_version = intstate -> version ;
325354
326355 if (recvd -> type == OPENLI_EXPORT_IPMMCC ||
327356 recvd -> type == OPENLI_EXPORT_IPCC ||
@@ -393,6 +422,11 @@ static void seqtracker_main(seqtracker_thread_data_t *seqdata) {
393422 free (job );
394423 break ;
395424
425+ case OPENLI_EXPORT_INTERCEPT_CHANGED :
426+ modify_tracked_intercept (seqdata , & (job -> data .cept ));
427+ free (job );
428+ break ;
429+
396430 case OPENLI_EXPORT_IPMMCC :
397431 case OPENLI_EXPORT_IPMMIRI :
398432 case OPENLI_EXPORT_IPIRI :
0 commit comments