00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "nip_init.h"
00033 #include "app/dns_sd.h"
00034 #include "app/mdns.h"
00035 #include "mem.h"
00036 #include "nip_error.h"
00037
00038 #if ( NIP_DNSSD_ENABLE == 1 )
00039
00040 extern nip_mdns_namestring_id_t nip_mdns_domain;
00041 extern nip_mdns_cache_id_t nip_mdns_hostname;
00042 extern nip_mem_ptr_t nip_mdns_cache;
00043
00044
00045
00046 struct nip_dnssd_service nip_dnssd_services[NIP_DNSSD_MAX_SERVICES];
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 nip_dnssd_id_t nip_dnssd_register( nip_mem_ptr_t *instance, nip_mem_ptr_t *service, nip_mem_ptr_t *txt, nip_mem_size_t txtlen, uint16_t port, uint16_t priority, uint16_t weight )
00069 {
00070 nip_dnssd_id_t res = NIP_DNSSD_NO_SERVICE;
00071 nip_dnssd_id_t new_id = 1;
00072 nip_error_t err;
00073 struct nip_dnssd_service *srv;
00074 struct nip_mdns_record rec;
00075 struct nip_mdns_cache *cache;
00076 nip_mem_ptr_t txt_str_ptr;
00077
00078
00079
00080 srv = &nip_dnssd_services[0];
00081
00082
00083 if ( nip_mdns_hostname == NIP_MDNS_NO_CACHE_ID )
00084 {
00085 nip_error = NIP_E_NOT_CONFIGURED;
00086 goto quit;
00087 }
00088
00089 if ( srv->id != NIP_DNSSD_NO_SERVICE )
00090 {
00091 nip_error = NIP_E_OUT_OF_RESSOURCES;
00092 goto quit;
00093 }
00094
00095
00096 rec.name.part[0] = NIP_MDNS_REG_STRING( instance);
00097 if ( rec.name.part[0] == NIP_MDNS_NO_NAMESTRING )
00098 goto quit;
00099 NIP_MDNS_REG_NAME( &rec.name.part[1], 2, service );
00100 if ( rec.name.part[1] == NIP_MDNS_NO_NAMESTRING
00101 || rec.name.part[2] == NIP_MDNS_NO_NAMESTRING )
00102 goto release_name;
00103 rec.name.part[3] = nip_mdns_domain;
00104 #if NIP_MDNS_MAX_NAME_DEPTH > 4
00105 rec.name.part[4] = NIP_MDNS_NO_NAMESTRING;
00106 #endif
00107
00108
00109 txt_str_ptr.id = nip_mem_alloc( txtlen, txtlen, 0, NULL );
00110 if ( txt_str_ptr.id == NIP_MEM_NULL)
00111 goto release_name;
00112 txt_str_ptr.ptr = (void*)0;
00113 nip_mem_insert( &txt_str_ptr, txt, txtlen );
00114
00115 cache = nip_mdns_cache_ptr( nip_mdns_hostname );
00116 if ( cache == NULL )
00117 {
00118 nip_error = NIP_E_INTERNAL_ERROR;
00119 goto release_name;
00120 }
00121
00122 nip_memcpy( &rec.data.srv.target, &cache->record.name, sizeof( struct nip_mdns_name ) );
00123 rec.data.srv.weight = weight;
00124 rec.data.srv.priority = priority;
00125 rec.data.srv.port = port;
00126 rec.ttl = NIP_MDNS_DEFAULT_TTL_A;
00127 rec.type = NIP_MDNS_TYPE_SRV;
00128 nip_mem_release_block( nip_mdns_cache.id );
00129
00130 if ( (err = NIP_MDNS_REGISTER( &srv->srv_rr, &rec )) != NIP_E_OK )
00131 {
00132 nip_error = err;
00133 goto release_name;
00134 }
00135
00136
00137
00138 rec.ttl = NIP_MDNS_DEFAULT_TTL;
00139 rec.type = NIP_MDNS_TYPE_TXT;
00140 rec.data.oth.string = txt_str_ptr.id;
00141 if ( (err = NIP_MDNS_REGISTER( &srv->txt_rr, &rec )) != NIP_E_OK )
00142 {
00143 NIP_MDNS_UNREGISTER( &srv->srv_rr );
00144 nip_error = err;
00145 goto release_name;
00146 }
00147
00148
00149 nip_memcpy( &rec.data.ptr.name, &rec.name, sizeof( struct nip_mdns_name ) );
00150 rec.name.part[0] = rec.name.part[1];
00151 rec.name.part[1] = rec.name.part[2];
00152 rec.name.part[2] = rec.name.part[3];
00153 rec.name.part[3] = rec.name.part[4];
00154 rec.ttl = NIP_MDNS_DEFAULT_TTL_A;
00155 rec.type = NIP_MDNS_TYPE_PTR;
00156 if ( (err = NIP_MDNS_REGISTER( &srv->ptr_rr, &rec )) != NIP_E_OK )
00157 {
00158 NIP_MDNS_UNREGISTER( &srv->srv_rr );
00159 NIP_MDNS_UNREGISTER( &srv->txt_rr );
00160 nip_error = err;
00161 goto release_name;
00162 }
00163
00164 srv->id = new_id;
00165 res = new_id;
00166
00167
00168
00169 release_name:
00170 NIP_MDNS_UNREG_NAME( rec.name.part, 3 );
00171
00172 quit:
00173 return res;
00174 }
00175
00176 #endif