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