1 /* 2 * Copyright (C) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef MDNS_MANAGER_H 17 #define MDNS_MANAGER_H 18 19 #include <any> 20 #include <list> 21 #include <set> 22 #include <string> 23 24 #include "i_mdns_event.h" 25 #include "mdns_common.h" 26 #include "mdns_packet_parser.h" 27 #include "mdns_socket_listener.h" 28 29 namespace OHOS { 30 namespace NetManagerStandard { 31 32 struct MDnsConfig { 33 bool ipv6Support = false; 34 int configAllIface = true; 35 int configLo = true; 36 std::string topDomain = MDNS_TOP_DOMAIN_DEFAULT; 37 std::string hostname; 38 }; 39 40 class MDnsProtocolImpl { 41 public: 42 MDnsProtocolImpl(); 43 ~MDnsProtocolImpl() = default; 44 45 struct Result; 46 using TxtRecord = std::map<std::string, std::vector<uint8_t>>; 47 using Task = std::function<bool()>; 48 49 enum class State { 50 DEAD, 51 ADD, 52 LIVE, 53 REFRESH, 54 REMOVE, 55 }; 56 57 struct Result { 58 std::string serviceName; 59 std::string serviceType; 60 std::string domain; 61 int port = -1; 62 bool ipv6 = false; 63 std::string addr; 64 TxtRecordEncoded txt; 65 State state = State::DEAD; 66 uint32_t ttl = 0; 67 int64_t refrehTime = -1; 68 int32_t err = NETMANAGER_EXT_SUCCESS; 69 }; 70 71 void SetConfig(const MDnsConfig &config); 72 bool Browse(); 73 const MDnsConfig &GetConfig() const; 74 75 int32_t Register(const Result &info); 76 int32_t Discovery(const std::string &serviceType, const sptr<IDiscoveryCallback> &cb); 77 int32_t ResolveInstance(const std::string &instance, const sptr<IResolveCallback> &cb); 78 79 int32_t UnRegister(const std::string &key); 80 int32_t StopCbMap(const std::string &key); 81 82 void AddTask(const Task &task, bool atonce = true); 83 void AddEvent(const std::string &key, const Task &task); 84 85 void Init(); 86 int32_t Announce(const Result &info, bool off); 87 void ReceivePacket(int sock, const MDnsPayload &payload); 88 void RunTaskQueue(std::list<Task> &queue); 89 void ProcessQuestion(int sock, const MDnsMessage &msg); 90 void ProcessQuestionRecord(const std::any &anyAddr, const DNSProto::RRType &anyAddrType, 91 const DNSProto::Question &qu, int &phase, MDnsMessage &response); 92 void ProcessAnswer(int sock, const MDnsMessage &msg); 93 void ProcessAnswerRecord(bool v6, const DNSProto::ResourceRecord &rr, std::set<std::string> &changed); 94 void UpdatePtr(bool v6, const DNSProto::ResourceRecord &rr, std::set<std::string> &changed); 95 void UpdateSrv(bool v6, const DNSProto::ResourceRecord &rr, std::set<std::string> &changed); 96 void UpdateTxt(bool v6, const DNSProto::ResourceRecord &rr, std::set<std::string> &changed); 97 void UpdateAddr(bool v6, const DNSProto::ResourceRecord &rr, std::set<std::string> &changed); 98 void AppendRecord(std::vector<DNSProto::ResourceRecord> &rrlist, DNSProto::RRType type, const std::string &name, 99 const std::any &rdata); 100 101 bool ResolveInstanceFromCache(const std::string &name, const sptr<IResolveCallback> &cb); 102 bool ResolveInstanceFromNet(const std::string &name, const sptr<IResolveCallback> &cb); 103 bool ResolveFromCache(const std::string &domain, const sptr<IResolveCallback> &cb); 104 bool ResolveFromNet(const std::string &domain, const sptr<IResolveCallback> &cb); 105 bool DiscoveryFromCache(const std::string &serviceType, const sptr<IDiscoveryCallback> &cb); 106 bool DiscoveryFromNet(const std::string &serviceType, const sptr<IDiscoveryCallback> &cb); 107 bool IsCacheAvailable(const std::string &key); 108 bool IsDomainCacheAvailable(const std::string &key); 109 bool IsInstanceCacheAvailable(const std::string &key); 110 bool IsBrowserAvailable(const std::string &key); 111 void KillCache(const std::string &key); 112 MDnsServiceInfo ConvertResultToInfo(const Result &result); 113 114 std::string Decorated(const std::string &name) const; 115 std::string Dotted(const std::string &name) const; 116 std::string UnDotted(const std::string &name) const; 117 std::string GetHostDomain(); 118 119 private: 120 void handleOfflineService(const std::string &key, std::vector<Result> &res); 121 void KillBrowseCache(const std::string &key, std::vector<Result>::iterator &it); 122 123 int32_t ConnectControl(int32_t sockfd, sockaddr* serverAddr); 124 bool IsConnectivity(const std::string &ip, int32_t port); 125 126 public: 127 std::map<std::string, Result> srvMap_; 128 129 private: 130 int64_t lastRunTime = {-1}; 131 MDnsConfig config_; 132 MDnsSocketListener listener_; 133 std::map<std::string, std::vector<Result>> browserMap_; 134 std::map<std::string, Result> cacheMap_; 135 std::recursive_mutex mutex_; 136 std::list<Task> taskQueue_; 137 std::map<std::string, std::list<Task>> taskOnChange_; 138 std::map<std::string, sptr<IDiscoveryCallback>> nameCbMap_; 139 }; 140 } // namespace NetManagerStandard 141 } // namespace OHOS 142 #endif 143