aboutsummaryrefslogtreecommitdiffstats
path: root/src/net
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2014-03-04 13:10:07 +0000
committerMichael Brown <mcb30@ipxe.org>2014-03-04 13:13:54 +0000
commit6414b5ca036ade7545eb0c309c66731fced6e055 (patch)
treedd73109b6fbbff5e176b87c30df744665595cafb /src/net
parentdb67de6f31a062dc1995d4561be83cd51609d6c4 (diff)
downloadipxe-6414b5ca036ade7545eb0c309c66731fced6e055.tar.gz
[tcpip] Provide tcpip_mtu() to determine the maximum transmission unit
Provide the function tcpip_mtu() to allow external code to determine the (transport-layer) maximum transmission unit for a given socket address. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net')
-rw-r--r--src/net/ipv4.c1
-rw-r--r--src/net/ipv6.c1
-rw-r--r--src/net/tcpip.c29
3 files changed, 31 insertions, 0 deletions
diff --git a/src/net/ipv4.c b/src/net/ipv4.c
index 8bda5c86..c5cfd134 100644
--- a/src/net/ipv4.c
+++ b/src/net/ipv4.c
@@ -621,6 +621,7 @@ struct net_protocol ipv4_protocol __net_protocol = {
struct tcpip_net_protocol ipv4_tcpip_protocol __tcpip_net_protocol = {
.name = "IPv4",
.sa_family = AF_INET,
+ .header_len = sizeof ( struct iphdr ),
.tx = ipv4_tx,
.netdev = ipv4_netdev,
};
diff --git a/src/net/ipv6.c b/src/net/ipv6.c
index 6f2e9477..f753751d 100644
--- a/src/net/ipv6.c
+++ b/src/net/ipv6.c
@@ -988,6 +988,7 @@ struct net_protocol ipv6_protocol __net_protocol = {
struct tcpip_net_protocol ipv6_tcpip_protocol __tcpip_net_protocol = {
.name = "IPv6",
.sa_family = AF_INET6,
+ .header_len = sizeof ( struct ipv6_header ),
.tx = ipv6_tx,
.netdev = ipv6_netdev,
};
diff --git a/src/net/tcpip.c b/src/net/tcpip.c
index 6fac8c52..4bcbe64b 100644
--- a/src/net/tcpip.c
+++ b/src/net/tcpip.c
@@ -6,6 +6,7 @@
#include <ipxe/iobuf.h>
#include <ipxe/tables.h>
#include <ipxe/ipstat.h>
+#include <ipxe/netdevice.h>
#include <ipxe/tcpip.h>
/** @file
@@ -123,6 +124,34 @@ struct net_device * tcpip_netdev ( struct sockaddr_tcpip *st_dest ) {
}
/**
+ * Determine maximum transmission unit
+ *
+ * @v st_dest Destination address
+ * @ret mtu Maximum transmission unit
+ */
+size_t tcpip_mtu ( struct sockaddr_tcpip *st_dest ) {
+ struct tcpip_net_protocol *tcpip_net;
+ struct net_device *netdev;
+ size_t mtu;
+
+ /* Find appropriate network-layer protocol */
+ tcpip_net = tcpip_net_protocol ( st_dest );
+ if ( ! tcpip_net )
+ return 0;
+
+ /* Find transmitting network device */
+ netdev = tcpip_net->netdev ( st_dest );
+ if ( ! netdev )
+ return 0;
+
+ /* Calculate MTU */
+ mtu = ( netdev->max_pkt_len - netdev->ll_protocol->ll_header_len -
+ tcpip_net->header_len );
+
+ return mtu;
+}
+
+/**
* Calculate continued TCP/IP checkum
*
* @v partial Checksum of already-summed data, in network byte order