@@ -2794,6 +2794,16 @@ static void _mdns_remove_scheduled_service_packets(mdns_service_t *service)
2794
2794
}
2795
2795
}
2796
2796
2797
+ static void _mdns_free_service_subtype (mdns_service_t * service )
2798
+ {
2799
+ while (service -> subtype ) {
2800
+ mdns_subtype_t * next = service -> subtype -> next ;
2801
+ free ((char * )service -> subtype -> subtype );
2802
+ free (service -> subtype );
2803
+ service -> subtype = next ;
2804
+ }
2805
+ }
2806
+
2797
2807
/**
2798
2808
* @brief free service memory
2799
2809
*
@@ -2815,12 +2825,7 @@ static void _mdns_free_service(mdns_service_t *service)
2815
2825
free ((char * )s -> value );
2816
2826
free (s );
2817
2827
}
2818
- while (service -> subtype ) {
2819
- mdns_subtype_t * next = service -> subtype -> next ;
2820
- free ((char * )service -> subtype -> subtype );
2821
- free (service -> subtype );
2822
- service -> subtype = next ;
2823
- }
2828
+ _mdns_free_service_subtype (service );
2824
2829
free (service );
2825
2830
}
2826
2831
@@ -6299,7 +6304,36 @@ esp_err_t mdns_service_txt_item_remove(const char *service, const char *proto, c
6299
6304
return mdns_service_txt_item_remove_for_host (NULL , service , proto , NULL , key );
6300
6305
}
6301
6306
6302
- esp_err_t mdns_service_subtype_add_for_host (const char * instance_name , const char * service , const char * proto ,
6307
+ static esp_err_t _mdns_service_subtype_remove_for_host (mdns_srv_item_t * service , const char * subtype )
6308
+ {
6309
+ esp_err_t ret = ESP_ERR_NOT_FOUND ;
6310
+ mdns_subtype_t * srv_subtype = service -> service -> subtype ;
6311
+ mdns_subtype_t * pre = service -> service -> subtype ;
6312
+ while (srv_subtype ) {
6313
+ if (strcmp (srv_subtype -> subtype , subtype ) == 0 ) {
6314
+ // Target subtype is found.
6315
+ if (srv_subtype == service -> service -> subtype ) {
6316
+ // The first node needs to be removed
6317
+ service -> service -> subtype = service -> service -> subtype -> next ;
6318
+ } else {
6319
+ pre -> next = srv_subtype -> next ;
6320
+ }
6321
+ free ((char * )srv_subtype -> subtype );
6322
+ free (srv_subtype );
6323
+ ret = ESP_OK ;
6324
+ break ;
6325
+ }
6326
+ pre = srv_subtype ;
6327
+ srv_subtype = srv_subtype -> next ;
6328
+ }
6329
+ if (ret == ESP_ERR_NOT_FOUND ) {
6330
+ ESP_LOGE (TAG , "Subtype : %s doesn't exist" , subtype );
6331
+ }
6332
+
6333
+ return ret ;
6334
+ }
6335
+
6336
+ esp_err_t mdns_service_subtype_remove_for_host (const char * instance_name , const char * service , const char * proto ,
6303
6337
const char * hostname , const char * subtype )
6304
6338
{
6305
6339
MDNS_SERVICE_LOCK ();
@@ -6310,30 +6344,125 @@ esp_err_t mdns_service_subtype_add_for_host(const char *instance_name, const cha
6310
6344
mdns_srv_item_t * s = _mdns_get_service_item_instance (instance_name , service , proto , hostname );
6311
6345
ESP_GOTO_ON_FALSE (s , ESP_ERR_NOT_FOUND , err , TAG , "Service doesn't exist" );
6312
6346
6313
- mdns_subtype_t * srv_subtype = s -> service -> subtype ;
6347
+ ret = _mdns_service_subtype_remove_for_host (s , subtype );
6348
+ ESP_GOTO_ON_ERROR (ret , err , TAG , "Failed to remove the subtype: %s" , subtype );
6349
+
6350
+ // TODO: Need to transmit a sendbye message for the removed subtype.
6351
+ // TODO: Need to remove this subtype answer from the scheduled answer list.
6352
+ err :
6353
+ MDNS_SERVICE_UNLOCK ();
6354
+ return ret ;
6355
+ }
6356
+
6357
+ static esp_err_t _mdns_service_subtype_add_for_host (mdns_srv_item_t * service , const char * subtype )
6358
+ {
6359
+ esp_err_t ret = ESP_OK ;
6360
+ mdns_subtype_t * srv_subtype = service -> service -> subtype ;
6314
6361
while (srv_subtype ) {
6315
- ESP_GOTO_ON_FALSE (strcmp (srv_subtype -> subtype , subtype ) != 0 , ESP_ERR_INVALID_ARG , err , TAG , "The same subtype has already been added" );
6362
+ ESP_GOTO_ON_FALSE (strcmp (srv_subtype -> subtype , subtype ) != 0 , ESP_ERR_INVALID_ARG , err , TAG , "Subtype: %s has already been added" , subtype );
6316
6363
srv_subtype = srv_subtype -> next ;
6317
6364
}
6318
6365
6319
- mdns_service_t * srv = s -> service ;
6320
6366
mdns_subtype_t * subtype_item = (mdns_subtype_t * )malloc (sizeof (mdns_subtype_t ));
6321
6367
ESP_GOTO_ON_FALSE (subtype_item , ESP_ERR_NO_MEM , out_of_mem , TAG , "Out of memory" );
6322
6368
subtype_item -> subtype = strdup (subtype );
6323
6369
ESP_GOTO_ON_FALSE (subtype_item -> subtype , ESP_ERR_NO_MEM , out_of_mem , TAG , "Out of memory" );
6324
- subtype_item -> next = srv -> subtype ;
6325
- srv -> subtype = subtype_item ;
6370
+ subtype_item -> next = service -> service -> subtype ;
6371
+ service -> service -> subtype = subtype_item ;
6326
6372
6327
6373
err :
6328
- MDNS_SERVICE_UNLOCK ();
6329
6374
return ret ;
6330
6375
out_of_mem :
6331
- MDNS_SERVICE_UNLOCK ();
6332
6376
HOOK_MALLOC_FAILED ;
6333
6377
free (subtype_item );
6334
6378
return ret ;
6335
6379
}
6336
6380
6381
+ esp_err_t mdns_service_subtype_add_multiple_items_for_host (const char * instance_name , const char * service , const char * proto ,
6382
+ const char * hostname , mdns_subtype_item_t subtype [], uint8_t num_items )
6383
+ {
6384
+ MDNS_SERVICE_LOCK ();
6385
+ esp_err_t ret = ESP_OK ;
6386
+ int cur_index = 0 ;
6387
+ ESP_GOTO_ON_FALSE (_mdns_server && _mdns_server -> services && !_str_null_or_empty (service ) && !_str_null_or_empty (proto ) &&
6388
+ (num_items > 0 ), ESP_ERR_INVALID_ARG , err , TAG , "Invalid state or arguments" );
6389
+
6390
+ mdns_srv_item_t * s = _mdns_get_service_item_instance (instance_name , service , proto , hostname );
6391
+ ESP_GOTO_ON_FALSE (s , ESP_ERR_NOT_FOUND , err , TAG , "Service doesn't exist" );
6392
+
6393
+ for (; cur_index < num_items ; cur_index ++ ) {
6394
+ ret = _mdns_service_subtype_add_for_host (s , subtype [cur_index ].subtype );
6395
+ if (ret == ESP_OK ) {
6396
+ continue ;
6397
+ } else if (ret == ESP_ERR_NO_MEM ) {
6398
+ ESP_LOGE (TAG , "Out of memory" );
6399
+ goto err ;
6400
+ } else {
6401
+ ESP_LOGE (TAG , "Failed to add subtype: %s" , subtype [cur_index ].subtype );
6402
+ goto exit ;
6403
+ }
6404
+ }
6405
+
6406
+ _mdns_announce_all_pcbs (& s , 1 , false);
6407
+ err :
6408
+ if (ret == ESP_ERR_NO_MEM ) {
6409
+ for (int idx = 0 ; idx < cur_index ; idx ++ ) {
6410
+ _mdns_service_subtype_remove_for_host (s , subtype [idx ].subtype );
6411
+ }
6412
+ }
6413
+ exit :
6414
+ MDNS_SERVICE_UNLOCK ();
6415
+ return ret ;
6416
+ }
6417
+
6418
+ esp_err_t mdns_service_subtype_add_for_host (const char * instance_name , const char * service_type , const char * proto ,
6419
+ const char * hostname , const char * subtype )
6420
+ {
6421
+ mdns_subtype_item_t _subtype [1 ];
6422
+ _subtype [0 ].subtype = subtype ;
6423
+ return mdns_service_subtype_add_multiple_items_for_host (instance_name , service_type , proto , hostname , _subtype , 1 );
6424
+ }
6425
+
6426
+ esp_err_t mdns_service_subtype_update_multiple_items_for_host (const char * instance_name , const char * service_type , const char * proto ,
6427
+ const char * hostname , mdns_subtype_item_t subtype [], uint8_t num_items )
6428
+ {
6429
+ MDNS_SERVICE_LOCK ();
6430
+ esp_err_t ret = ESP_OK ;
6431
+ int cur_index = 0 ;
6432
+ ESP_GOTO_ON_FALSE (_mdns_server && _mdns_server -> services && !_str_null_or_empty (service_type ) && !_str_null_or_empty (proto ) &&
6433
+ (num_items > 0 ), ESP_ERR_INVALID_ARG , err , TAG , "Invalid state or arguments" );
6434
+
6435
+ mdns_srv_item_t * s = _mdns_get_service_item_instance (instance_name , service_type , proto , hostname );
6436
+ ESP_GOTO_ON_FALSE (s , ESP_ERR_NOT_FOUND , err , TAG , "Service doesn't exist" );
6437
+
6438
+ // TODO: find subtype needs to say sendbye
6439
+ _mdns_free_service_subtype (s -> service );
6440
+
6441
+ for (; cur_index < num_items ; cur_index ++ ) {
6442
+ ret = _mdns_service_subtype_add_for_host (s , subtype [cur_index ].subtype );
6443
+ if (ret == ESP_OK ) {
6444
+ continue ;
6445
+ } else if (ret == ESP_ERR_NO_MEM ) {
6446
+ ESP_LOGE (TAG , "Out of memory" );
6447
+ goto err ;
6448
+ } else {
6449
+ ESP_LOGE (TAG , "Failed to add subtype: %s" , subtype [cur_index ].subtype );
6450
+ goto exit ;
6451
+ }
6452
+ }
6453
+
6454
+ _mdns_announce_all_pcbs (& s , 1 , false);
6455
+ err :
6456
+ if (ret == ESP_ERR_NO_MEM ) {
6457
+ for (int idx = 0 ; idx < cur_index ; idx ++ ) {
6458
+ _mdns_service_subtype_remove_for_host (s , subtype [idx ].subtype );
6459
+ }
6460
+ }
6461
+ exit :
6462
+ MDNS_SERVICE_UNLOCK ();
6463
+ return ret ;
6464
+ }
6465
+
6337
6466
esp_err_t mdns_service_instance_name_set_for_host (const char * instance_old , const char * service , const char * proto , const char * host ,
6338
6467
const char * instance )
6339
6468
{
0 commit comments