Loading automotive/can/1.0/default/libnetdevice/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ cc_library_static { "NetlinkSocket.cpp", "can.cpp", "common.cpp", "ethtool.cpp", "ifreqs.cpp", "libnetdevice.cpp", "printer.cpp", "vlan.cpp", Loading automotive/can/1.0/default/libnetdevice/common.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ namespace android::netdevice { socketparams::Params socketparams::current = general; unsigned int nametoindex(const std::string& ifname) { const auto ifidx = if_nametoindex(ifname.c_str()); if (ifidx != 0) return ifidx; Loading automotive/can/1.0/default/libnetdevice/common.h +18 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,28 @@ #include "nlbuf.h" #include <linux/can.h> #include <net/if.h> #include <string> namespace android::netdevice { namespace socketparams { struct Params { int domain; int type; int protocol; }; constexpr Params general = {AF_INET, SOCK_DGRAM, 0}; constexpr Params can = {PF_CAN, SOCK_RAW, CAN_RAW}; extern Params current; } // namespace socketparams /** * Returns the index of a given network interface. * Loading automotive/can/1.0/default/libnetdevice/ethtool.cpp 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <libnetdevice/ethtool.h> #include "ifreqs.h" #include <linux/ethtool.h> namespace android::netdevice::ethtool { std::optional<uint32_t> getValue(const std::string& ifname, uint32_t command) { struct ethtool_value valueop = {}; valueop.cmd = command; auto ifr = ifreqs::fromName(ifname); ifr.ifr_data = &valueop; if (!ifreqs::send(SIOCETHTOOL, ifr)) return std::nullopt; return valueop.data; } bool setValue(const std::string& ifname, uint32_t command, uint32_t value) { struct ethtool_value valueop = {}; valueop.cmd = command; valueop.data = value; auto ifr = ifreqs::fromName(ifname); ifr.ifr_data = &valueop; return ifreqs::send(SIOCETHTOOL, ifr); } } // namespace android::netdevice::ethtool automotive/can/1.0/default/libnetdevice/ifreqs.cpp 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ifreqs.h" #include "common.h" #include <android-base/logging.h> #include <android-base/unique_fd.h> namespace android::netdevice::ifreqs { bool send(unsigned long request, struct ifreq& ifr) { base::unique_fd sock(socket(socketparams::current.domain, socketparams::current.type, socketparams::current.protocol)); if (!sock.ok()) { LOG(ERROR) << "Can't create socket"; return false; } if (ioctl(sock.get(), request, &ifr) < 0) { PLOG(ERROR) << "ioctl(" << std::hex << request << std::dec << ") failed"; return false; } return true; } struct ifreq fromName(const std::string& ifname) { struct ifreq ifr = {}; strlcpy(ifr.ifr_name, ifname.c_str(), IF_NAMESIZE); return ifr; } } // namespace android::netdevice::ifreqs Loading
automotive/can/1.0/default/libnetdevice/Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -35,6 +35,8 @@ cc_library_static { "NetlinkSocket.cpp", "can.cpp", "common.cpp", "ethtool.cpp", "ifreqs.cpp", "libnetdevice.cpp", "printer.cpp", "vlan.cpp", Loading
automotive/can/1.0/default/libnetdevice/common.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,8 @@ namespace android::netdevice { socketparams::Params socketparams::current = general; unsigned int nametoindex(const std::string& ifname) { const auto ifidx = if_nametoindex(ifname.c_str()); if (ifidx != 0) return ifidx; Loading
automotive/can/1.0/default/libnetdevice/common.h +18 −0 Original line number Diff line number Diff line Loading @@ -18,10 +18,28 @@ #include "nlbuf.h" #include <linux/can.h> #include <net/if.h> #include <string> namespace android::netdevice { namespace socketparams { struct Params { int domain; int type; int protocol; }; constexpr Params general = {AF_INET, SOCK_DGRAM, 0}; constexpr Params can = {PF_CAN, SOCK_RAW, CAN_RAW}; extern Params current; } // namespace socketparams /** * Returns the index of a given network interface. * Loading
automotive/can/1.0/default/libnetdevice/ethtool.cpp 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <libnetdevice/ethtool.h> #include "ifreqs.h" #include <linux/ethtool.h> namespace android::netdevice::ethtool { std::optional<uint32_t> getValue(const std::string& ifname, uint32_t command) { struct ethtool_value valueop = {}; valueop.cmd = command; auto ifr = ifreqs::fromName(ifname); ifr.ifr_data = &valueop; if (!ifreqs::send(SIOCETHTOOL, ifr)) return std::nullopt; return valueop.data; } bool setValue(const std::string& ifname, uint32_t command, uint32_t value) { struct ethtool_value valueop = {}; valueop.cmd = command; valueop.data = value; auto ifr = ifreqs::fromName(ifname); ifr.ifr_data = &valueop; return ifreqs::send(SIOCETHTOOL, ifr); } } // namespace android::netdevice::ethtool
automotive/can/1.0/default/libnetdevice/ifreqs.cpp 0 → 100644 +48 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ifreqs.h" #include "common.h" #include <android-base/logging.h> #include <android-base/unique_fd.h> namespace android::netdevice::ifreqs { bool send(unsigned long request, struct ifreq& ifr) { base::unique_fd sock(socket(socketparams::current.domain, socketparams::current.type, socketparams::current.protocol)); if (!sock.ok()) { LOG(ERROR) << "Can't create socket"; return false; } if (ioctl(sock.get(), request, &ifr) < 0) { PLOG(ERROR) << "ioctl(" << std::hex << request << std::dec << ") failed"; return false; } return true; } struct ifreq fromName(const std::string& ifname) { struct ifreq ifr = {}; strlcpy(ifr.ifr_name, ifname.c_str(), IF_NAMESIZE); return ifr; } } // namespace android::netdevice::ifreqs