• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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 package com.android.server.connectivity.mdns.internal;
18 
19 import android.annotation.NonNull;
20 import android.net.LinkAddress;
21 import android.os.Handler;
22 import android.system.OsConstants;
23 import android.util.Log;
24 
25 import com.android.net.module.util.SharedLog;
26 import com.android.net.module.util.ip.NetlinkMonitor;
27 import com.android.net.module.util.netlink.NetlinkConstants;
28 import com.android.net.module.util.netlink.NetlinkMessage;
29 import com.android.net.module.util.netlink.RtNetlinkAddressMessage;
30 import com.android.net.module.util.netlink.StructIfaddrMsg;
31 import com.android.server.connectivity.mdns.AbstractSocketNetlink;
32 import com.android.server.connectivity.mdns.MdnsSocketProvider;
33 
34 /**
35  * The netlink monitor for MdnsSocketProvider.
36  */
37 public class SocketNetlinkMonitor extends NetlinkMonitor implements AbstractSocketNetlink {
38 
39     public static final String TAG = SocketNetlinkMonitor.class.getSimpleName();
40 
41     @NonNull
42     private final MdnsSocketProvider.NetLinkMonitorCallBack mCb;
SocketNetlinkMonitor(@onNull final Handler handler, @NonNull SharedLog log, @NonNull final MdnsSocketProvider.NetLinkMonitorCallBack cb)43     public SocketNetlinkMonitor(@NonNull final Handler handler,
44             @NonNull SharedLog log,
45             @NonNull final MdnsSocketProvider.NetLinkMonitorCallBack cb) {
46         super(handler, log, TAG, OsConstants.NETLINK_ROUTE,
47                 NetlinkConstants.RTMGRP_IPV4_IFADDR | NetlinkConstants.RTMGRP_IPV6_IFADDR);
48         mCb = cb;
49     }
50     @Override
processNetlinkMessage(NetlinkMessage nlMsg, long whenMs)51     public void processNetlinkMessage(NetlinkMessage nlMsg, long whenMs) {
52         if (nlMsg instanceof RtNetlinkAddressMessage) {
53             processRtNetlinkAddressMessage((RtNetlinkAddressMessage) nlMsg);
54         }
55     }
56 
57     /**
58      * Process the RTM_NEWADDR and RTM_DELADDR netlink message.
59      */
processRtNetlinkAddressMessage(RtNetlinkAddressMessage msg)60     private void processRtNetlinkAddressMessage(RtNetlinkAddressMessage msg) {
61         final StructIfaddrMsg ifaddrMsg = msg.getIfaddrHeader();
62         final LinkAddress la = new LinkAddress(msg.getIpAddress(), ifaddrMsg.prefixLen,
63                 msg.getFlags(), ifaddrMsg.scope);
64         if (!la.isPreferred()) {
65             // Skip the unusable ip address.
66             return;
67         }
68         switch (msg.getHeader().nlmsg_type) {
69             case NetlinkConstants.RTM_NEWADDR:
70                 mCb.addOrUpdateInterfaceAddress(ifaddrMsg.index, la);
71                 break;
72             case NetlinkConstants.RTM_DELADDR:
73                 mCb.deleteInterfaceAddress(ifaddrMsg.index, la);
74                 break;
75             default:
76                 Log.e(TAG, "Unknown rtnetlink address msg type " + msg.getHeader().nlmsg_type);
77         }
78     }
79 
80     @Override
isSupported()81     public boolean isSupported() {
82         return true;
83     }
84 
85     @Override
startMonitoring()86     public void startMonitoring() {
87         this.start();
88     }
89 
90     @Override
stopMonitoring()91     public void stopMonitoring() {
92         this.stop();
93     }
94 }
95