projects
/
openvswitch
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
random: Get random seed from /dev/urandom.
[openvswitch]
/
lib
/
dpif-netdev.c
diff --git
a/lib/dpif-netdev.c
b/lib/dpif-netdev.c
index 3c22e6dc1b72dc1af770a5b007ce523c78ae9d50..c17b52572ebd70eb19ecf5139de0fda88fe0f450 100644
(file)
--- a/
lib/dpif-netdev.c
+++ b/
lib/dpif-netdev.c
@@
-1017,6
+1017,9
@@
dp_netdev_port_input(struct dp_netdev *dp, struct dp_netdev_port *port,
struct dp_netdev_flow *flow;
flow_t key;
struct dp_netdev_flow *flow;
flow_t key;
+ if (packet->size < ETH_HEADER_LEN) {
+ return;
+ }
if (flow_extract(packet, 0, port->port_no, &key) && dp->drop_frags) {
dp->n_frags++;
return;
if (flow_extract(packet, 0, port->port_no, &key) && dp->drop_frags) {
dp->n_frags++;
return;
@@
-1087,12
+1090,14
@@
dp_netdev_wait(void)
* bits outside of 'mask'.
*/
static void
* bits outside of 'mask'.
*/
static void
-dp_netdev_modify_vlan_tci(struct ofpbuf *packet, const flow_t *key,
- uint16_t tci, uint16_t mask)
+dp_netdev_modify_vlan_tci(struct ofpbuf *packet, uint16_t tci, uint16_t mask)
{
struct vlan_eth_header *veh;
{
struct vlan_eth_header *veh;
+ struct eth_header *eh;
- if (key->dl_vlan != htons(ODP_VLAN_NONE)) {
+ eh = packet->l2;
+ if (packet->size >= sizeof(struct vlan_eth_header)
+ && eh->eth_type == htons(ETH_TYPE_VLAN)) {
/* Clear 'mask' bits, but maintain other TCI bits. */
veh = packet->l2;
veh->veth_tci &= ~htons(mask);
/* Clear 'mask' bits, but maintain other TCI bits. */
veh = packet->l2;
veh->veth_tci &= ~htons(mask);
@@
-1117,7
+1122,8
@@
static void
dp_netdev_strip_vlan(struct ofpbuf *packet)
{
struct vlan_eth_header *veh = packet->l2;
dp_netdev_strip_vlan(struct ofpbuf *packet)
{
struct vlan_eth_header *veh = packet->l2;
- if (veh->veth_type == htons(ETH_TYPE_VLAN)) {
+ if (packet->size >= sizeof *veh
+ && veh->veth_type == htons(ETH_TYPE_VLAN)) {
struct eth_header tmp;
memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
struct eth_header tmp;
memcpy(tmp.eth_dst, veh->veth_dst, ETH_ADDR_LEN);
@@
-1288,14
+1294,14
@@
dp_netdev_execute_actions(struct dp_netdev *dp,
break;
case ODPAT_SET_VLAN_VID:
break;
case ODPAT_SET_VLAN_VID:
- dp_netdev_modify_vlan_tci(packet,
key,
ntohs(a->vlan_vid.vlan_vid),
+ dp_netdev_modify_vlan_tci(packet, ntohs(a->vlan_vid.vlan_vid),
VLAN_VID_MASK);
break;
case ODPAT_SET_VLAN_PCP:
VLAN_VID_MASK);
break;
case ODPAT_SET_VLAN_PCP:
- dp_netdev_modify_vlan_tci(
-
packet, key,
a->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT,
- VLAN_PCP_MASK);
+ dp_netdev_modify_vlan_tci(
packet,
+
a->vlan_pcp.vlan_pcp << VLAN_PCP_SHIFT,
+
VLAN_PCP_MASK);
break;
case ODPAT_STRIP_VLAN:
break;
case ODPAT_STRIP_VLAN: