Commit 20c61f7e authored by Ismail, Mustafa's avatar Ismail, Mustafa Committed by Doug Ledford

RDMA/i40iw: Fix endian issues and warnings

Fix endian warnings and errors due to u32 stored to u16.
Reported-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarMustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: default avatarFaisal Latif <faisal.latif@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent b7aee855
...@@ -391,7 +391,7 @@ void i40iw_flush_wqes(struct i40iw_device *iwdev, ...@@ -391,7 +391,7 @@ void i40iw_flush_wqes(struct i40iw_device *iwdev,
void i40iw_manage_arp_cache(struct i40iw_device *iwdev, void i40iw_manage_arp_cache(struct i40iw_device *iwdev,
unsigned char *mac_addr, unsigned char *mac_addr,
__be32 *ip_addr, u32 *ip_addr,
bool ipv4, bool ipv4,
u32 action); u32 action);
...@@ -549,7 +549,7 @@ enum i40iw_status_code i40iw_hw_flush_wqes(struct i40iw_device *iwdev, ...@@ -549,7 +549,7 @@ enum i40iw_status_code i40iw_hw_flush_wqes(struct i40iw_device *iwdev,
struct i40iw_qp_flush_info *info, struct i40iw_qp_flush_info *info,
bool wait); bool wait);
void i40iw_copy_ip_ntohl(u32 *dst, u32 *src); void i40iw_copy_ip_ntohl(u32 *dst, __be32 *src);
struct ib_mr *i40iw_reg_phys_mr(struct ib_pd *ib_pd, struct ib_mr *i40iw_reg_phys_mr(struct ib_pd *ib_pd,
u64 addr, u64 addr,
u64 size, u64 size,
......
...@@ -771,6 +771,7 @@ static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node, ...@@ -771,6 +771,7 @@ static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node,
{ {
struct ietf_mpa_v2 *mpa_frame = (struct ietf_mpa_v2 *)start_addr; struct ietf_mpa_v2 *mpa_frame = (struct ietf_mpa_v2 *)start_addr;
struct ietf_rtr_msg *rtr_msg = &mpa_frame->rtr_msg; struct ietf_rtr_msg *rtr_msg = &mpa_frame->rtr_msg;
u16 ctrl_ird, ctrl_ord;
/* initialize the upper 5 bytes of the frame */ /* initialize the upper 5 bytes of the frame */
i40iw_build_mpa_v1(cm_node, start_addr, mpa_key); i40iw_build_mpa_v1(cm_node, start_addr, mpa_key);
...@@ -779,38 +780,38 @@ static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node, ...@@ -779,38 +780,38 @@ static void i40iw_build_mpa_v2(struct i40iw_cm_node *cm_node,
/* initialize RTR msg */ /* initialize RTR msg */
if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) { if (cm_node->mpav2_ird_ord == IETF_NO_IRD_ORD) {
rtr_msg->ctrl_ird = IETF_NO_IRD_ORD; ctrl_ird = IETF_NO_IRD_ORD;
rtr_msg->ctrl_ord = IETF_NO_IRD_ORD; ctrl_ord = IETF_NO_IRD_ORD;
} else { } else {
rtr_msg->ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ? ctrl_ird = (cm_node->ird_size > IETF_NO_IRD_ORD) ?
IETF_NO_IRD_ORD : cm_node->ird_size; IETF_NO_IRD_ORD : cm_node->ird_size;
rtr_msg->ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ? ctrl_ord = (cm_node->ord_size > IETF_NO_IRD_ORD) ?
IETF_NO_IRD_ORD : cm_node->ord_size; IETF_NO_IRD_ORD : cm_node->ord_size;
} }
rtr_msg->ctrl_ird |= IETF_PEER_TO_PEER; ctrl_ird |= IETF_PEER_TO_PEER;
rtr_msg->ctrl_ird |= IETF_FLPDU_ZERO_LEN; ctrl_ird |= IETF_FLPDU_ZERO_LEN;
switch (mpa_key) { switch (mpa_key) {
case MPA_KEY_REQUEST: case MPA_KEY_REQUEST:
rtr_msg->ctrl_ord |= IETF_RDMA0_WRITE; ctrl_ord |= IETF_RDMA0_WRITE;
rtr_msg->ctrl_ord |= IETF_RDMA0_READ; ctrl_ord |= IETF_RDMA0_READ;
break; break;
case MPA_KEY_REPLY: case MPA_KEY_REPLY:
switch (cm_node->send_rdma0_op) { switch (cm_node->send_rdma0_op) {
case SEND_RDMA_WRITE_ZERO: case SEND_RDMA_WRITE_ZERO:
rtr_msg->ctrl_ord |= IETF_RDMA0_WRITE; ctrl_ord |= IETF_RDMA0_WRITE;
break; break;
case SEND_RDMA_READ_ZERO: case SEND_RDMA_READ_ZERO:
rtr_msg->ctrl_ord |= IETF_RDMA0_READ; ctrl_ord |= IETF_RDMA0_READ;
break; break;
} }
break; break;
default: default:
break; break;
} }
rtr_msg->ctrl_ird = htons(rtr_msg->ctrl_ird); rtr_msg->ctrl_ird = htons(ctrl_ird);
rtr_msg->ctrl_ord = htons(rtr_msg->ctrl_ord); rtr_msg->ctrl_ord = htons(ctrl_ord);
} }
/** /**
...@@ -2160,7 +2161,7 @@ static struct i40iw_cm_node *i40iw_make_cm_node( ...@@ -2160,7 +2161,7 @@ static struct i40iw_cm_node *i40iw_make_cm_node(
cm_node->tcp_cntxt.rcv_wnd = cm_node->tcp_cntxt.rcv_wnd =
I40IW_CM_DEFAULT_RCV_WND_SCALED >> I40IW_CM_DEFAULT_RCV_WND_SCALE; I40IW_CM_DEFAULT_RCV_WND_SCALED >> I40IW_CM_DEFAULT_RCV_WND_SCALE;
ts = current_kernel_time(); ts = current_kernel_time();
cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec); cm_node->tcp_cntxt.loc_seq_num = ts.tv_nsec;
cm_node->tcp_cntxt.mss = iwdev->mss; cm_node->tcp_cntxt.mss = iwdev->mss;
cm_node->iwdev = iwdev; cm_node->iwdev = iwdev;
...@@ -2234,7 +2235,7 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) ...@@ -2234,7 +2235,7 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node)
if (cm_node->listener) { if (cm_node->listener) {
i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true); i40iw_dec_refcnt_listen(cm_core, cm_node->listener, 0, true);
} else { } else {
if (!i40iw_listen_port_in_use(cm_core, htons(cm_node->loc_port)) && if (!i40iw_listen_port_in_use(cm_core, cm_node->loc_port) &&
cm_node->apbvt_set && cm_node->iwdev) { cm_node->apbvt_set && cm_node->iwdev) {
i40iw_manage_apbvt(cm_node->iwdev, i40iw_manage_apbvt(cm_node->iwdev,
cm_node->loc_port, cm_node->loc_port,
...@@ -2921,7 +2922,6 @@ static struct i40iw_cm_node *i40iw_create_cm_node( ...@@ -2921,7 +2922,6 @@ static struct i40iw_cm_node *i40iw_create_cm_node(
memcpy(cm_node->pdata_buf, private_data, private_data_len); memcpy(cm_node->pdata_buf, private_data, private_data_len);
cm_node->state = I40IW_CM_STATE_SYN_SENT; cm_node->state = I40IW_CM_STATE_SYN_SENT;
return cm_node; return cm_node;
} }
...@@ -3242,11 +3242,13 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, ...@@ -3242,11 +3242,13 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node,
tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]); tcp_info->dest_ip_addr3 = cpu_to_le32(cm_node->rem_addr[0]);
tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]); tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[0]);
tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table(iwqp->iwdev, tcp_info->arp_idx =
&tcp_info->dest_ip_addr3, cpu_to_le16((u16)i40iw_arp_table(
true, iwqp->iwdev,
NULL, &tcp_info->dest_ip_addr3,
I40IW_ARP_RESOLVE)); true,
NULL,
I40IW_ARP_RESOLVE));
} else { } else {
tcp_info->src_port = cpu_to_le16(cm_node->loc_port); tcp_info->src_port = cpu_to_le16(cm_node->loc_port);
tcp_info->dst_port = cpu_to_le16(cm_node->rem_port); tcp_info->dst_port = cpu_to_le16(cm_node->rem_port);
...@@ -3258,12 +3260,13 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node, ...@@ -3258,12 +3260,13 @@ static void i40iw_init_tcp_ctx(struct i40iw_cm_node *cm_node,
tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]); tcp_info->local_ipaddr1 = cpu_to_le32(cm_node->loc_addr[1]);
tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]); tcp_info->local_ipaddr2 = cpu_to_le32(cm_node->loc_addr[2]);
tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]); tcp_info->local_ipaddr3 = cpu_to_le32(cm_node->loc_addr[3]);
tcp_info->arp_idx = cpu_to_le32(i40iw_arp_table( tcp_info->arp_idx =
iwqp->iwdev, cpu_to_le16((u16)i40iw_arp_table(
&tcp_info->dest_ip_addr0, iwqp->iwdev,
false, &tcp_info->dest_ip_addr0,
NULL, false,
I40IW_ARP_RESOLVE)); NULL,
I40IW_ARP_RESOLVE));
} }
} }
...@@ -3540,7 +3543,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3540,7 +3543,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
struct i40iw_cm_node *cm_node; struct i40iw_cm_node *cm_node;
struct ib_qp_attr attr; struct ib_qp_attr attr;
int passive_state; int passive_state;
struct i40iw_ib_device *iwibdev;
struct ib_mr *ibmr; struct ib_mr *ibmr;
struct i40iw_pd *iwpd; struct i40iw_pd *iwpd;
u16 buf_len = 0; u16 buf_len = 0;
...@@ -3603,7 +3605,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) ...@@ -3603,7 +3605,6 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
!i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) || !i40iw_ipv4_is_loopback(cm_node->loc_addr[0], cm_node->rem_addr[0])) ||
(!cm_node->ipv4 && (!cm_node->ipv4 &&
!i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) { !i40iw_ipv6_is_loopback(cm_node->loc_addr, cm_node->rem_addr))) {
iwibdev = iwdev->iwibdev;
iwpd = iwqp->iwpd; iwpd = iwqp->iwpd;
tagged_offset = (uintptr_t)iwqp->ietf_mem.va; tagged_offset = (uintptr_t)iwqp->ietf_mem.va;
ibmr = i40iw_reg_phys_mr(&iwpd->ibpd, ibmr = i40iw_reg_phys_mr(&iwpd->ibpd,
......
...@@ -3970,11 +3970,11 @@ enum i40iw_status_code i40iw_process_bh(struct i40iw_sc_dev *dev) ...@@ -3970,11 +3970,11 @@ enum i40iw_status_code i40iw_process_bh(struct i40iw_sc_dev *dev)
*/ */
static u32 i40iw_iwarp_opcode(struct i40iw_aeqe_info *info, u8 *pkt) static u32 i40iw_iwarp_opcode(struct i40iw_aeqe_info *info, u8 *pkt)
{ {
u16 *mpa; __be16 *mpa;
u32 opcode = 0xffffffff; u32 opcode = 0xffffffff;
if (info->q2_data_written) { if (info->q2_data_written) {
mpa = (u16 *)pkt; mpa = (__be16 *)pkt;
opcode = ntohs(mpa[1]) & 0xf; opcode = ntohs(mpa[1]) & 0xf;
} }
return opcode; return opcode;
...@@ -4036,7 +4036,7 @@ static int i40iw_bld_terminate_hdr(struct i40iw_sc_qp *qp, ...@@ -4036,7 +4036,7 @@ static int i40iw_bld_terminate_hdr(struct i40iw_sc_qp *qp,
if (info->q2_data_written) { if (info->q2_data_written) {
/* Use data from offending packet to fill in ddp & rdma hdrs */ /* Use data from offending packet to fill in ddp & rdma hdrs */
pkt = i40iw_locate_mpa(pkt); pkt = i40iw_locate_mpa(pkt);
ddp_seg_len = ntohs(*(u16 *)pkt); ddp_seg_len = ntohs(*(__be16 *)pkt);
if (ddp_seg_len) { if (ddp_seg_len) {
copy_len = 2; copy_len = 2;
termhdr->hdrct = DDP_LEN_FLAG; termhdr->hdrct = DDP_LEN_FLAG;
...@@ -4247,13 +4247,13 @@ void i40iw_terminate_connection(struct i40iw_sc_qp *qp, struct i40iw_aeqe_info * ...@@ -4247,13 +4247,13 @@ void i40iw_terminate_connection(struct i40iw_sc_qp *qp, struct i40iw_aeqe_info *
void i40iw_terminate_received(struct i40iw_sc_qp *qp, struct i40iw_aeqe_info *info) void i40iw_terminate_received(struct i40iw_sc_qp *qp, struct i40iw_aeqe_info *info)
{ {
u8 *pkt = qp->q2_buf + Q2_BAD_FRAME_OFFSET; u8 *pkt = qp->q2_buf + Q2_BAD_FRAME_OFFSET;
u32 *mpa; __be32 *mpa;
u8 ddp_ctl; u8 ddp_ctl;
u8 rdma_ctl; u8 rdma_ctl;
u16 aeq_id = 0; u16 aeq_id = 0;
struct i40iw_terminate_hdr *termhdr; struct i40iw_terminate_hdr *termhdr;
mpa = (u32 *)i40iw_locate_mpa(pkt); mpa = (__be32 *)i40iw_locate_mpa(pkt);
if (info->q2_data_written) { if (info->q2_data_written) {
/* did not validate the frame - do it now */ /* did not validate the frame - do it now */
ddp_ctl = (ntohl(mpa[0]) >> 8) & 0xff; ddp_ctl = (ntohl(mpa[0]) >> 8) & 0xff;
......
...@@ -467,7 +467,7 @@ int i40iw_manage_apbvt(struct i40iw_device *iwdev, u16 accel_local_port, bool ad ...@@ -467,7 +467,7 @@ int i40iw_manage_apbvt(struct i40iw_device *iwdev, u16 accel_local_port, bool ad
*/ */
void i40iw_manage_arp_cache(struct i40iw_device *iwdev, void i40iw_manage_arp_cache(struct i40iw_device *iwdev,
unsigned char *mac_addr, unsigned char *mac_addr,
__be32 *ip_addr, u32 *ip_addr,
bool ipv4, bool ipv4,
u32 action) u32 action)
{ {
...@@ -488,7 +488,7 @@ void i40iw_manage_arp_cache(struct i40iw_device *iwdev, ...@@ -488,7 +488,7 @@ void i40iw_manage_arp_cache(struct i40iw_device *iwdev,
cqp_info->cqp_cmd = OP_ADD_ARP_CACHE_ENTRY; cqp_info->cqp_cmd = OP_ADD_ARP_CACHE_ENTRY;
info = &cqp_info->in.u.add_arp_cache_entry.info; info = &cqp_info->in.u.add_arp_cache_entry.info;
memset(info, 0, sizeof(*info)); memset(info, 0, sizeof(*info));
info->arp_index = cpu_to_le32(arp_index); info->arp_index = cpu_to_le16((u16)arp_index);
info->permanent = true; info->permanent = true;
ether_addr_copy(info->mac_addr, mac_addr); ether_addr_copy(info->mac_addr, mac_addr);
cqp_info->in.u.add_arp_cache_entry.scratch = (uintptr_t)cqp_request; cqp_info->in.u.add_arp_cache_entry.scratch = (uintptr_t)cqp_request;
......
...@@ -1162,7 +1162,7 @@ static void i40iw_add_ipv6_addr(struct i40iw_device *iwdev) ...@@ -1162,7 +1162,7 @@ static void i40iw_add_ipv6_addr(struct i40iw_device *iwdev)
struct net_device *ip_dev; struct net_device *ip_dev;
struct inet6_dev *idev; struct inet6_dev *idev;
struct inet6_ifaddr *ifp; struct inet6_ifaddr *ifp;
__be32 local_ipaddr6[4]; u32 local_ipaddr6[4];
rcu_read_lock(); rcu_read_lock();
for_each_netdev_rcu(&init_net, ip_dev) { for_each_netdev_rcu(&init_net, ip_dev) {
......
...@@ -1194,7 +1194,7 @@ static enum i40iw_status_code i40iw_ieq_process_buf(struct i40iw_puda_rsrc *ieq, ...@@ -1194,7 +1194,7 @@ static enum i40iw_status_code i40iw_ieq_process_buf(struct i40iw_puda_rsrc *ieq,
ioffset = (u16)(buf->data - (u8 *)buf->mem.va); ioffset = (u16)(buf->data - (u8 *)buf->mem.va);
while (datalen) { while (datalen) {
fpdu_len = i40iw_ieq_get_fpdu_length(ntohs(*(u16 *)datap)); fpdu_len = i40iw_ieq_get_fpdu_length(ntohs(*(__be16 *)datap));
if (fpdu_len > pfpdu->max_fpdu_data) { if (fpdu_len > pfpdu->max_fpdu_data) {
i40iw_debug(ieq->dev, I40IW_DEBUG_IEQ, i40iw_debug(ieq->dev, I40IW_DEBUG_IEQ,
"%s: error bad fpdu_len\n", __func__); "%s: error bad fpdu_len\n", __func__);
......
...@@ -890,8 +890,8 @@ struct i40iw_qhash_table_info { ...@@ -890,8 +890,8 @@ struct i40iw_qhash_table_info {
u32 qp_num; u32 qp_num;
u32 dest_ip[4]; u32 dest_ip[4];
u32 src_ip[4]; u32 src_ip[4];
u32 dest_port; u16 dest_port;
u32 src_port; u16 src_port;
}; };
struct i40iw_local_mac_ipaddr_entry_info { struct i40iw_local_mac_ipaddr_entry_info {
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
* @action: modify, delete or add * @action: modify, delete or add
*/ */
int i40iw_arp_table(struct i40iw_device *iwdev, int i40iw_arp_table(struct i40iw_device *iwdev,
__be32 *ip_addr, u32 *ip_addr,
bool ipv4, bool ipv4,
u8 *mac_addr, u8 *mac_addr,
u32 action) u32 action)
...@@ -152,7 +152,7 @@ int i40iw_inetaddr_event(struct notifier_block *notifier, ...@@ -152,7 +152,7 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
struct net_device *upper_dev; struct net_device *upper_dev;
struct i40iw_device *iwdev; struct i40iw_device *iwdev;
struct i40iw_handler *hdl; struct i40iw_handler *hdl;
__be32 local_ipaddr; u32 local_ipaddr;
hdl = i40iw_find_netdev(event_netdev); hdl = i40iw_find_netdev(event_netdev);
if (!hdl) if (!hdl)
...@@ -167,11 +167,10 @@ int i40iw_inetaddr_event(struct notifier_block *notifier, ...@@ -167,11 +167,10 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
switch (event) { switch (event) {
case NETDEV_DOWN: case NETDEV_DOWN:
if (upper_dev) if (upper_dev)
local_ipaddr = local_ipaddr = ntohl(
((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address; ((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address);
else else
local_ipaddr = ifa->ifa_address; local_ipaddr = ntohl(ifa->ifa_address);
local_ipaddr = ntohl(local_ipaddr);
i40iw_manage_arp_cache(iwdev, i40iw_manage_arp_cache(iwdev,
netdev->dev_addr, netdev->dev_addr,
&local_ipaddr, &local_ipaddr,
...@@ -180,11 +179,10 @@ int i40iw_inetaddr_event(struct notifier_block *notifier, ...@@ -180,11 +179,10 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
return NOTIFY_OK; return NOTIFY_OK;
case NETDEV_UP: case NETDEV_UP:
if (upper_dev) if (upper_dev)
local_ipaddr = local_ipaddr = ntohl(
((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address; ((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address);
else else
local_ipaddr = ifa->ifa_address; local_ipaddr = ntohl(ifa->ifa_address);
local_ipaddr = ntohl(local_ipaddr);
i40iw_manage_arp_cache(iwdev, i40iw_manage_arp_cache(iwdev,
netdev->dev_addr, netdev->dev_addr,
&local_ipaddr, &local_ipaddr,
...@@ -194,12 +192,11 @@ int i40iw_inetaddr_event(struct notifier_block *notifier, ...@@ -194,12 +192,11 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
case NETDEV_CHANGEADDR: case NETDEV_CHANGEADDR:
/* Add the address to the IP table */ /* Add the address to the IP table */
if (upper_dev) if (upper_dev)
local_ipaddr = local_ipaddr = ntohl(
((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address; ((struct in_device *)upper_dev->ip_ptr)->ifa_list->ifa_address);
else else
local_ipaddr = ifa->ifa_address; local_ipaddr = ntohl(ifa->ifa_address);
local_ipaddr = ntohl(local_ipaddr);
i40iw_manage_arp_cache(iwdev, i40iw_manage_arp_cache(iwdev,
netdev->dev_addr, netdev->dev_addr,
&local_ipaddr, &local_ipaddr,
...@@ -227,7 +224,7 @@ int i40iw_inet6addr_event(struct notifier_block *notifier, ...@@ -227,7 +224,7 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
struct net_device *netdev; struct net_device *netdev;
struct i40iw_device *iwdev; struct i40iw_device *iwdev;
struct i40iw_handler *hdl; struct i40iw_handler *hdl;
__be32 local_ipaddr6[4]; u32 local_ipaddr6[4];
hdl = i40iw_find_netdev(event_netdev); hdl = i40iw_find_netdev(event_netdev);
if (!hdl) if (!hdl)
......
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