Commit 985a5c82 authored by David Howells's avatar David Howells

rxrpc: Make rxrpc_send_packet() take a connection not a transport

Make rxrpc_send_packet() take a connection not a transport as part of the
phasing out of the rxrpc_transport struct.

Whilst we're at it, rename the function to rxrpc_send_data_packet() to
differentiate it from the other packet sending functions.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent f4e7da8c
...@@ -670,7 +670,7 @@ extern const char *rxrpc_acks(u8 reason); ...@@ -670,7 +670,7 @@ extern const char *rxrpc_acks(u8 reason);
*/ */
extern unsigned int rxrpc_resend_timeout; extern unsigned int rxrpc_resend_timeout;
int rxrpc_send_packet(struct rxrpc_transport *, struct sk_buff *); int rxrpc_send_data_packet(struct rxrpc_connection *, struct sk_buff *);
int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t); int rxrpc_do_sendmsg(struct rxrpc_sock *, struct msghdr *, size_t);
/* /*
......
...@@ -187,7 +187,7 @@ static void rxrpc_resend(struct rxrpc_call *call) ...@@ -187,7 +187,7 @@ static void rxrpc_resend(struct rxrpc_call *call)
_proto("Tx DATA %%%u { #%d }", _proto("Tx DATA %%%u { #%d }",
sp->hdr.serial, sp->hdr.seq); sp->hdr.serial, sp->hdr.seq);
if (rxrpc_send_packet(call->conn->trans, txb) < 0) { if (rxrpc_send_data_packet(call->conn, txb) < 0) {
stop = true; stop = true;
sp->resend_at = jiffies + 3; sp->resend_at = jiffies + 3;
} else { } else {
......
...@@ -338,7 +338,7 @@ EXPORT_SYMBOL(rxrpc_kernel_abort_call); ...@@ -338,7 +338,7 @@ EXPORT_SYMBOL(rxrpc_kernel_abort_call);
/* /*
* send a packet through the transport endpoint * send a packet through the transport endpoint
*/ */
int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb) int rxrpc_send_data_packet(struct rxrpc_connection *conn, struct sk_buff *skb)
{ {
struct kvec iov[1]; struct kvec iov[1];
struct msghdr msg; struct msghdr msg;
...@@ -349,30 +349,30 @@ int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb) ...@@ -349,30 +349,30 @@ int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb)
iov[0].iov_base = skb->head; iov[0].iov_base = skb->head;
iov[0].iov_len = skb->len; iov[0].iov_len = skb->len;
msg.msg_name = &trans->peer->srx.transport.sin; msg.msg_name = &conn->params.peer->srx.transport;
msg.msg_namelen = sizeof(trans->peer->srx.transport.sin); msg.msg_namelen = conn->params.peer->srx.transport_len;
msg.msg_control = NULL; msg.msg_control = NULL;
msg.msg_controllen = 0; msg.msg_controllen = 0;
msg.msg_flags = 0; msg.msg_flags = 0;
/* send the packet with the don't fragment bit set if we currently /* send the packet with the don't fragment bit set if we currently
* think it's small enough */ * think it's small enough */
if (skb->len - sizeof(struct rxrpc_wire_header) < trans->peer->maxdata) { if (skb->len - sizeof(struct rxrpc_wire_header) < conn->params.peer->maxdata) {
down_read(&trans->local->defrag_sem); down_read(&conn->params.local->defrag_sem);
/* send the packet by UDP /* send the packet by UDP
* - returns -EMSGSIZE if UDP would have to fragment the packet * - returns -EMSGSIZE if UDP would have to fragment the packet
* to go out of the interface * to go out of the interface
* - in which case, we'll have processed the ICMP error * - in which case, we'll have processed the ICMP error
* message and update the peer record * message and update the peer record
*/ */
ret = kernel_sendmsg(trans->local->socket, &msg, iov, 1, ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 1,
iov[0].iov_len); iov[0].iov_len);
up_read(&trans->local->defrag_sem); up_read(&conn->params.local->defrag_sem);
if (ret == -EMSGSIZE) if (ret == -EMSGSIZE)
goto send_fragmentable; goto send_fragmentable;
_leave(" = %d [%u]", ret, trans->peer->maxdata); _leave(" = %d [%u]", ret, conn->params.peer->maxdata);
return ret; return ret;
} }
...@@ -380,21 +380,28 @@ int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb) ...@@ -380,21 +380,28 @@ int rxrpc_send_packet(struct rxrpc_transport *trans, struct sk_buff *skb)
/* attempt to send this message with fragmentation enabled */ /* attempt to send this message with fragmentation enabled */
_debug("send fragment"); _debug("send fragment");
down_write(&trans->local->defrag_sem); down_write(&conn->params.local->defrag_sem);
opt = IP_PMTUDISC_DONT;
ret = kernel_setsockopt(trans->local->socket, SOL_IP, IP_MTU_DISCOVER, switch (conn->params.local->srx.transport.family) {
(char *) &opt, sizeof(opt)); case AF_INET:
if (ret == 0) { opt = IP_PMTUDISC_DONT;
ret = kernel_sendmsg(trans->local->socket, &msg, iov, 1, ret = kernel_setsockopt(conn->params.local->socket,
iov[0].iov_len); SOL_IP, IP_MTU_DISCOVER,
(char *)&opt, sizeof(opt));
opt = IP_PMTUDISC_DO; if (ret == 0) {
kernel_setsockopt(trans->local->socket, SOL_IP, ret = kernel_sendmsg(conn->params.local->socket, &msg, iov, 1,
IP_MTU_DISCOVER, (char *) &opt, sizeof(opt)); iov[0].iov_len);
opt = IP_PMTUDISC_DO;
kernel_setsockopt(conn->params.local->socket, SOL_IP,
IP_MTU_DISCOVER,
(char *)&opt, sizeof(opt));
}
break;
} }
up_write(&trans->local->defrag_sem); up_write(&conn->params.local->defrag_sem);
_leave(" = %d [frag %u]", ret, trans->peer->maxdata); _leave(" = %d [frag %u]", ret, conn->params.peer->maxdata);
return ret; return ret;
} }
...@@ -506,7 +513,7 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb, ...@@ -506,7 +513,7 @@ static void rxrpc_queue_packet(struct rxrpc_call *call, struct sk_buff *skb,
if (try_to_del_timer_sync(&call->ack_timer) >= 0) { if (try_to_del_timer_sync(&call->ack_timer) >= 0) {
/* the packet may be freed by rxrpc_process_call() before this /* the packet may be freed by rxrpc_process_call() before this
* returns */ * returns */
ret = rxrpc_send_packet(call->conn->trans, skb); ret = rxrpc_send_data_packet(call->conn, skb);
_net("sent skb %p", skb); _net("sent skb %p", skb);
} else { } else {
_debug("failed to delete ACK timer"); _debug("failed to delete ACK timer");
......
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