|
@@ -302,7 +302,7 @@ void _c4iw_free_ep(struct kref *kref)
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
(struct sockaddr_in6 *)
|
|
(struct sockaddr_in6 *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
|
|
|
|
cxgb4_clip_release(
|
|
cxgb4_clip_release(
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
@@ -314,12 +314,6 @@ void _c4iw_free_ep(struct kref *kref)
|
|
dst_release(ep->dst);
|
|
dst_release(ep->dst);
|
|
cxgb4_l2t_release(ep->l2t);
|
|
cxgb4_l2t_release(ep->l2t);
|
|
}
|
|
}
|
|
- if (test_bit(RELEASE_MAPINFO, &ep->com.flags)) {
|
|
|
|
- print_addr(&ep->com, __func__, "remove_mapinfo/mapping");
|
|
|
|
- iwpm_remove_mapinfo(&ep->com.local_addr,
|
|
|
|
- &ep->com.mapped_local_addr);
|
|
|
|
- iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
|
|
|
|
- }
|
|
|
|
kfree(ep);
|
|
kfree(ep);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -455,7 +449,7 @@ static void act_open_req_arp_failure(void *handle, struct sk_buff *skb)
|
|
state_set(&ep->com, DEAD);
|
|
state_set(&ep->com, DEAD);
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
- (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
|
|
+ (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
}
|
|
}
|
|
@@ -485,12 +479,19 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
|
|
unsigned int flowclen = 80;
|
|
unsigned int flowclen = 80;
|
|
struct fw_flowc_wr *flowc;
|
|
struct fw_flowc_wr *flowc;
|
|
int i;
|
|
int i;
|
|
|
|
+ u16 vlan = ep->l2t->vlan;
|
|
|
|
+ int nparams;
|
|
|
|
+
|
|
|
|
+ if (vlan == CPL_L2T_VLAN_NONE)
|
|
|
|
+ nparams = 8;
|
|
|
|
+ else
|
|
|
|
+ nparams = 9;
|
|
|
|
|
|
skb = get_skb(skb, flowclen, GFP_KERNEL);
|
|
skb = get_skb(skb, flowclen, GFP_KERNEL);
|
|
flowc = (struct fw_flowc_wr *)__skb_put(skb, flowclen);
|
|
flowc = (struct fw_flowc_wr *)__skb_put(skb, flowclen);
|
|
|
|
|
|
flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) |
|
|
flowc->op_to_nparams = cpu_to_be32(FW_WR_OP_V(FW_FLOWC_WR) |
|
|
- FW_FLOWC_WR_NPARAMS_V(8));
|
|
|
|
|
|
+ FW_FLOWC_WR_NPARAMS_V(nparams));
|
|
flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(flowclen,
|
|
flowc->flowid_len16 = cpu_to_be32(FW_WR_LEN16_V(DIV_ROUND_UP(flowclen,
|
|
16)) | FW_WR_FLOWID_V(ep->hwtid));
|
|
16)) | FW_WR_FLOWID_V(ep->hwtid));
|
|
|
|
|
|
@@ -511,9 +512,17 @@ static void send_flowc(struct c4iw_ep *ep, struct sk_buff *skb)
|
|
flowc->mnemval[6].val = cpu_to_be32(ep->snd_win);
|
|
flowc->mnemval[6].val = cpu_to_be32(ep->snd_win);
|
|
flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS;
|
|
flowc->mnemval[7].mnemonic = FW_FLOWC_MNEM_MSS;
|
|
flowc->mnemval[7].val = cpu_to_be32(ep->emss);
|
|
flowc->mnemval[7].val = cpu_to_be32(ep->emss);
|
|
- /* Pad WR to 16 byte boundary */
|
|
|
|
- flowc->mnemval[8].mnemonic = 0;
|
|
|
|
- flowc->mnemval[8].val = 0;
|
|
|
|
|
|
+ if (nparams == 9) {
|
|
|
|
+ u16 pri;
|
|
|
|
+
|
|
|
|
+ pri = (vlan & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT;
|
|
|
|
+ flowc->mnemval[8].mnemonic = FW_FLOWC_MNEM_SCHEDCLASS;
|
|
|
|
+ flowc->mnemval[8].val = cpu_to_be32(pri);
|
|
|
|
+ } else {
|
|
|
|
+ /* Pad WR to 16 byte boundary */
|
|
|
|
+ flowc->mnemval[8].mnemonic = 0;
|
|
|
|
+ flowc->mnemval[8].val = 0;
|
|
|
|
+ }
|
|
for (i = 0; i < 9; i++) {
|
|
for (i = 0; i < 9; i++) {
|
|
flowc->mnemval[i].r4[0] = 0;
|
|
flowc->mnemval[i].r4[0] = 0;
|
|
flowc->mnemval[i].r4[1] = 0;
|
|
flowc->mnemval[i].r4[1] = 0;
|
|
@@ -568,54 +577,6 @@ static int send_abort(struct c4iw_ep *ep, struct sk_buff *skb, gfp_t gfp)
|
|
return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
|
|
return c4iw_l2t_send(&ep->com.dev->rdev, skb, ep->l2t);
|
|
}
|
|
}
|
|
|
|
|
|
-/*
|
|
|
|
- * c4iw_form_pm_msg - Form a port mapper message with mapping info
|
|
|
|
- */
|
|
|
|
-static void c4iw_form_pm_msg(struct c4iw_ep *ep,
|
|
|
|
- struct iwpm_sa_data *pm_msg)
|
|
|
|
-{
|
|
|
|
- memcpy(&pm_msg->loc_addr, &ep->com.local_addr,
|
|
|
|
- sizeof(ep->com.local_addr));
|
|
|
|
- memcpy(&pm_msg->rem_addr, &ep->com.remote_addr,
|
|
|
|
- sizeof(ep->com.remote_addr));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * c4iw_form_reg_msg - Form a port mapper message with dev info
|
|
|
|
- */
|
|
|
|
-static void c4iw_form_reg_msg(struct c4iw_dev *dev,
|
|
|
|
- struct iwpm_dev_data *pm_msg)
|
|
|
|
-{
|
|
|
|
- memcpy(pm_msg->dev_name, dev->ibdev.name, IWPM_DEVNAME_SIZE);
|
|
|
|
- memcpy(pm_msg->if_name, dev->rdev.lldi.ports[0]->name,
|
|
|
|
- IWPM_IFNAME_SIZE);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static void c4iw_record_pm_msg(struct c4iw_ep *ep,
|
|
|
|
- struct iwpm_sa_data *pm_msg)
|
|
|
|
-{
|
|
|
|
- memcpy(&ep->com.mapped_local_addr, &pm_msg->mapped_loc_addr,
|
|
|
|
- sizeof(ep->com.mapped_local_addr));
|
|
|
|
- memcpy(&ep->com.mapped_remote_addr, &pm_msg->mapped_rem_addr,
|
|
|
|
- sizeof(ep->com.mapped_remote_addr));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static int get_remote_addr(struct c4iw_ep *parent_ep, struct c4iw_ep *child_ep)
|
|
|
|
-{
|
|
|
|
- int ret;
|
|
|
|
-
|
|
|
|
- print_addr(&parent_ep->com, __func__, "get_remote_addr parent_ep ");
|
|
|
|
- print_addr(&child_ep->com, __func__, "get_remote_addr child_ep ");
|
|
|
|
-
|
|
|
|
- ret = iwpm_get_remote_info(&parent_ep->com.mapped_local_addr,
|
|
|
|
- &child_ep->com.mapped_remote_addr,
|
|
|
|
- &child_ep->com.remote_addr, RDMA_NL_C4IW);
|
|
|
|
- if (ret)
|
|
|
|
- PDBG("Unable to find remote peer addr info - err %d\n", ret);
|
|
|
|
-
|
|
|
|
- return ret;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static void best_mtu(const unsigned short *mtus, unsigned short mtu,
|
|
static void best_mtu(const unsigned short *mtus, unsigned short mtu,
|
|
unsigned int *idx, int use_ts, int ipv6)
|
|
unsigned int *idx, int use_ts, int ipv6)
|
|
{
|
|
{
|
|
@@ -645,13 +606,13 @@ static int send_connect(struct c4iw_ep *ep)
|
|
int wscale;
|
|
int wscale;
|
|
int win, sizev4, sizev6, wrlen;
|
|
int win, sizev4, sizev6, wrlen;
|
|
struct sockaddr_in *la = (struct sockaddr_in *)
|
|
struct sockaddr_in *la = (struct sockaddr_in *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
struct sockaddr_in *ra = (struct sockaddr_in *)
|
|
struct sockaddr_in *ra = (struct sockaddr_in *)
|
|
- &ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ &ep->com.remote_addr;
|
|
struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)
|
|
struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
|
|
struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)
|
|
- &ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ &ep->com.remote_addr;
|
|
int ret;
|
|
int ret;
|
|
enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type;
|
|
enum chip_type adapter_type = ep->com.dev->rdev.lldi.adapter_type;
|
|
u32 isn = (prandom_u32() & ~7UL) - 1;
|
|
u32 isn = (prandom_u32() & ~7UL) - 1;
|
|
@@ -710,7 +671,7 @@ static int send_connect(struct c4iw_ep *ep)
|
|
L2T_IDX_V(ep->l2t->idx) |
|
|
L2T_IDX_V(ep->l2t->idx) |
|
|
TX_CHAN_V(ep->tx_chan) |
|
|
TX_CHAN_V(ep->tx_chan) |
|
|
SMAC_SEL_V(ep->smac_idx) |
|
|
SMAC_SEL_V(ep->smac_idx) |
|
|
- DSCP_V(ep->tos) |
|
|
|
|
|
|
+ DSCP_V(ep->tos >> 2) |
|
|
ULP_MODE_V(ULP_MODE_TCPDDP) |
|
|
ULP_MODE_V(ULP_MODE_TCPDDP) |
|
|
RCV_BUFSIZ_V(win);
|
|
RCV_BUFSIZ_V(win);
|
|
opt2 = RX_CHANNEL_V(0) |
|
|
opt2 = RX_CHANNEL_V(0) |
|
|
@@ -1829,10 +1790,10 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid)
|
|
req->le.filter = cpu_to_be32(cxgb4_select_ntuple(
|
|
req->le.filter = cpu_to_be32(cxgb4_select_ntuple(
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
ep->l2t));
|
|
ep->l2t));
|
|
- sin = (struct sockaddr_in *)&ep->com.mapped_local_addr;
|
|
|
|
|
|
+ sin = (struct sockaddr_in *)&ep->com.local_addr;
|
|
req->le.lport = sin->sin_port;
|
|
req->le.lport = sin->sin_port;
|
|
req->le.u.ipv4.lip = sin->sin_addr.s_addr;
|
|
req->le.u.ipv4.lip = sin->sin_addr.s_addr;
|
|
- sin = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ sin = (struct sockaddr_in *)&ep->com.remote_addr;
|
|
req->le.pport = sin->sin_port;
|
|
req->le.pport = sin->sin_port;
|
|
req->le.u.ipv4.pip = sin->sin_addr.s_addr;
|
|
req->le.u.ipv4.pip = sin->sin_addr.s_addr;
|
|
req->tcb.t_state_to_astid =
|
|
req->tcb.t_state_to_astid =
|
|
@@ -1864,7 +1825,7 @@ static void send_fw_act_open_req(struct c4iw_ep *ep, unsigned int atid)
|
|
L2T_IDX_V(ep->l2t->idx) |
|
|
L2T_IDX_V(ep->l2t->idx) |
|
|
TX_CHAN_V(ep->tx_chan) |
|
|
TX_CHAN_V(ep->tx_chan) |
|
|
SMAC_SEL_V(ep->smac_idx) |
|
|
SMAC_SEL_V(ep->smac_idx) |
|
|
- DSCP_V(ep->tos) |
|
|
|
|
|
|
+ DSCP_V(ep->tos >> 2) |
|
|
ULP_MODE_V(ULP_MODE_TCPDDP) |
|
|
ULP_MODE_V(ULP_MODE_TCPDDP) |
|
|
RCV_BUFSIZ_V(win));
|
|
RCV_BUFSIZ_V(win));
|
|
req->tcb.opt2 = (__force __be32) (PACE_V(1) |
|
|
req->tcb.opt2 = (__force __be32) (PACE_V(1) |
|
|
@@ -1928,7 +1889,7 @@ static void set_tcp_window(struct c4iw_ep *ep, struct port_info *pi)
|
|
|
|
|
|
static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
|
|
static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
|
|
struct dst_entry *dst, struct c4iw_dev *cdev,
|
|
struct dst_entry *dst, struct c4iw_dev *cdev,
|
|
- bool clear_mpa_v1, enum chip_type adapter_type)
|
|
|
|
|
|
+ bool clear_mpa_v1, enum chip_type adapter_type, u8 tos)
|
|
{
|
|
{
|
|
struct neighbour *n;
|
|
struct neighbour *n;
|
|
int err, step;
|
|
int err, step;
|
|
@@ -1958,7 +1919,7 @@ static int import_ep(struct c4iw_ep *ep, int iptype, __u8 *peer_ip,
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,
|
|
ep->l2t = cxgb4_l2t_get(cdev->rdev.lldi.l2t,
|
|
- n, pdev, 0);
|
|
|
|
|
|
+ n, pdev, rt_tos2priority(tos));
|
|
if (!ep->l2t)
|
|
if (!ep->l2t)
|
|
goto out;
|
|
goto out;
|
|
ep->mtu = pdev->mtu;
|
|
ep->mtu = pdev->mtu;
|
|
@@ -2013,13 +1974,13 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
|
{
|
|
{
|
|
int err = 0;
|
|
int err = 0;
|
|
struct sockaddr_in *laddr = (struct sockaddr_in *)
|
|
struct sockaddr_in *laddr = (struct sockaddr_in *)
|
|
- &ep->com.cm_id->local_addr;
|
|
|
|
|
|
+ &ep->com.cm_id->m_local_addr;
|
|
struct sockaddr_in *raddr = (struct sockaddr_in *)
|
|
struct sockaddr_in *raddr = (struct sockaddr_in *)
|
|
- &ep->com.cm_id->remote_addr;
|
|
|
|
|
|
+ &ep->com.cm_id->m_remote_addr;
|
|
struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)
|
|
struct sockaddr_in6 *laddr6 = (struct sockaddr_in6 *)
|
|
- &ep->com.cm_id->local_addr;
|
|
|
|
|
|
+ &ep->com.cm_id->m_local_addr;
|
|
struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)
|
|
struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)
|
|
- &ep->com.cm_id->remote_addr;
|
|
|
|
|
|
+ &ep->com.cm_id->m_remote_addr;
|
|
int iptype;
|
|
int iptype;
|
|
__u8 *ra;
|
|
__u8 *ra;
|
|
|
|
|
|
@@ -2038,10 +1999,10 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
|
insert_handle(ep->com.dev, &ep->com.dev->atid_idr, ep, ep->atid);
|
|
insert_handle(ep->com.dev, &ep->com.dev->atid_idr, ep, ep->atid);
|
|
|
|
|
|
/* find a route */
|
|
/* find a route */
|
|
- if (ep->com.cm_id->local_addr.ss_family == AF_INET) {
|
|
|
|
|
|
+ if (ep->com.cm_id->m_local_addr.ss_family == AF_INET) {
|
|
ep->dst = find_route(ep->com.dev, laddr->sin_addr.s_addr,
|
|
ep->dst = find_route(ep->com.dev, laddr->sin_addr.s_addr,
|
|
raddr->sin_addr.s_addr, laddr->sin_port,
|
|
raddr->sin_addr.s_addr, laddr->sin_port,
|
|
- raddr->sin_port, 0);
|
|
|
|
|
|
+ raddr->sin_port, ep->com.cm_id->tos);
|
|
iptype = 4;
|
|
iptype = 4;
|
|
ra = (__u8 *)&raddr->sin_addr;
|
|
ra = (__u8 *)&raddr->sin_addr;
|
|
} else {
|
|
} else {
|
|
@@ -2058,7 +2019,8 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
|
goto fail3;
|
|
goto fail3;
|
|
}
|
|
}
|
|
err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, false,
|
|
err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, false,
|
|
- ep->com.dev->rdev.lldi.adapter_type);
|
|
|
|
|
|
+ ep->com.dev->rdev.lldi.adapter_type,
|
|
|
|
+ ep->com.cm_id->tos);
|
|
if (err) {
|
|
if (err) {
|
|
pr_err("%s - cannot alloc l2e.\n", __func__);
|
|
pr_err("%s - cannot alloc l2e.\n", __func__);
|
|
goto fail4;
|
|
goto fail4;
|
|
@@ -2069,7 +2031,7 @@ static int c4iw_reconnect(struct c4iw_ep *ep)
|
|
ep->l2t->idx);
|
|
ep->l2t->idx);
|
|
|
|
|
|
state_set(&ep->com, CONNECTING);
|
|
state_set(&ep->com, CONNECTING);
|
|
- ep->tos = 0;
|
|
|
|
|
|
+ ep->tos = ep->com.cm_id->tos;
|
|
|
|
|
|
/* send connect request to rnic */
|
|
/* send connect request to rnic */
|
|
err = send_connect(ep);
|
|
err = send_connect(ep);
|
|
@@ -2109,10 +2071,10 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
struct sockaddr_in6 *ra6;
|
|
struct sockaddr_in6 *ra6;
|
|
|
|
|
|
ep = lookup_atid(t, atid);
|
|
ep = lookup_atid(t, atid);
|
|
- la = (struct sockaddr_in *)&ep->com.mapped_local_addr;
|
|
|
|
- ra = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
|
|
|
|
- la6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
- ra6 = (struct sockaddr_in6 *)&ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ la = (struct sockaddr_in *)&ep->com.local_addr;
|
|
|
|
+ ra = (struct sockaddr_in *)&ep->com.remote_addr;
|
|
|
|
+ la6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
|
|
+ ra6 = (struct sockaddr_in6 *)&ep->com.remote_addr;
|
|
|
|
|
|
PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid,
|
|
PDBG("%s ep %p atid %u status %u errno %d\n", __func__, ep, atid,
|
|
status, status2errno(status));
|
|
status, status2errno(status));
|
|
@@ -2154,7 +2116,7 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
(struct sockaddr_in6 *)
|
|
(struct sockaddr_in6 *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
cxgb4_clip_release(
|
|
cxgb4_clip_release(
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)
|
|
(const u32 *)
|
|
@@ -2189,7 +2151,7 @@ static int act_open_rpl(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
|
|
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
- (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
|
|
+ (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
}
|
|
}
|
|
@@ -2391,6 +2353,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
u16 peer_mss = ntohs(req->tcpopt.mss);
|
|
u16 peer_mss = ntohs(req->tcpopt.mss);
|
|
int iptype;
|
|
int iptype;
|
|
unsigned short hdrs;
|
|
unsigned short hdrs;
|
|
|
|
+ u8 tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));
|
|
|
|
|
|
parent_ep = lookup_stid(t, stid);
|
|
parent_ep = lookup_stid(t, stid);
|
|
if (!parent_ep) {
|
|
if (!parent_ep) {
|
|
@@ -2399,8 +2362,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
}
|
|
}
|
|
|
|
|
|
if (state_read(&parent_ep->com) != LISTEN) {
|
|
if (state_read(&parent_ep->com) != LISTEN) {
|
|
- printk(KERN_ERR "%s - listening ep not in LISTEN\n",
|
|
|
|
- __func__);
|
|
|
|
|
|
+ PDBG("%s - listening ep not in LISTEN\n", __func__);
|
|
goto reject;
|
|
goto reject;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2415,7 +2377,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
ntohs(peer_port), peer_mss);
|
|
ntohs(peer_port), peer_mss);
|
|
dst = find_route(dev, *(__be32 *)local_ip, *(__be32 *)peer_ip,
|
|
dst = find_route(dev, *(__be32 *)local_ip, *(__be32 *)peer_ip,
|
|
local_port, peer_port,
|
|
local_port, peer_port,
|
|
- PASS_OPEN_TOS_G(ntohl(req->tos_stid)));
|
|
|
|
|
|
+ tos);
|
|
} else {
|
|
} else {
|
|
PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"
|
|
PDBG("%s parent ep %p hwtid %u laddr %pI6 raddr %pI6 lport %d rport %d peer_mss %d\n"
|
|
, __func__, parent_ep, hwtid,
|
|
, __func__, parent_ep, hwtid,
|
|
@@ -2441,7 +2403,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
}
|
|
}
|
|
|
|
|
|
err = import_ep(child_ep, iptype, peer_ip, dst, dev, false,
|
|
err = import_ep(child_ep, iptype, peer_ip, dst, dev, false,
|
|
- parent_ep->com.dev->rdev.lldi.adapter_type);
|
|
|
|
|
|
+ parent_ep->com.dev->rdev.lldi.adapter_type, tos);
|
|
if (err) {
|
|
if (err) {
|
|
printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",
|
|
printk(KERN_ERR MOD "%s - failed to allocate l2t entry!\n",
|
|
__func__);
|
|
__func__);
|
|
@@ -2459,18 +2421,9 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
child_ep->com.dev = dev;
|
|
child_ep->com.dev = dev;
|
|
child_ep->com.cm_id = NULL;
|
|
child_ep->com.cm_id = NULL;
|
|
|
|
|
|
- /*
|
|
|
|
- * The mapped_local and mapped_remote addresses get setup with
|
|
|
|
- * the actual 4-tuple. The local address will be based on the
|
|
|
|
- * actual local address of the connection, but on the port number
|
|
|
|
- * of the parent listening endpoint. The remote address is
|
|
|
|
- * setup based on a query to the IWPM since we don't know what it
|
|
|
|
- * originally was before mapping. If no mapping was done, then
|
|
|
|
- * mapped_remote == remote, and mapped_local == local.
|
|
|
|
- */
|
|
|
|
if (iptype == 4) {
|
|
if (iptype == 4) {
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)
|
|
- &child_ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &child_ep->com.local_addr;
|
|
|
|
|
|
sin->sin_family = PF_INET;
|
|
sin->sin_family = PF_INET;
|
|
sin->sin_port = local_port;
|
|
sin->sin_port = local_port;
|
|
@@ -2482,12 +2435,12 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
&parent_ep->com.local_addr)->sin_port;
|
|
&parent_ep->com.local_addr)->sin_port;
|
|
sin->sin_addr.s_addr = *(__be32 *)local_ip;
|
|
sin->sin_addr.s_addr = *(__be32 *)local_ip;
|
|
|
|
|
|
- sin = (struct sockaddr_in *)&child_ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ sin = (struct sockaddr_in *)&child_ep->com.remote_addr;
|
|
sin->sin_family = PF_INET;
|
|
sin->sin_family = PF_INET;
|
|
sin->sin_port = peer_port;
|
|
sin->sin_port = peer_port;
|
|
sin->sin_addr.s_addr = *(__be32 *)peer_ip;
|
|
sin->sin_addr.s_addr = *(__be32 *)peer_ip;
|
|
} else {
|
|
} else {
|
|
- sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr;
|
|
|
|
|
|
+ sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;
|
|
sin6->sin6_family = PF_INET6;
|
|
sin6->sin6_family = PF_INET6;
|
|
sin6->sin6_port = local_port;
|
|
sin6->sin6_port = local_port;
|
|
memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
|
|
memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
|
|
@@ -2498,18 +2451,15 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
&parent_ep->com.local_addr)->sin6_port;
|
|
&parent_ep->com.local_addr)->sin6_port;
|
|
memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
|
|
memcpy(sin6->sin6_addr.s6_addr, local_ip, 16);
|
|
|
|
|
|
- sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ sin6 = (struct sockaddr_in6 *)&child_ep->com.remote_addr;
|
|
sin6->sin6_family = PF_INET6;
|
|
sin6->sin6_family = PF_INET6;
|
|
sin6->sin6_port = peer_port;
|
|
sin6->sin6_port = peer_port;
|
|
memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16);
|
|
memcpy(sin6->sin6_addr.s6_addr, peer_ip, 16);
|
|
}
|
|
}
|
|
- memcpy(&child_ep->com.remote_addr, &child_ep->com.mapped_remote_addr,
|
|
|
|
- sizeof(child_ep->com.remote_addr));
|
|
|
|
- get_remote_addr(parent_ep, child_ep);
|
|
|
|
|
|
|
|
c4iw_get_ep(&parent_ep->com);
|
|
c4iw_get_ep(&parent_ep->com);
|
|
child_ep->parent_ep = parent_ep;
|
|
child_ep->parent_ep = parent_ep;
|
|
- child_ep->tos = PASS_OPEN_TOS_G(ntohl(req->tos_stid));
|
|
|
|
|
|
+ child_ep->tos = tos;
|
|
child_ep->dst = dst;
|
|
child_ep->dst = dst;
|
|
child_ep->hwtid = hwtid;
|
|
child_ep->hwtid = hwtid;
|
|
|
|
|
|
@@ -2522,7 +2472,7 @@ static int pass_accept_req(struct c4iw_dev *dev, struct sk_buff *skb)
|
|
accept_cr(child_ep, skb, req);
|
|
accept_cr(child_ep, skb, req);
|
|
set_bit(PASS_ACCEPT_REQ, &child_ep->com.history);
|
|
set_bit(PASS_ACCEPT_REQ, &child_ep->com.history);
|
|
if (iptype == 6) {
|
|
if (iptype == 6) {
|
|
- sin6 = (struct sockaddr_in6 *)&child_ep->com.mapped_local_addr;
|
|
|
|
|
|
+ sin6 = (struct sockaddr_in6 *)&child_ep->com.local_addr;
|
|
cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0],
|
|
cxgb4_clip_get(child_ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
}
|
|
}
|
|
@@ -2765,7 +2715,7 @@ out:
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
(struct sockaddr_in6 *)
|
|
(struct sockaddr_in6 *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
cxgb4_clip_release(
|
|
cxgb4_clip_release(
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr,
|
|
(const u32 *)&sin6->sin6_addr.s6_addr,
|
|
@@ -3026,8 +2976,8 @@ static int pick_local_ipaddrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)
|
|
{
|
|
{
|
|
struct in_device *ind;
|
|
struct in_device *ind;
|
|
int found = 0;
|
|
int found = 0;
|
|
- struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->local_addr;
|
|
|
|
- struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->remote_addr;
|
|
|
|
|
|
+ struct sockaddr_in *laddr = (struct sockaddr_in *)&cm_id->m_local_addr;
|
|
|
|
+ struct sockaddr_in *raddr = (struct sockaddr_in *)&cm_id->m_remote_addr;
|
|
|
|
|
|
ind = in_dev_get(dev->rdev.lldi.ports[0]);
|
|
ind = in_dev_get(dev->rdev.lldi.ports[0]);
|
|
if (!ind)
|
|
if (!ind)
|
|
@@ -3072,8 +3022,8 @@ static int get_lladdr(struct net_device *dev, struct in6_addr *addr,
|
|
static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)
|
|
static int pick_local_ip6addrs(struct c4iw_dev *dev, struct iw_cm_id *cm_id)
|
|
{
|
|
{
|
|
struct in6_addr uninitialized_var(addr);
|
|
struct in6_addr uninitialized_var(addr);
|
|
- struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->local_addr;
|
|
|
|
- struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->remote_addr;
|
|
|
|
|
|
+ struct sockaddr_in6 *la6 = (struct sockaddr_in6 *)&cm_id->m_local_addr;
|
|
|
|
+ struct sockaddr_in6 *ra6 = (struct sockaddr_in6 *)&cm_id->m_remote_addr;
|
|
|
|
|
|
if (!get_lladdr(dev->rdev.lldi.ports[0], &addr, IFA_F_TENTATIVE)) {
|
|
if (!get_lladdr(dev->rdev.lldi.ports[0], &addr, IFA_F_TENTATIVE)) {
|
|
memcpy(la6->sin6_addr.s6_addr, &addr, 16);
|
|
memcpy(la6->sin6_addr.s6_addr, &addr, 16);
|
|
@@ -3092,11 +3042,8 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
struct sockaddr_in *raddr;
|
|
struct sockaddr_in *raddr;
|
|
struct sockaddr_in6 *laddr6;
|
|
struct sockaddr_in6 *laddr6;
|
|
struct sockaddr_in6 *raddr6;
|
|
struct sockaddr_in6 *raddr6;
|
|
- struct iwpm_dev_data pm_reg_msg;
|
|
|
|
- struct iwpm_sa_data pm_msg;
|
|
|
|
__u8 *ra;
|
|
__u8 *ra;
|
|
int iptype;
|
|
int iptype;
|
|
- int iwpm_err = 0;
|
|
|
|
|
|
|
|
if ((conn_param->ord > cur_max_read_depth(dev)) ||
|
|
if ((conn_param->ord > cur_max_read_depth(dev)) ||
|
|
(conn_param->ird > cur_max_read_depth(dev))) {
|
|
(conn_param->ird > cur_max_read_depth(dev))) {
|
|
@@ -3144,47 +3091,17 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
}
|
|
}
|
|
insert_handle(dev, &dev->atid_idr, ep, ep->atid);
|
|
insert_handle(dev, &dev->atid_idr, ep, ep->atid);
|
|
|
|
|
|
- memcpy(&ep->com.local_addr, &cm_id->local_addr,
|
|
|
|
|
|
+ memcpy(&ep->com.local_addr, &cm_id->m_local_addr,
|
|
sizeof(ep->com.local_addr));
|
|
sizeof(ep->com.local_addr));
|
|
- memcpy(&ep->com.remote_addr, &cm_id->remote_addr,
|
|
|
|
|
|
+ memcpy(&ep->com.remote_addr, &cm_id->m_remote_addr,
|
|
sizeof(ep->com.remote_addr));
|
|
sizeof(ep->com.remote_addr));
|
|
|
|
|
|
- /* No port mapper available, go with the specified peer information */
|
|
|
|
- memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
|
|
|
|
- sizeof(ep->com.mapped_local_addr));
|
|
|
|
- memcpy(&ep->com.mapped_remote_addr, &cm_id->remote_addr,
|
|
|
|
- sizeof(ep->com.mapped_remote_addr));
|
|
|
|
-
|
|
|
|
- c4iw_form_reg_msg(dev, &pm_reg_msg);
|
|
|
|
- iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
|
|
|
|
- if (iwpm_err) {
|
|
|
|
- PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
|
|
|
|
- __func__, iwpm_err);
|
|
|
|
- }
|
|
|
|
- if (iwpm_valid_pid() && !iwpm_err) {
|
|
|
|
- c4iw_form_pm_msg(ep, &pm_msg);
|
|
|
|
- iwpm_err = iwpm_add_and_query_mapping(&pm_msg, RDMA_NL_C4IW);
|
|
|
|
- if (iwpm_err)
|
|
|
|
- PDBG("%s: Port Mapper query fail (err = %d).\n",
|
|
|
|
- __func__, iwpm_err);
|
|
|
|
- else
|
|
|
|
- c4iw_record_pm_msg(ep, &pm_msg);
|
|
|
|
- }
|
|
|
|
- if (iwpm_create_mapinfo(&ep->com.local_addr,
|
|
|
|
- &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
|
|
|
|
- iwpm_remove_mapping(&ep->com.local_addr, RDMA_NL_C4IW);
|
|
|
|
- err = -ENOMEM;
|
|
|
|
- goto fail1;
|
|
|
|
- }
|
|
|
|
- print_addr(&ep->com, __func__, "add_query/create_mapinfo");
|
|
|
|
- set_bit(RELEASE_MAPINFO, &ep->com.flags);
|
|
|
|
-
|
|
|
|
- laddr = (struct sockaddr_in *)&ep->com.mapped_local_addr;
|
|
|
|
- raddr = (struct sockaddr_in *)&ep->com.mapped_remote_addr;
|
|
|
|
- laddr6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
- raddr6 = (struct sockaddr_in6 *) &ep->com.mapped_remote_addr;
|
|
|
|
|
|
+ laddr = (struct sockaddr_in *)&ep->com.local_addr;
|
|
|
|
+ raddr = (struct sockaddr_in *)&ep->com.remote_addr;
|
|
|
|
+ laddr6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
|
|
+ raddr6 = (struct sockaddr_in6 *) &ep->com.remote_addr;
|
|
|
|
|
|
- if (cm_id->remote_addr.ss_family == AF_INET) {
|
|
|
|
|
|
+ if (cm_id->m_remote_addr.ss_family == AF_INET) {
|
|
iptype = 4;
|
|
iptype = 4;
|
|
ra = (__u8 *)&raddr->sin_addr;
|
|
ra = (__u8 *)&raddr->sin_addr;
|
|
|
|
|
|
@@ -3203,7 +3120,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
ra, ntohs(raddr->sin_port));
|
|
ra, ntohs(raddr->sin_port));
|
|
ep->dst = find_route(dev, laddr->sin_addr.s_addr,
|
|
ep->dst = find_route(dev, laddr->sin_addr.s_addr,
|
|
raddr->sin_addr.s_addr, laddr->sin_port,
|
|
raddr->sin_addr.s_addr, laddr->sin_port,
|
|
- raddr->sin_port, 0);
|
|
|
|
|
|
+ raddr->sin_port, cm_id->tos);
|
|
} else {
|
|
} else {
|
|
iptype = 6;
|
|
iptype = 6;
|
|
ra = (__u8 *)&raddr6->sin6_addr;
|
|
ra = (__u8 *)&raddr6->sin6_addr;
|
|
@@ -3234,7 +3151,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
}
|
|
}
|
|
|
|
|
|
err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true,
|
|
err = import_ep(ep, iptype, ra, ep->dst, ep->com.dev, true,
|
|
- ep->com.dev->rdev.lldi.adapter_type);
|
|
|
|
|
|
+ ep->com.dev->rdev.lldi.adapter_type, cm_id->tos);
|
|
if (err) {
|
|
if (err) {
|
|
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
|
|
printk(KERN_ERR MOD "%s - cannot alloc l2e.\n", __func__);
|
|
goto fail3;
|
|
goto fail3;
|
|
@@ -3245,7 +3162,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
|
|
ep->l2t->idx);
|
|
ep->l2t->idx);
|
|
|
|
|
|
state_set(&ep->com, CONNECTING);
|
|
state_set(&ep->com, CONNECTING);
|
|
- ep->tos = 0;
|
|
|
|
|
|
+ ep->tos = cm_id->tos;
|
|
|
|
|
|
/* send connect request to rnic */
|
|
/* send connect request to rnic */
|
|
err = send_connect(ep);
|
|
err = send_connect(ep);
|
|
@@ -3269,7 +3186,7 @@ static int create_server6(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
|
|
{
|
|
{
|
|
int err;
|
|
int err;
|
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
|
|
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
|
|
|
|
if (ipv6_addr_type(&sin6->sin6_addr) != IPV6_ADDR_ANY) {
|
|
if (ipv6_addr_type(&sin6->sin6_addr) != IPV6_ADDR_ANY) {
|
|
err = cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],
|
|
err = cxgb4_clip_get(ep->com.dev->rdev.lldi.ports[0],
|
|
@@ -3302,7 +3219,7 @@ static int create_server4(struct c4iw_dev *dev, struct c4iw_listen_ep *ep)
|
|
{
|
|
{
|
|
int err;
|
|
int err;
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)
|
|
struct sockaddr_in *sin = (struct sockaddr_in *)
|
|
- &ep->com.mapped_local_addr;
|
|
|
|
|
|
+ &ep->com.local_addr;
|
|
|
|
|
|
if (dev->rdev.lldi.enable_fw_ofld_conn) {
|
|
if (dev->rdev.lldi.enable_fw_ofld_conn) {
|
|
do {
|
|
do {
|
|
@@ -3343,9 +3260,6 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
|
|
int err = 0;
|
|
int err = 0;
|
|
struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
|
|
struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
|
|
struct c4iw_listen_ep *ep;
|
|
struct c4iw_listen_ep *ep;
|
|
- struct iwpm_dev_data pm_reg_msg;
|
|
|
|
- struct iwpm_sa_data pm_msg;
|
|
|
|
- int iwpm_err = 0;
|
|
|
|
|
|
|
|
might_sleep();
|
|
might_sleep();
|
|
|
|
|
|
@@ -3360,7 +3274,7 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
|
|
ep->com.cm_id = cm_id;
|
|
ep->com.cm_id = cm_id;
|
|
ep->com.dev = dev;
|
|
ep->com.dev = dev;
|
|
ep->backlog = backlog;
|
|
ep->backlog = backlog;
|
|
- memcpy(&ep->com.local_addr, &cm_id->local_addr,
|
|
|
|
|
|
+ memcpy(&ep->com.local_addr, &cm_id->m_local_addr,
|
|
sizeof(ep->com.local_addr));
|
|
sizeof(ep->com.local_addr));
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -3369,10 +3283,10 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
|
|
if (dev->rdev.lldi.enable_fw_ofld_conn &&
|
|
if (dev->rdev.lldi.enable_fw_ofld_conn &&
|
|
ep->com.local_addr.ss_family == AF_INET)
|
|
ep->com.local_addr.ss_family == AF_INET)
|
|
ep->stid = cxgb4_alloc_sftid(dev->rdev.lldi.tids,
|
|
ep->stid = cxgb4_alloc_sftid(dev->rdev.lldi.tids,
|
|
- cm_id->local_addr.ss_family, ep);
|
|
|
|
|
|
+ cm_id->m_local_addr.ss_family, ep);
|
|
else
|
|
else
|
|
ep->stid = cxgb4_alloc_stid(dev->rdev.lldi.tids,
|
|
ep->stid = cxgb4_alloc_stid(dev->rdev.lldi.tids,
|
|
- cm_id->local_addr.ss_family, ep);
|
|
|
|
|
|
+ cm_id->m_local_addr.ss_family, ep);
|
|
|
|
|
|
if (ep->stid == -1) {
|
|
if (ep->stid == -1) {
|
|
printk(KERN_ERR MOD "%s - cannot alloc stid.\n", __func__);
|
|
printk(KERN_ERR MOD "%s - cannot alloc stid.\n", __func__);
|
|
@@ -3381,36 +3295,9 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
|
|
}
|
|
}
|
|
insert_handle(dev, &dev->stid_idr, ep, ep->stid);
|
|
insert_handle(dev, &dev->stid_idr, ep, ep->stid);
|
|
|
|
|
|
- /* No port mapper available, go with the specified info */
|
|
|
|
- memcpy(&ep->com.mapped_local_addr, &cm_id->local_addr,
|
|
|
|
- sizeof(ep->com.mapped_local_addr));
|
|
|
|
-
|
|
|
|
- c4iw_form_reg_msg(dev, &pm_reg_msg);
|
|
|
|
- iwpm_err = iwpm_register_pid(&pm_reg_msg, RDMA_NL_C4IW);
|
|
|
|
- if (iwpm_err) {
|
|
|
|
- PDBG("%s: Port Mapper reg pid fail (err = %d).\n",
|
|
|
|
- __func__, iwpm_err);
|
|
|
|
- }
|
|
|
|
- if (iwpm_valid_pid() && !iwpm_err) {
|
|
|
|
- memcpy(&pm_msg.loc_addr, &ep->com.local_addr,
|
|
|
|
- sizeof(ep->com.local_addr));
|
|
|
|
- iwpm_err = iwpm_add_mapping(&pm_msg, RDMA_NL_C4IW);
|
|
|
|
- if (iwpm_err)
|
|
|
|
- PDBG("%s: Port Mapper query fail (err = %d).\n",
|
|
|
|
- __func__, iwpm_err);
|
|
|
|
- else
|
|
|
|
- memcpy(&ep->com.mapped_local_addr,
|
|
|
|
- &pm_msg.mapped_loc_addr,
|
|
|
|
- sizeof(ep->com.mapped_local_addr));
|
|
|
|
- }
|
|
|
|
- if (iwpm_create_mapinfo(&ep->com.local_addr,
|
|
|
|
- &ep->com.mapped_local_addr, RDMA_NL_C4IW)) {
|
|
|
|
- err = -ENOMEM;
|
|
|
|
- goto fail3;
|
|
|
|
- }
|
|
|
|
- print_addr(&ep->com, __func__, "add_mapping/create_mapinfo");
|
|
|
|
|
|
+ memcpy(&ep->com.local_addr, &cm_id->m_local_addr,
|
|
|
|
+ sizeof(ep->com.local_addr));
|
|
|
|
|
|
- set_bit(RELEASE_MAPINFO, &ep->com.flags);
|
|
|
|
state_set(&ep->com, LISTEN);
|
|
state_set(&ep->com, LISTEN);
|
|
if (ep->com.local_addr.ss_family == AF_INET)
|
|
if (ep->com.local_addr.ss_family == AF_INET)
|
|
err = create_server4(dev, ep);
|
|
err = create_server4(dev, ep);
|
|
@@ -3421,7 +3308,6 @@ int c4iw_create_listen(struct iw_cm_id *cm_id, int backlog)
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
-fail3:
|
|
|
|
cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
|
|
cxgb4_free_stid(ep->com.dev->rdev.lldi.tids, ep->stid,
|
|
ep->com.local_addr.ss_family);
|
|
ep->com.local_addr.ss_family);
|
|
fail2:
|
|
fail2:
|
|
@@ -3456,7 +3342,7 @@ int c4iw_destroy_listen(struct iw_cm_id *cm_id)
|
|
goto done;
|
|
goto done;
|
|
err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait,
|
|
err = c4iw_wait_for_reply(&ep->com.dev->rdev, &ep->com.wr_wait,
|
|
0, 0, __func__);
|
|
0, 0, __func__);
|
|
- sin6 = (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
|
|
+ sin6 = (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
}
|
|
}
|
|
@@ -3580,7 +3466,7 @@ static void active_ofld_conn_reply(struct c4iw_dev *dev, struct sk_buff *skb,
|
|
state_set(&ep->com, DEAD);
|
|
state_set(&ep->com, DEAD);
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
if (ep->com.remote_addr.ss_family == AF_INET6) {
|
|
struct sockaddr_in6 *sin6 =
|
|
struct sockaddr_in6 *sin6 =
|
|
- (struct sockaddr_in6 *)&ep->com.mapped_local_addr;
|
|
|
|
|
|
+ (struct sockaddr_in6 *)&ep->com.local_addr;
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
cxgb4_clip_release(ep->com.dev->rdev.lldi.ports[0],
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
(const u32 *)&sin6->sin6_addr.s6_addr, 1);
|
|
}
|
|
}
|