@@ -15,6 +15,13 @@ TYPE=$2
15
15
PVS_VM_INTERFACE=$3
16
16
PRIVATE_PATH=$4
17
17
18
+ IP=/usr/sbin/ip
19
+ VSCTL=/usr/bin/ovs-vsctl
20
+ OFCTL=/usr/bin/ovs-ofctl
21
+ XSREAD=/usr/bin/xenstore-read
22
+ XSWRITE=/usr/bin/xenstore-write
23
+ XSRM=/usr/bin/xenstore-rm
24
+
18
25
LOG_TAG=" setup-pvs-proxy-rules"
19
26
20
27
handle_error ()
@@ -31,38 +38,62 @@ handle_xs_error()
31
38
32
39
logger -t " $LOG_TAG " " Called as $0 $* "
33
40
41
+ path=" ${PRIVATE_PATH} /pvs-site"
42
+ PVS_SITE=$( $XSREAD " $path " )
43
+ if [ $? -ne 0 ] || [ -z " $PVS_SITE " ]; then
44
+ handle_xs_error " $path "
45
+ fi
46
+
47
+ path=" ${PRIVATE_PATH} /vif-uuid"
48
+ VIF=$( $XSREAD " $path " )
49
+ if [ $? -ne 0 ] || [ -z " $VIF " ]; then
50
+ handle_xs_error " $path "
51
+ fi
52
+
53
+ # Only continue if the proxy state is "started".
54
+ path=" /xapi/pvs-proxy/$PVS_SITE /$VIF /state"
55
+ PVS_PROXY_STATE=$( $XSREAD " $path " )
56
+ if [ " $PVS_PROXY_STATE " != " started" ]; then
57
+ handle_error " PVS proxy daemon not configured for this proxy - not installing OVS rules."
58
+ fi
59
+
34
60
path=" ${PRIVATE_PATH} /pvs-interface"
35
- PVS_PROXY_INTERFACE=$( xenstore-read " $path " )
61
+ PVS_PROXY_INTERFACE=$( $XSREAD " $path " )
36
62
if [ $? -ne 0 ] || [ -z " $PVS_PROXY_INTERFACE " ]; then
37
63
handle_xs_error " $path "
38
64
fi
39
65
40
66
path=" ${PRIVATE_PATH} /mac"
41
- PVS_VM_MAC=$( xenstore-read " $path " )
67
+ PVS_VM_MAC=$( $XSREAD " $path " )
42
68
if [ $? -ne 0 ] || [ -z " $PVS_VM_MAC " ]; then
43
69
handle_xs_error " $path "
44
70
fi
45
71
46
72
path=" ${PRIVATE_PATH} /pvs-server-num"
47
- PVS_SERVER_NUM=$( xenstore-read " $path " )
73
+ PVS_SERVER_NUM=$( $XSREAD " $path " )
48
74
if [ $? -ne 0 ] || [ -z " $PVS_SERVER_NUM " ]; then
49
75
handle_xs_error " $path "
50
76
fi
51
77
52
78
path=" ${PRIVATE_PATH} /bridge"
53
- bridge=$( xenstore-read " $path " )
79
+ bridge=$( $XSREAD " $path " )
54
80
if [ $? -ne 0 ] || [ -z " $bridge " ]; then
55
81
handle_xs_error " $path "
56
82
fi
57
- PVS_BRIDGE=$( ovs-vsctl br-to-parent " $bridge " )
83
+ PVS_BRIDGE=$( $VSCTL br-to-parent " $bridge " )
58
84
59
85
PVS_RULE_PRIO=1000
60
86
61
87
case $ACTION in
62
88
add)
63
- PVS_PROXY_MAC=$( ovs-vsctl get interface " $PVS_PROXY_INTERFACE " mac_in_use | tr -d ' "' )
64
- PVS_PROXY_OFPORT=$( ovs-vsctl get interface " $PVS_PROXY_INTERFACE " ofport)
65
- PVS_VM_OFPORT=$( ovs-vsctl get interface " $PVS_VM_INTERFACE " ofport)
89
+ # Create a port/interface for the proxy daemon
90
+ $VSCTL --may-exist add-port " $PVS_BRIDGE " " $PVS_PROXY_INTERFACE " -- set interface " $PVS_PROXY_INTERFACE " type=internal
91
+ $IP link set " $PVS_PROXY_INTERFACE " up
92
+ logger -t " $LOG_TAG " " Created proxy port $PVS_PROXY_INTERFACE "
93
+
94
+ PVS_PROXY_MAC=$( $VSCTL get interface " $PVS_PROXY_INTERFACE " mac_in_use | tr -d ' "' )
95
+ PVS_PROXY_OFPORT=$( $VSCTL get interface " $PVS_PROXY_INTERFACE " ofport)
96
+ PVS_VM_OFPORT=$( $VSCTL get interface " $PVS_VM_INTERFACE " ofport)
66
97
if [ $? -ne 0 ] || [ -z " $PVS_VM_OFPORT " ]; then
67
98
handle_error " The $PVS_VM_INTERFACE interface was not found on a bridge"
68
99
fi
@@ -71,13 +102,13 @@ case $ACTION in
71
102
72
103
for (( j= 0 ; j< PVS_SERVER_NUM; j++ )) do
73
104
path=" ${PRIVATE_PATH} /pvs-server-$j -addresses"
74
- PVS_SERVER_IPS=$( xenstore-read " $path " )
105
+ PVS_SERVER_IPS=$( $XSREAD " $path " )
75
106
if [ $? -ne 0 ] || [ -z " $PVS_SERVER_IPS " ]; then
76
107
handle_xs_error " $path "
77
108
fi
78
109
79
110
path=" ${PRIVATE_PATH} /pvs-server-$j -ports"
80
- PVS_PORTS=$( xenstore-read " $path " )
111
+ PVS_PORTS=$( $XSREAD " $path " )
81
112
if [ $? -ne 0 ] || [ -z " $PVS_PORTS " ]; then
82
113
handle_xs_error " $path "
83
114
fi
@@ -91,7 +122,7 @@ case $ACTION in
91
122
# Packets from proxied clients that have a PVS-server IP must
92
123
# be dropped. This is done separately for vif and tap interfaces
93
124
# by matching on the in_port.
94
- ovs-ofctl --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,in_port=" $PVS_VM_OFPORT " ,ip,nw_src=" $PVS_SERVER_IP " ,actions=drop
125
+ $OFCTL --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,in_port=" $PVS_VM_OFPORT " ,ip,nw_src=" $PVS_SERVER_IP " ,actions=drop
95
126
96
127
# The following rules are independent of the in_port, so we'll
97
128
# need just one copy per VIF. We'll only apply them if the
@@ -100,22 +131,23 @@ case $ACTION in
100
131
if [ " ${TYPE} " = " vif" ]; then
101
132
for (( i= PVS_STARTPORT; i<= PVS_ENDPORT; i++ )) do
102
133
# Packets from client->server that need to be proxied.
103
- ovs-ofctl --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_src=" $PVS_VM_MAC " ,nw_dst=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=" $PVS_PROXY_OFPORT "
134
+ $OFCTL --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_src=" $PVS_VM_MAC " ,nw_dst=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=" $PVS_PROXY_OFPORT "
104
135
# Packets from proxy->client.
105
- ovs-ofctl --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,udp,dl_src=" $PVS_PROXY_MAC " ,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=NORMAL
136
+ $OFCTL --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,udp,dl_src=" $PVS_PROXY_MAC " ,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=NORMAL
106
137
# Packets from server->client that need to be proxied.
107
- ovs-ofctl --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=" $PVS_PROXY_OFPORT "
138
+ $OFCTL --strict add-flow " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i ,actions=" $PVS_PROXY_OFPORT "
108
139
done
109
- # Announce that on the OVS we have set up the rules for this VIF's pvs-proxy.
110
- xenstore-write " ${PRIVATE_PATH} /pvs-rules-active" ' '
111
140
fi
112
141
done
113
142
unset IFS
143
+
144
+ # Announce that on the OVS we have set up the rules for this VIF's pvs-proxy
145
+ $XSWRITE " ${PRIVATE_PATH} /pvs-rules-active" ' '
114
146
done
115
147
;;
116
148
remove)
117
- PVS_PROXY_MAC=$( ovs-vsctl get interface " $PVS_PROXY_INTERFACE " mac_in_use | tr -d ' "' )
118
- PVS_VM_OFPORT=$( ovs-vsctl get interface " $PVS_VM_INTERFACE " ofport)
149
+ PVS_PROXY_MAC=$( $VSCTL get interface " $PVS_PROXY_INTERFACE " mac_in_use | tr -d ' "' )
150
+ PVS_VM_OFPORT=$( $VSCTL get interface " $PVS_VM_INTERFACE " ofport)
119
151
if [ $? -ne 0 ] || [ -z " $PVS_VM_OFPORT " ]; then
120
152
handle_error " The $PVS_VM_INTERFACE interface was not found on a bridge"
121
153
fi
@@ -124,13 +156,13 @@ case $ACTION in
124
156
125
157
for (( j= 0 ; j< PVS_SERVER_NUM; j++ )) do
126
158
path=" ${PRIVATE_PATH} /pvs-server-$j -addresses"
127
- PVS_SERVER_IPS=$( xenstore-read " $path " )
159
+ PVS_SERVER_IPS=$( $XSREAD " $path " )
128
160
if [ $? -ne 0 ] || [ -z " $PVS_SERVER_IPS " ]; then
129
161
handle_xs_error " $path "
130
162
fi
131
163
132
164
path=" ${PRIVATE_PATH} /pvs-server-$j -ports"
133
- PVS_PORTS=$( xenstore-read " $path " )
165
+ PVS_PORTS=$( $XSREAD " $path " )
134
166
if [ $? -ne 0 ] || [ -z " $PVS_PORTS " ]; then
135
167
handle_xs_error " $path "
136
168
fi
@@ -144,7 +176,7 @@ case $ACTION in
144
176
# Packets from proxied clients that have a PVS-server IP must
145
177
# be dropped. This is done separately for vif and tap interfaces
146
178
# by matching on the in_port.
147
- ovs-ofctl --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,in_port=" $PVS_VM_OFPORT " ,ip,nw_src=" $PVS_SERVER_IP "
179
+ $OFCTL --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,in_port=" $PVS_VM_OFPORT " ,ip,nw_src=" $PVS_SERVER_IP "
148
180
149
181
# The following rules are independent of the in_port, so we'll
150
182
# need just one copy per VIF. We'll only apply them if the
@@ -153,22 +185,33 @@ case $ACTION in
153
185
if [ " ${TYPE} " = " vif" ]; then
154
186
for (( i= PVS_STARTPORT; i<= PVS_ENDPORT; i++ )) do
155
187
# Packets from client->server that need to be proxied.
156
- ovs-ofctl --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_src=" $PVS_VM_MAC " ,nw_dst=" $PVS_SERVER_IP " ,tp_dst=$i
188
+ $OFCTL --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_src=" $PVS_VM_MAC " ,nw_dst=" $PVS_SERVER_IP " ,tp_dst=$i
157
189
# Packets from proxy->client.
158
- ovs-ofctl --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,udp,dl_src=" $PVS_PROXY_MAC " ,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i
190
+ $OFCTL --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO)) ,udp,dl_src=" $PVS_PROXY_MAC " ,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i
159
191
# Packets from server->client that need to be proxied.
160
- ovs-ofctl --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i
192
+ $OFCTL --strict del-flows " $PVS_BRIDGE " priority=$(( PVS_RULE_PRIO- 1 )) ,udp,dl_dst=" $PVS_VM_MAC " ,nw_src=" $PVS_SERVER_IP " ,tp_dst=$i
161
193
done
162
- # Announce that on the OVS we have removed the rules for this VIF's pvs-proxy.
163
- xenstore-rm " ${PRIVATE_PATH} /pvs-rules-active"
164
194
fi
165
195
done
166
196
unset IFS
197
+
198
+ if [ " ${TYPE} " = " vif" ]; then
199
+ # Again, don't do the following when a tap goes away, because
200
+ # vif may still be there.
201
+
202
+ # Remove the port/interface for the proxy daemon
203
+ $IP link set " $PVS_PROXY_INTERFACE " down
204
+ $VSCTL del-port " $PVS_BRIDGE " " $PVS_PROXY_INTERFACE "
205
+ logger -t " $LOG_TAG " " Removed proxy port $PVS_PROXY_INTERFACE "
206
+
207
+ # Announce that on the OVS we have removed the rules for this VIF's pvs-proxy.
208
+ XSRM " ${PRIVATE_PATH} /pvs-rules-active"
209
+ fi
167
210
done
168
211
;;
169
212
reset)
170
- ovs-ofctl del-flows " $PVS_BRIDGE "
171
- ovs-ofctl --strict add-flow " $PVS_BRIDGE " priority=0,actions=NORMAL
213
+ $OFCTL del-flows " $PVS_BRIDGE "
214
+ $OFCTL --strict add-flow " $PVS_BRIDGE " priority=0,actions=NORMAL
172
215
;;
173
216
* )
174
217
handle_error " Unknown command '$1 '"
0 commit comments