Commit b209a368 authored by Niranjana Vishwanathapura's avatar Niranjana Vishwanathapura Committed by Doug Ledford

IB/opa_vnic: Add routing control information

Add protocol specific routing control information in the encapsulation
header as per the configuration.
Reviewed-by: default avatarSudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: default avatarNiranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Signed-off-by: default avatarScott Franco <safranco@intel.com>
Signed-off-by: default avatarDennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent e82b7c38
...@@ -406,6 +406,42 @@ u8 opa_vnic_get_vl(struct opa_vnic_adapter *adapter, struct sk_buff *skb) ...@@ -406,6 +406,42 @@ u8 opa_vnic_get_vl(struct opa_vnic_adapter *adapter, struct sk_buff *skb)
return vl; return vl;
} }
/* opa_vnic_get_rc - return the routing control */
static u8 opa_vnic_get_rc(struct __opa_veswport_info *info,
struct sk_buff *skb)
{
u8 proto, rout_ctrl;
switch (vlan_get_protocol(skb)) {
case htons(ETH_P_IPV6):
proto = ipv6_hdr(skb)->nexthdr;
if (proto == IPPROTO_TCP)
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc,
IPV6_TCP);
else if (proto == IPPROTO_UDP)
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc,
IPV6_UDP);
else
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc, IPV6);
break;
case htons(ETH_P_IP):
proto = ip_hdr(skb)->protocol;
if (proto == IPPROTO_TCP)
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc,
IPV4_TCP);
else if (proto == IPPROTO_UDP)
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc,
IPV4_UDP);
else
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc, IPV4);
break;
default:
rout_ctrl = OPA_VNIC_ENCAP_RC_EXT(info->vesw.rc, DEFAULT);
}
return rout_ctrl;
}
/* opa_vnic_calc_entropy - calculate the packet entropy */ /* opa_vnic_calc_entropy - calculate the packet entropy */
u8 opa_vnic_calc_entropy(struct opa_vnic_adapter *adapter, struct sk_buff *skb) u8 opa_vnic_calc_entropy(struct opa_vnic_adapter *adapter, struct sk_buff *skb)
{ {
...@@ -448,7 +484,7 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb) ...@@ -448,7 +484,7 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb)
{ {
struct __opa_veswport_info *info = &adapter->info; struct __opa_veswport_info *info = &adapter->info;
struct opa_vnic_skb_mdata *mdata; struct opa_vnic_skb_mdata *mdata;
u8 def_port, sc, entropy, *hdr; u8 def_port, sc, rc, entropy, *hdr;
u16 len, l4_hdr; u16 len, l4_hdr;
u32 dlid; u32 dlid;
...@@ -459,6 +495,7 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb) ...@@ -459,6 +495,7 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb)
len = opa_vnic_wire_length(skb); len = opa_vnic_wire_length(skb);
dlid = opa_vnic_get_dlid(adapter, skb, def_port); dlid = opa_vnic_get_dlid(adapter, skb, def_port);
sc = opa_vnic_get_sc(info, skb); sc = opa_vnic_get_sc(info, skb);
rc = opa_vnic_get_rc(info, skb);
l4_hdr = info->vesw.vesw_id; l4_hdr = info->vesw.vesw_id;
mdata = skb_push(skb, sizeof(*mdata)); mdata = skb_push(skb, sizeof(*mdata));
...@@ -471,6 +508,6 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb) ...@@ -471,6 +508,6 @@ void opa_vnic_encap_skb(struct opa_vnic_adapter *adapter, struct sk_buff *skb)
} }
opa_vnic_make_header(hdr, info->vport.encap_slid, dlid, len, opa_vnic_make_header(hdr, info->vport.encap_slid, dlid, len,
info->vesw.pkey, entropy, sc, 0, info->vesw.pkey, entropy, sc, rc,
OPA_VNIC_L4_ETHR, l4_hdr); OPA_VNIC_L4_ETHR, l4_hdr);
} }
...@@ -103,6 +103,17 @@ ...@@ -103,6 +103,17 @@
#define OPA_VNIC_ETH_LINK_UP 1 #define OPA_VNIC_ETH_LINK_UP 1
#define OPA_VNIC_ETH_LINK_DOWN 2 #define OPA_VNIC_ETH_LINK_DOWN 2
/* routing control */
#define OPA_VNIC_ENCAP_RC_DEFAULT 0
#define OPA_VNIC_ENCAP_RC_IPV4 4
#define OPA_VNIC_ENCAP_RC_IPV4_UDP 8
#define OPA_VNIC_ENCAP_RC_IPV4_TCP 12
#define OPA_VNIC_ENCAP_RC_IPV6 16
#define OPA_VNIC_ENCAP_RC_IPV6_TCP 20
#define OPA_VNIC_ENCAP_RC_IPV6_UDP 24
#define OPA_VNIC_ENCAP_RC_EXT(w, b) (((w) >> OPA_VNIC_ENCAP_RC_ ## b) & 0x7)
/** /**
* struct opa_vesw_info - OPA vnic switch information * struct opa_vesw_info - OPA vnic switch information
* @fabric_id: 10-bit fabric id * @fabric_id: 10-bit fabric id
...@@ -111,6 +122,7 @@ ...@@ -111,6 +122,7 @@
* @pkey: partition key * @pkey: partition key
* @u_mcast_dlid: unknown multicast dlid * @u_mcast_dlid: unknown multicast dlid
* @u_ucast_dlid: array of unknown unicast dlids * @u_ucast_dlid: array of unknown unicast dlids
* @rc: routing control
* @eth_mtu: Ethernet MTU * @eth_mtu: Ethernet MTU
*/ */
struct opa_vesw_info { struct opa_vesw_info {
...@@ -127,7 +139,9 @@ struct opa_vesw_info { ...@@ -127,7 +139,9 @@ struct opa_vesw_info {
__be32 u_mcast_dlid; __be32 u_mcast_dlid;
__be32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT]; __be32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT];
u8 rsvd3[60]; __be32 rc;
u8 rsvd3[56];
__be16 eth_mtu; __be16 eth_mtu;
u8 rsvd4[2]; u8 rsvd4[2];
} __packed; } __packed;
......
...@@ -89,7 +89,9 @@ struct __opa_vesw_info { ...@@ -89,7 +89,9 @@ struct __opa_vesw_info {
u32 u_mcast_dlid; u32 u_mcast_dlid;
u32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT]; u32 u_ucast_dlid[OPA_VESW_MAX_NUM_DEF_PORT];
u8 rsvd3[60]; u32 rc;
u8 rsvd3[56];
u16 eth_mtu; u16 eth_mtu;
u8 rsvd4[2]; u8 rsvd4[2];
} __packed; } __packed;
......
...@@ -176,6 +176,8 @@ void opa_vnic_get_vesw_info(struct opa_vnic_adapter *adapter, ...@@ -176,6 +176,8 @@ void opa_vnic_get_vesw_info(struct opa_vnic_adapter *adapter,
for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++) for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++)
info->u_ucast_dlid[i] = cpu_to_be32(src->u_ucast_dlid[i]); info->u_ucast_dlid[i] = cpu_to_be32(src->u_ucast_dlid[i]);
info->rc = cpu_to_be32(src->rc);
memcpy(info->rsvd3, src->rsvd3, ARRAY_SIZE(src->rsvd3)); memcpy(info->rsvd3, src->rsvd3, ARRAY_SIZE(src->rsvd3));
info->eth_mtu = cpu_to_be16(src->eth_mtu); info->eth_mtu = cpu_to_be16(src->eth_mtu);
memcpy(info->rsvd4, src->rsvd4, ARRAY_SIZE(src->rsvd4)); memcpy(info->rsvd4, src->rsvd4, ARRAY_SIZE(src->rsvd4));
...@@ -208,6 +210,8 @@ void opa_vnic_set_vesw_info(struct opa_vnic_adapter *adapter, ...@@ -208,6 +210,8 @@ void opa_vnic_set_vesw_info(struct opa_vnic_adapter *adapter,
for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++) for (i = 0; i < OPA_VESW_MAX_NUM_DEF_PORT; i++)
dst->u_ucast_dlid[i] = be32_to_cpu(info->u_ucast_dlid[i]); dst->u_ucast_dlid[i] = be32_to_cpu(info->u_ucast_dlid[i]);
dst->rc = be32_to_cpu(info->rc);
memcpy(dst->rsvd3, info->rsvd3, ARRAY_SIZE(info->rsvd3)); memcpy(dst->rsvd3, info->rsvd3, ARRAY_SIZE(info->rsvd3));
dst->eth_mtu = be16_to_cpu(info->eth_mtu); dst->eth_mtu = be16_to_cpu(info->eth_mtu);
memcpy(dst->rsvd4, info->rsvd4, ARRAY_SIZE(info->rsvd4)); memcpy(dst->rsvd4, info->rsvd4, ARRAY_SIZE(info->rsvd4));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment