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