/*
 * tunnel.h --
 *
 *      Interface of the TUNNEL-MIB implementation.
 *
 * Copyright (c) 2000-2003 Frank Strauss <strauss@ibr.cs.tu-bs.de>
 *
 *                          All Rights Reserved
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notice appears in all copies and
 * that both that copyright notice and this permission notice appear in
 * supporting documentation, and that the name of the author and CMU and
 * The Regents of the University of California not be used in advertising
 * or publicity pertaining to distribution of the software without
 * specific written permission.
 * 
 * THE AUTHOR AND CMU AND THE REGENTS OF THE UNIVERSITY OF CALIFORNIA
 * DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL
 * THE AUTHOR OR CMU OR THE REGENTS OF THE UNIVERSITY OF CALIFORNIA BE
 * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
 * DAMAGES WHATSOEVER RESULTING FROM THE LOSS OF USE, DATA OR PROFITS,
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 * SOFTWARE.
 *
 */

#ifndef _MIBGROUP_TUNNEL_H
#define _MIBGROUP_TUNNEL_H

void            init_tunnel(void);
void            deinit_tunnel(void);

unsigned char  *var_tunnelIfEntry(struct variable *, oid *, size_t *,
                                  int, size_t *,
                                  WriteMethod ** write_method);

unsigned char  *var_tunnelConfigEntry(struct variable *, oid *, size_t *,
                                      int, size_t *,
                                      WriteMethod ** write_method);

#endif                          /* _MIBGROUP_TUNNEL_H */

