16193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline/* 26193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Copyright (C) 2015 The Android Open Source Project 36193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 46193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Licensed under the Apache License, Version 2.0 (the "License"); 56193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * you may not use this file except in compliance with the License. 66193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * You may obtain a copy of the License at 76193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 86193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * http://www.apache.org/licenses/LICENSE-2.0 96193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 106193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * Unless required by applicable law or agreed to in writing, software 116193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * distributed under the License is distributed on an "AS IS" BASIS, 126193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * See the License for the specific language governing permissions and 146193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * limitations under the License. 156193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline */ 166193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 176193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klinepackage android.net.netlink; 186193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 196193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport android.net.netlink.NetlinkConstants; 206193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport android.net.netlink.StructNlMsgHdr; 216193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport libcore.io.SizeOf; 226193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 236193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klineimport java.nio.ByteBuffer; 246193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 256193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 266193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline/** 276193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * struct nlmsgerr 286193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 296193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * see <linux_src>/include/uapi/linux/netlink.h 306193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * 316193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline * @hide 326193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline */ 336193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Klinepublic class StructNlMsgErr { 346193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static final int STRUCT_SIZE = SizeOf.INT + StructNlMsgHdr.STRUCT_SIZE; 356193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 366193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static boolean hasAvailableSpace(ByteBuffer byteBuffer) { 376193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return byteBuffer != null && byteBuffer.remaining() >= STRUCT_SIZE; 386193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 396193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 406193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public static StructNlMsgErr parse(ByteBuffer byteBuffer) { 416193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (!hasAvailableSpace(byteBuffer)) { return null; } 426193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 436193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // The ByteOrder must have already been set by the caller. In most 446193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // cases ByteOrder.nativeOrder() is correct, with the exception 456193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // of usage within unittests. 466193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline final StructNlMsgErr struct = new StructNlMsgErr(); 476193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline struct.error = byteBuffer.getInt(); 486193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline struct.msg = StructNlMsgHdr.parse(byteBuffer); 496193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return struct; 506193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 516193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 526193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public int error; 536193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public StructNlMsgHdr msg; 546193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 559ce5d602cd5d732ae10efe0b648b43ddf60d65c9Erik Kline public void pack(ByteBuffer byteBuffer) { 566193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // The ByteOrder must have already been set by the caller. In most 576193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // cases ByteOrder.nativeOrder() is correct, with the possible 586193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline // exception of usage within unittests. 596193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline byteBuffer.putInt(error); 606193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline if (msg != null) { 616193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline msg.pack(byteBuffer); 626193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 636193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 646193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline 656193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline @Override 666193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline public String toString() { 676193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline return "StructNlMsgErr{ " 686193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline + "error{" + error + "}, " 696193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline + "msg{" + (msg == null ? "" : msg.toString()) + "} " 706193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline + "}"; 716193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline } 726193aa3305bc2aa5b7f0a983f4b08c99065cfb82Erik Kline} 73