author | Jiri Sasek <Jiri.Sasek@Oracle.COM> |
Thu, 21 Jan 2016 07:53:27 -0800 | |
changeset 5334 | 30ec36f36c89 |
parent 5090 | 5f131162e136 |
permissions | -rw-r--r-- |
5090
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
1 |
/* |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
2 |
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
3 |
*/ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
4 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
5 |
/* |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
6 |
* Copyright (c) 2012 Ed Maste. All rights reserved. |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
7 |
* |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
8 |
* Licensed under the Apache License, Version 2.0 (the "License"); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
9 |
* you may not use this file except in compliance with the License. |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
10 |
* You may obtain a copy of the License at: |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
11 |
* |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
12 |
* http://www.apache.org/licenses/LICENSE-2.0 |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
13 |
* |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
14 |
* Unless required by applicable law or agreed to in writing, software |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
15 |
* distributed under the License is distributed on an "AS IS" BASIS, |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
16 |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
17 |
* See the License for the specific language governing permissions and |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
18 |
* limitations under the License. |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
19 |
*/ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
20 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
21 |
#include <config.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
22 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
23 |
#include "route-table.h" |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
24 |
#include <sys/socket.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
25 |
#include <sys/types.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
26 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
27 |
#include <net/if.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
28 |
#include <net/route.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
29 |
#include <net/if_dl.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
30 |
#include <netinet/in.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
31 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
32 |
#include <string.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
33 |
#include <unistd.h> |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
34 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
35 |
#include "util.h" |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
36 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
37 |
static int pid; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
38 |
static unsigned int register_count = 0; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
39 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
40 |
#define ROUNDUP_LONG(a) ((a) > 0 ? (1 + (((a) - 1) | (sizeof (long) - 1))) : \ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
41 |
sizeof (long)) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
42 |
#define RT_ADVANCE(x, n) ((x) += ROUNDUP_LONG(salen(n))) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
43 |
#define BUF_SIZE 2048 |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
44 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
45 |
typedef struct rtmsg { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
46 |
struct rt_msghdr m_rtm; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
47 |
char m_space[BUF_SIZE]; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
48 |
} rtmsg_t; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
49 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
50 |
static int |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
51 |
salen(const struct sockaddr *sa) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
52 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
53 |
switch (sa->sa_family) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
54 |
case AF_INET: |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
55 |
return (sizeof (struct sockaddr_in)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
56 |
case AF_LINK: |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
57 |
return (sizeof (struct sockaddr_dl)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
58 |
case AF_INET6: |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
59 |
return (sizeof (struct sockaddr_in6)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
60 |
default: |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
61 |
return (sizeof (struct sockaddr)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
62 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
63 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
64 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
65 |
bool |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
66 |
route_table_get_name(ovs_be32 ip, char name[IFNAMSIZ]) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
67 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
68 |
rtmsg_t m_rtmsg; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
69 |
struct rt_msghdr *rtm = &m_rtmsg.m_rtm; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
70 |
char *cp = m_rtmsg.m_space; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
71 |
int rtsock_fd; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
72 |
struct sockaddr_in sin; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
73 |
struct sockaddr_dl sdl; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
74 |
ssize_t ssz; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
75 |
static int seq; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
76 |
int rlen; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
77 |
int i; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
78 |
int l; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
79 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
80 |
rtsock_fd = socket(PF_ROUTE, SOCK_RAW, 0); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
81 |
if (rtsock_fd == -1) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
82 |
return (false); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
83 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
84 |
memset(&sin, 0, sizeof (sin)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
85 |
sin.sin_family = AF_INET; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
86 |
sin.sin_port = 0; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
87 |
sin.sin_addr.s_addr = ip; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
88 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
89 |
memset(&sdl, 0, sizeof (sdl)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
90 |
sdl.sdl_family = AF_LINK; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
91 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
92 |
memset(&m_rtmsg, 0, sizeof (m_rtmsg)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
93 |
rtm->rtm_version = RTM_VERSION; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
94 |
rtm->rtm_type = RTM_GET; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
95 |
rtm->rtm_addrs = RTA_DST|RTA_IFP; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
96 |
rtm->rtm_seq = ++seq; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
97 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
98 |
l = ROUNDUP_LONG(sizeof (struct sockaddr_in)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
99 |
(void) memcpy(cp, &sin, l); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
100 |
cp += l; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
101 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
102 |
l = ROUNDUP_LONG(sizeof (struct sockaddr_dl)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
103 |
(void) memcpy(cp, &sdl, l); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
104 |
cp += l; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
105 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
106 |
rtm->rtm_msglen = l = cp - (char *)&m_rtmsg; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
107 |
if ((rlen = write(rtsock_fd, (char *)&m_rtmsg, l)) < l) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
108 |
close(rtsock_fd); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
109 |
return (false); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
110 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
111 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
112 |
do { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
113 |
ssz = read(rtsock_fd, &m_rtmsg, sizeof (m_rtmsg)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
114 |
} while (ssz > 0 && (rtm->rtm_seq != seq || rtm->rtm_pid != pid)); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
115 |
close(rtsock_fd); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
116 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
117 |
if (ssz < 0) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
118 |
return (false); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
119 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
120 |
cp = (void *)&m_rtmsg.m_space; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
121 |
for (i = 1; i; i <<= 1) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
122 |
if ((rtm->rtm_addrs & i) != 0) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
123 |
const struct sockaddr *sa = (const void *)cp; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
124 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
125 |
if ((i == RTA_IFP) && sa->sa_family == AF_LINK) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
126 |
const struct sockaddr_dl * const sdlp = |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
127 |
ALIGNED_CAST(const struct sockaddr_dl *, |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
128 |
sa); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
129 |
int namelen; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
130 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
131 |
namelen = sdlp->sdl_nlen; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
132 |
if (namelen > IFNAMSIZ - 1) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
133 |
namelen = IFNAMSIZ - 1; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
134 |
memcpy(name, sdlp->sdl_data, namelen); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
135 |
name[namelen] = '\0'; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
136 |
return (true); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
137 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
138 |
RT_ADVANCE(cp, sa); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
139 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
140 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
141 |
return (false); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
142 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
143 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
144 |
uint64_t |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
145 |
route_table_get_change_seq(void) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
146 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
147 |
return (0); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
148 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
149 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
150 |
void |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
151 |
route_table_register(void) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
152 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
153 |
if (!register_count) { |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
154 |
pid = getpid(); |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
155 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
156 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
157 |
register_count++; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
158 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
159 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
160 |
void |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
161 |
route_table_unregister(void) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
162 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
163 |
register_count--; |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
164 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
165 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
166 |
void |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
167 |
route_table_run(void) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
168 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
169 |
} |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
170 |
|
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
171 |
void |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
172 |
route_table_wait(void) |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
173 |
{ |
5f131162e136
PSARC/2015/311 Open vSwitch (OVS)
Mark Haywood <Mark.Haywood@Oracle.COM>
parents:
diff
changeset
|
174 |
} |