1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "Generic.h"
18 
19 #include "Ctrl.h"
20 #include "Unknown.h"
21 
22 namespace android::nl::protocols::generic {
23 
Generic()24 Generic::Generic()
25     : NetlinkProtocol(NETLINK_GENERIC, "GENERIC", {std::make_shared<Ctrl>(mFamilyRegister)}) {}
26 
getMessageDescriptor(nlmsgtype_t nlmsg_type)27 const std::optional<std::reference_wrapper<MessageDescriptor>> Generic::getMessageDescriptor(
28         nlmsgtype_t nlmsg_type) {
29     auto desc = NetlinkProtocol::getMessageDescriptor(nlmsg_type);
30     if (desc.has_value()) return desc;
31 
32     auto it = mFamilyRegister.find(nlmsg_type);
33     if (it != mFamilyRegister.end()) return *it->second;
34     return *(mFamilyRegister[nlmsg_type] = std::make_shared<Unknown>(nlmsg_type));
35 }
36 
37 }  // namespace android::nl::protocols::generic
38