Line data Source code
1 : /* $OpenBSD: ip_gre.c,v 1.71 2018/02/07 22:30:59 dlg Exp $ */
2 : /* $NetBSD: ip_gre.c,v 1.9 1999/10/25 19:18:11 drochner Exp $ */
3 :
4 : /*
5 : * Copyright (c) 1998 The NetBSD Foundation, Inc.
6 : * All rights reserved.
7 : *
8 : * This code is derived from software contributed to The NetBSD Foundation
9 : * by Heiko W.Rupp <hwr@pilhuhn.de>
10 : *
11 : * Redistribution and use in source and binary forms, with or without
12 : * modification, are permitted provided that the following conditions
13 : * are met:
14 : * 1. Redistributions of source code must retain the above copyright
15 : * notice, this list of conditions and the following disclaimer.
16 : * 2. Redistributions in binary form must reproduce the above copyright
17 : * notice, this list of conditions and the following disclaimer in the
18 : * documentation and/or other materials provided with the distribution.
19 : *
20 : * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 : * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 : * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 : * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 : * POSSIBILITY OF SUCH DAMAGE.
31 : */
32 :
33 : /*
34 : * decapsulate tunneled packets and send them on
35 : * output half is in net/if_gre.[ch]
36 : * This currently handles IPPROTO_GRE, IPPROTO_MOBILE
37 : */
38 :
39 :
40 : #include "gre.h"
41 : #if NGRE > 0
42 :
43 : #include <sys/param.h>
44 : #include <sys/systm.h>
45 : #include <sys/mbuf.h>
46 : #include <sys/protosw.h>
47 : #include <sys/socket.h>
48 : #include <sys/socketvar.h>
49 : #include <sys/sysctl.h>
50 :
51 : #include <net/if.h>
52 : #include <net/route.h>
53 :
54 : #include <netinet/in.h>
55 : #include <netinet/ip.h>
56 : #include <netinet/ip_var.h>
57 : #include <netinet/in_pcb.h>
58 :
59 : #ifdef PIPEX
60 : #include <net/pipex.h>
61 : #endif
62 :
63 : int
64 0 : gre_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
65 : struct mbuf *control, struct proc *p)
66 : {
67 : #ifdef PIPEX
68 0 : struct inpcb *inp = sotoinpcb(so);
69 :
70 0 : if (inp != NULL && inp->inp_pipex && req == PRU_SEND) {
71 0 : struct sockaddr_in *sin4;
72 : struct in_addr *ina_dst;
73 : struct pipex_session *session;
74 :
75 : ina_dst = NULL;
76 0 : if ((so->so_state & SS_ISCONNECTED) != 0) {
77 0 : inp = sotoinpcb(so);
78 0 : if (inp)
79 0 : ina_dst = &inp->inp_laddr;
80 0 : } else if (nam) {
81 0 : if (in_nam2sin(nam, &sin4) == 0)
82 0 : ina_dst = &sin4->sin_addr;
83 : }
84 0 : if (ina_dst != NULL &&
85 0 : (session = pipex_pptp_userland_lookup_session_ipv4(m,
86 : *ina_dst)))
87 0 : m = pipex_pptp_userland_output(m, session);
88 :
89 0 : if (m == NULL)
90 0 : return (ENOMEM);
91 0 : }
92 : #endif
93 0 : return rip_usrreq(so, req, m, nam, control, p);
94 0 : }
95 : #endif /* if NGRE > 0 */
|