/*
 * Copyright 2017-present Open Networking Laboratory
 *
 * 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.
 */
package org.onosproject.ofagent.impl;

import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.timeout.ReadTimeoutHandler;
import org.onosproject.ofagent.api.OFSwitch;

/**
 * Implementation of OpenFlow channel initializer.
 */
public final class OFChannelInitializer extends ChannelInitializer<SocketChannel> {

    private final OFSwitch ofSwitch;
    private static final int READ_TIMEOUT = 30;

    /**
     * Default constructor.
     *
     * @param ofSwitch openflow switch that owns this channel
     */
    public OFChannelInitializer(OFSwitch ofSwitch) {
        this.ofSwitch = ofSwitch;
    }

    @Override
    protected void initChannel(SocketChannel ch) throws Exception {

        ch.pipeline().addLast(new OFMessageDecoder())
                .addLast(new OFMessageEncoder())
                .addLast(new ReadTimeoutHandler(READ_TIMEOUT))
                .addLast(new OFChannelHandler(ofSwitch));
    }
}
