|  | @@ -47,36 +47,38 @@ static struct ipv4_miniroute * add_ipv4_miniroute ( struct net_device *netdev,
 | 
		
	
		
			
			| 47 | 47 |  						    struct in_addr gateway ) {
 | 
		
	
		
			
			| 48 | 48 |  	struct ipv4_miniroute *miniroute;
 | 
		
	
		
			
			| 49 | 49 |  
 | 
		
	
		
			
			|  | 50 | +	DBG ( "IPv4 add %s", inet_ntoa ( address ) );
 | 
		
	
		
			
			|  | 51 | +	DBG ( "/%s ", inet_ntoa ( netmask ) );
 | 
		
	
		
			
			|  | 52 | +	if ( gateway.s_addr != INADDR_NONE )
 | 
		
	
		
			
			|  | 53 | +		DBG ( "gw %s ", inet_ntoa ( gateway ) );
 | 
		
	
		
			
			|  | 54 | +	DBG ( "via %s\n", netdev->name );
 | 
		
	
		
			
			|  | 55 | +
 | 
		
	
		
			
			| 50 | 56 |  	/* Allocate and populate miniroute structure */
 | 
		
	
		
			
			| 51 | 57 |  	miniroute = malloc ( sizeof ( *miniroute ) );
 | 
		
	
		
			
			| 52 |  | -	if ( miniroute ) {
 | 
		
	
		
			
			| 53 |  | -
 | 
		
	
		
			
			| 54 |  | -		DBG ( "IPv4 add %s", inet_ntoa ( address ) );
 | 
		
	
		
			
			| 55 |  | -		DBG ( "/%s ", inet_ntoa ( netmask ) );
 | 
		
	
		
			
			| 56 |  | -		if ( gateway.s_addr != INADDR_NONE )
 | 
		
	
		
			
			| 57 |  | -			DBG ( "gw %s ", inet_ntoa ( gateway ) );
 | 
		
	
		
			
			| 58 |  | -		DBG ( "via %s\n", netdev->name );
 | 
		
	
		
			
			| 59 |  | -
 | 
		
	
		
			
			| 60 |  | -		/* Record routing information */
 | 
		
	
		
			
			| 61 |  | -		miniroute->netdev = netdev;
 | 
		
	
		
			
			| 62 |  | -		miniroute->address = address;
 | 
		
	
		
			
			| 63 |  | -		miniroute->netmask = netmask;
 | 
		
	
		
			
			| 64 |  | -		miniroute->gateway = gateway;
 | 
		
	
		
			
			| 65 |  | -		
 | 
		
	
		
			
			| 66 |  | -		/* Add to end of list if we have a gateway, otherwise
 | 
		
	
		
			
			| 67 |  | -		 * to start of list.
 | 
		
	
		
			
			| 68 |  | -		 */
 | 
		
	
		
			
			| 69 |  | -		if ( gateway.s_addr != INADDR_NONE ) {
 | 
		
	
		
			
			| 70 |  | -			list_add_tail ( &miniroute->list, &ipv4_miniroutes );
 | 
		
	
		
			
			| 71 |  | -		} else {
 | 
		
	
		
			
			| 72 |  | -			list_add ( &miniroute->list, &ipv4_miniroutes );
 | 
		
	
		
			
			| 73 |  | -		}
 | 
		
	
		
			
			|  | 58 | +	if ( ! miniroute ) {
 | 
		
	
		
			
			|  | 59 | +		DBG ( "IPv4 could not add miniroute\n" );
 | 
		
	
		
			
			|  | 60 | +		return NULL;
 | 
		
	
		
			
			|  | 61 | +	}
 | 
		
	
		
			
			| 74 | 62 |  
 | 
		
	
		
			
			| 75 |  | -		/* Record reference to net_device */
 | 
		
	
		
			
			| 76 |  | -		miniroute->netdev_ref.forget = ipv4_forget_netdev;
 | 
		
	
		
			
			| 77 |  | -		ref_add ( &miniroute->netdev_ref, &netdev->references );
 | 
		
	
		
			
			|  | 63 | +	/* Record routing information */
 | 
		
	
		
			
			|  | 64 | +	miniroute->netdev = netdev;
 | 
		
	
		
			
			|  | 65 | +	miniroute->address = address;
 | 
		
	
		
			
			|  | 66 | +	miniroute->netmask = netmask;
 | 
		
	
		
			
			|  | 67 | +	miniroute->gateway = gateway;
 | 
		
	
		
			
			|  | 68 | +		
 | 
		
	
		
			
			|  | 69 | +	/* Add to end of list if we have a gateway, otherwise
 | 
		
	
		
			
			|  | 70 | +	 * to start of list.
 | 
		
	
		
			
			|  | 71 | +	 */
 | 
		
	
		
			
			|  | 72 | +	if ( gateway.s_addr != INADDR_NONE ) {
 | 
		
	
		
			
			|  | 73 | +		list_add_tail ( &miniroute->list, &ipv4_miniroutes );
 | 
		
	
		
			
			|  | 74 | +	} else {
 | 
		
	
		
			
			|  | 75 | +		list_add ( &miniroute->list, &ipv4_miniroutes );
 | 
		
	
		
			
			| 78 | 76 |  	}
 | 
		
	
		
			
			| 79 | 77 |  
 | 
		
	
		
			
			|  | 78 | +	/* Record reference to net_device */
 | 
		
	
		
			
			|  | 79 | +	miniroute->netdev_ref.forget = ipv4_forget_netdev;
 | 
		
	
		
			
			|  | 80 | +	ref_add ( &miniroute->netdev_ref, &netdev->references );
 | 
		
	
		
			
			|  | 81 | +
 | 
		
	
		
			
			| 80 | 82 |  	return miniroute;
 | 
		
	
		
			
			| 81 | 83 |  }
 | 
		
	
		
			
			| 82 | 84 |  
 | 
		
	
	
		
			
			|  | @@ -391,8 +393,8 @@ static int ipv4_tx ( struct pk_buff *pkb,
 | 
		
	
		
			
			| 391 | 393 |  	/* Determine link-layer destination address */
 | 
		
	
		
			
			| 392 | 394 |  	if ( ( rc = ipv4_ll_addr ( next_hop, iphdr->src, netdev,
 | 
		
	
		
			
			| 393 | 395 |  				   ll_dest ) ) != 0 ) {
 | 
		
	
		
			
			| 394 |  | -		DBG ( "IPv4 has no link-layer address for %s\n",
 | 
		
	
		
			
			| 395 |  | -		      inet_ntoa ( iphdr->dest ) );
 | 
		
	
		
			
			|  | 396 | +		DBG ( "IPv4 has no link-layer address for %s: %s\n",
 | 
		
	
		
			
			|  | 397 | +		      inet_ntoa ( iphdr->dest ), strerror ( rc ) );
 | 
		
	
		
			
			| 396 | 398 |  		goto err;
 | 
		
	
		
			
			| 397 | 399 |  	}
 | 
		
	
		
			
			| 398 | 400 |  
 | 
		
	
	
		
			
			|  | @@ -408,7 +410,13 @@ static int ipv4_tx ( struct pk_buff *pkb,
 | 
		
	
		
			
			| 408 | 410 |  	      ntohs ( iphdr->ident ), ntohs ( iphdr->chksum ) );
 | 
		
	
		
			
			| 409 | 411 |  
 | 
		
	
		
			
			| 410 | 412 |  	/* Hand off to link layer */
 | 
		
	
		
			
			| 411 |  | -	return net_tx ( pkb, netdev, &ipv4_protocol, ll_dest );
 | 
		
	
		
			
			|  | 413 | +	if ( ( rc = net_tx ( pkb, netdev, &ipv4_protocol, ll_dest ) ) != 0 ) {
 | 
		
	
		
			
			|  | 414 | +		DBG ( "IPv4 could not transmit packet via %s: %s\n",
 | 
		
	
		
			
			|  | 415 | +		      netdev->name, strerror ( rc ) );
 | 
		
	
		
			
			|  | 416 | +		return rc;
 | 
		
	
		
			
			|  | 417 | +	}
 | 
		
	
		
			
			|  | 418 | +
 | 
		
	
		
			
			|  | 419 | +	return 0;
 | 
		
	
		
			
			| 412 | 420 |  
 | 
		
	
		
			
			| 413 | 421 |   err:
 | 
		
	
		
			
			| 414 | 422 |  	free_pkb ( pkb );
 | 
		
	
	
		
			
			|  | @@ -436,6 +444,7 @@ static int ipv4_rx ( struct pk_buff *pkb, struct net_device *netdev __unused,
 | 
		
	
		
			
			| 436 | 444 |  	} src, dest;
 | 
		
	
		
			
			| 437 | 445 |  	uint16_t csum;
 | 
		
	
		
			
			| 438 | 446 |  	uint16_t pshdr_csum;
 | 
		
	
		
			
			|  | 447 | +	int rc;
 | 
		
	
		
			
			| 439 | 448 |  
 | 
		
	
		
			
			| 440 | 449 |  	/* Sanity check the IPv4 header */
 | 
		
	
		
			
			| 441 | 450 |  	if ( pkb_len ( pkb ) < sizeof ( *iphdr ) ) {
 | 
		
	
	
		
			
			|  | @@ -506,7 +515,14 @@ static int ipv4_rx ( struct pk_buff *pkb, struct net_device *netdev __unused,
 | 
		
	
		
			
			| 506 | 515 |  	memset ( &dest, 0, sizeof ( dest ) );
 | 
		
	
		
			
			| 507 | 516 |  	dest.sin.sin_family = AF_INET;
 | 
		
	
		
			
			| 508 | 517 |  	dest.sin.sin_addr = iphdr->dest;
 | 
		
	
		
			
			| 509 |  | -	return tcpip_rx ( pkb, iphdr->protocol, &src.st, &dest.st, pshdr_csum);
 | 
		
	
		
			
			|  | 518 | +	if ( ( rc = tcpip_rx ( pkb, iphdr->protocol, &src.st,
 | 
		
	
		
			
			|  | 519 | +			       &dest.st, pshdr_csum ) ) != 0 ) {
 | 
		
	
		
			
			|  | 520 | +		DBG ( "IPv4 received packet rejected by stack: %s\n",
 | 
		
	
		
			
			|  | 521 | +		      strerror ( rc ) );
 | 
		
	
		
			
			|  | 522 | +		return rc;
 | 
		
	
		
			
			|  | 523 | +	}
 | 
		
	
		
			
			|  | 524 | +
 | 
		
	
		
			
			|  | 525 | +	return 0;
 | 
		
	
		
			
			| 510 | 526 |  
 | 
		
	
		
			
			| 511 | 527 |   err:
 | 
		
	
		
			
			| 512 | 528 |  	free_pkb ( pkb );
 |