1d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran/*
2d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * Copyright (C) 2014 The Android Open Source Project
3d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran *
4d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * Licensed under the Apache License, Version 2.0 (the "License");
5d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * you may not use this file except in compliance with the License.
6d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * You may obtain a copy of the License at
7d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran *
8d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran *      http://www.apache.org/licenses/LICENSE-2.0
9d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran *
10d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * Unless required by applicable law or agreed to in writing, software
11d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * distributed under the License is distributed on an "AS IS" BASIS,
12d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * See the License for the specific language governing permissions and
14d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran * limitations under the License.
15d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran */
16d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran
17f4cfad361175a7f9ccf4d41e76a9b289c3c3da22Sreeram Ramachandran#ifndef NETD_INCLUDE_FWMARK_COMMAND_H
18f4cfad361175a7f9ccf4d41e76a9b289c3c3da22Sreeram Ramachandran#define NETD_INCLUDE_FWMARK_COMMAND_H
19d736d4b327bf35afc59b5cec110491fcdb9e2cbbSreeram Ramachandran
204b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski#include <arpa/inet.h>
214b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski#include <sys/socket.h>
22a69d9472ac48d4e09f049fb740e60b7217e03861Sreeram Ramachandran#include <sys/types.h>
23a69d9472ac48d4e09f049fb740e60b7217e03861Sreeram Ramachandran
244b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski// Additional information sent with ON_CONNECT_COMPLETE command
254b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinskistruct FwmarkConnectInfo {
26794c5c714a4d4cf169769ec956845a6fb24e7ebcHugo Benichi    int error;
274b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski    unsigned latencyMs;
284b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski    union {
294b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        sockaddr s;
304b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        sockaddr_in sin;
314b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        sockaddr_in6 sin6;
324b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski    } addr;
334b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski
344b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski    FwmarkConnectInfo() {}
354b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski
36794c5c714a4d4cf169769ec956845a6fb24e7ebcHugo Benichi    FwmarkConnectInfo(const int connectErrno, const unsigned latency, const sockaddr* saddr) {
37794c5c714a4d4cf169769ec956845a6fb24e7ebcHugo Benichi        error = connectErrno;
384b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        latencyMs = latency;
394b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        if (saddr->sa_family == AF_INET) {
404b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski            addr.sin = *((struct sockaddr_in*) saddr);
414b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        } else if (saddr->sa_family == AF_INET6) {
424b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski            addr.sin6 = *((struct sockaddr_in6*) saddr);
434b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        } else {
444b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski            // Cannot happen because we only call this if shouldSetFwmark returns true, and thus
454b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski            // the address family is one we understand.
464b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski            addr.s.sa_family = AF_UNSPEC;
474b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        }
484b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski    }
494b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski};
504b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski
51f4cfad361175a7f9ccf4d41e76a9b289c3c3da22Sreeram Ramachandran// Commands sent from clients to the fwmark server to mark sockets (i.e., set their SO_MARK).
524b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski// ON_CONNECT_COMPLETE command should be accompanied by FwmarkConnectInfo which should  contain
534b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski// info about that connect attempt
54efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandranstruct FwmarkCommand {
55efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran    enum {
56efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran        ON_ACCEPT,
57efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran        ON_CONNECT,
58efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran        SELECT_NETWORK,
59efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran        PROTECT_FROM_VPN,
60a69d9472ac48d4e09f049fb740e60b7217e03861Sreeram Ramachandran        SELECT_FOR_USER,
61d1df597001aadd5d83c9a3d1fe8bbde2bc9256caPaul Jensen        QUERY_USER_ACCESS,
624b9b78aa02336de9291e5085401cef44c03c3bbaMichal Karpinski        ON_CONNECT_COMPLETE,
63efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran    } cmdId;
64efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran    unsigned netId;  // used only in the SELECT_NETWORK command; ignored otherwise.
65d1df597001aadd5d83c9a3d1fe8bbde2bc9256caPaul Jensen    uid_t uid;  // used only in the SELECT_FOR_USER and QUERY_USER_ACCESS commands;
66d1df597001aadd5d83c9a3d1fe8bbde2bc9256caPaul Jensen                // ignored otherwise.
67efbe05d203f2f1cc3c24ddc111be159a1ff1f292Sreeram Ramachandran};
68f4cfad361175a7f9ccf4d41e76a9b289c3c3da22Sreeram Ramachandran
69f4cfad361175a7f9ccf4d41e76a9b289c3c3da22Sreeram Ramachandran#endif  // NETD_INCLUDE_FWMARK_COMMAND_H
70