Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 78fbfd8a authored by David S. Miller's avatar David S. Miller
Browse files

ipv4: Create and use route lookup helpers.



The idea here is this minimizes the number of places one has to edit
in order to make changes to how flows are defined and used.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1561747d
Loading
Loading
Loading
Loading
+1 −7
Original line number Original line Diff line number Diff line
@@ -183,17 +183,11 @@ static int addr4_resolve(struct sockaddr_in *src_in,
{
{
	__be32 src_ip = src_in->sin_addr.s_addr;
	__be32 src_ip = src_in->sin_addr.s_addr;
	__be32 dst_ip = dst_in->sin_addr.s_addr;
	__be32 dst_ip = dst_in->sin_addr.s_addr;
	struct flowi fl;
	struct rtable *rt;
	struct rtable *rt;
	struct neighbour *neigh;
	struct neighbour *neigh;
	int ret;
	int ret;


	memset(&fl, 0, sizeof fl);
	rt = ip_route_output(&init_net, dst_ip, src_ip, 0, addr->bound_dev_if);
	fl.nl_u.ip4_u.daddr = dst_ip;
	fl.nl_u.ip4_u.saddr = src_ip;
	fl.oif = addr->bound_dev_if;

	rt = ip_route_output_key(&init_net, &fl);
	if (IS_ERR(rt)) {
	if (IS_ERR(rt)) {
		ret = PTR_ERR(rt);
		ret = PTR_ERR(rt);
		goto out;
		goto out;
+4 −17
Original line number Original line Diff line number Diff line
@@ -338,23 +338,10 @@ static struct rtable *find_route(struct t3cdev *dev, __be32 local_ip,
				 __be16 peer_port, u8 tos)
				 __be16 peer_port, u8 tos)
{
{
	struct rtable *rt;
	struct rtable *rt;
	struct flowi fl = {
		.oif = 0,
		.nl_u = {
			 .ip4_u = {
				   .daddr = peer_ip,
				   .saddr = local_ip,
				   .tos = tos}
			 },
		.proto = IPPROTO_TCP,
		.uli_u = {
			  .ports = {
				    .sport = local_port,
				    .dport = peer_port}
			  }
	};


	rt = ip_route_output_flow(&init_net, &fl, NULL);
	rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
				   peer_port, local_port, IPPROTO_TCP,
				   tos, 0);
	if (IS_ERR(rt))
	if (IS_ERR(rt))
		return NULL;
		return NULL;
	return rt;
	return rt;
+4 −17
Original line number Original line Diff line number Diff line
@@ -315,23 +315,10 @@ static struct rtable *find_route(struct c4iw_dev *dev, __be32 local_ip,
				 __be16 peer_port, u8 tos)
				 __be16 peer_port, u8 tos)
{
{
	struct rtable *rt;
	struct rtable *rt;
	struct flowi fl = {
		.oif = 0,
		.nl_u = {
			 .ip4_u = {
				   .daddr = peer_ip,
				   .saddr = local_ip,
				   .tos = tos}
			 },
		.proto = IPPROTO_TCP,
		.uli_u = {
			  .ports = {
				    .sport = local_port,
				    .dport = peer_port}
			  }
	};


	rt = ip_route_output_flow(&init_net, &fl, NULL);
	rt = ip_route_output_ports(&init_net, NULL, peer_ip, local_ip,
				   peer_port, local_port, IPPROTO_TCP,
				   tos, 0);
	if (IS_ERR(rt))
	if (IS_ERR(rt))
		return NULL;
		return NULL;
	return rt;
	return rt;
+1 −4
Original line number Original line Diff line number Diff line
@@ -1104,15 +1104,12 @@ static inline int mini_cm_accelerated(struct nes_cm_core *cm_core,
static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
static int nes_addr_resolve_neigh(struct nes_vnic *nesvnic, u32 dst_ip, int arpindex)
{
{
	struct rtable *rt;
	struct rtable *rt;
	struct flowi fl;
	struct neighbour *neigh;
	struct neighbour *neigh;
	int rc = arpindex;
	int rc = arpindex;
	struct net_device *netdev;
	struct net_device *netdev;
	struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;
	struct nes_adapter *nesadapter = nesvnic->nesdev->nesadapter;


	memset(&fl, 0, sizeof fl);
	rt = ip_route_output(&init_net, htonl(dst_ip), 0, 0, 0);
	fl.nl_u.ip4_u.daddr = htonl(dst_ip);
	rt = ip_route_output_key(&init_net, &fl);
	if (IS_ERR(rt)) {
	if (IS_ERR(rt)) {
		printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n",
		printk(KERN_ERR "%s: ip_route_output_key failed for 0x%08X\n",
				__func__, dst_ip);
				__func__, dst_ip);
+4 −8
Original line number Original line Diff line number Diff line
@@ -2676,7 +2676,6 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
	__be32 *targets = bond->params.arp_targets;
	__be32 *targets = bond->params.arp_targets;
	struct vlan_entry *vlan;
	struct vlan_entry *vlan;
	struct net_device *vlan_dev;
	struct net_device *vlan_dev;
	struct flowi fl;
	struct rtable *rt;
	struct rtable *rt;


	for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
	for (i = 0; (i < BOND_MAX_ARP_TARGETS); i++) {
@@ -2695,15 +2694,12 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)
		 * determine which VLAN interface would be used, so we
		 * determine which VLAN interface would be used, so we
		 * can tag the ARP with the proper VLAN tag.
		 * can tag the ARP with the proper VLAN tag.
		 */
		 */
		memset(&fl, 0, sizeof(fl));
		rt = ip_route_output(dev_net(bond->dev), targets[i], 0,
		fl.fl4_dst = targets[i];
				     RTO_ONLINK, 0);
		fl.fl4_tos = RTO_ONLINK;

		rt = ip_route_output_key(dev_net(bond->dev), &fl);
		if (IS_ERR(rt)) {
		if (IS_ERR(rt)) {
			if (net_ratelimit()) {
			if (net_ratelimit()) {
				pr_warning("%s: no route to arp_ip_target %pI4\n",
				pr_warning("%s: no route to arp_ip_target %pI4\n",
					   bond->dev->name, &fl.fl4_dst);
					   bond->dev->name, &targets[i]);
			}
			}
			continue;
			continue;
		}
		}
@@ -2739,7 +2735,7 @@ static void bond_arp_send_all(struct bonding *bond, struct slave *slave)


		if (net_ratelimit()) {
		if (net_ratelimit()) {
			pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n",
			pr_warning("%s: no path to arp_ip_target %pI4 via rt.dev %s\n",
				   bond->dev->name, &fl.fl4_dst,
				   bond->dev->name, &targets[i],
				   rt->dst.dev ? rt->dst.dev->name : "NULL");
				   rt->dst.dev ? rt->dst.dev->name : "NULL");
		}
		}
		ip_rt_put(rt);
		ip_rt_put(rt);
Loading