diff options
| author | Tony Luck <tony.luck@intel.com> | 2005-06-29 18:21:41 -0400 |
|---|---|---|
| committer | Tony Luck <tony.luck@intel.com> | 2005-06-29 18:21:41 -0400 |
| commit | d18bfacff20f08aecf01bb971b110ca108eef3c7 (patch) | |
| tree | 255f862839c593c796e609328575b611e3f56cf3 /net/ipv4 | |
| parent | a68db763af9b676590c3fe9ec3f17bf18015eb2f (diff) | |
| parent | fd782a4a99d2d3e818b9465c427b10f7f027d7da (diff) | |
Auto merge with /home/aegl/GIT/linus
Diffstat (limited to 'net/ipv4')
| -rw-r--r-- | net/ipv4/fib_trie.c | 56 | ||||
| -rw-r--r-- | net/ipv4/ip_input.c | 6 | ||||
| -rw-r--r-- | net/ipv4/ip_output.c | 8 | ||||
| -rw-r--r-- | net/ipv4/ipconfig.c | 4 | ||||
| -rw-r--r-- | net/ipv4/ipmr.c | 10 | ||||
| -rw-r--r-- | net/ipv4/ipvs/ip_vs_conn.c | 25 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ipt_CLUSTERIP.c | 7 | ||||
| -rw-r--r-- | net/ipv4/route.c | 9 |
8 files changed, 77 insertions, 48 deletions
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 0671569ee6f0..b56e88edf1b3 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -43,7 +43,7 @@ | |||
| 43 | * 2 of the License, or (at your option) any later version. | 43 | * 2 of the License, or (at your option) any later version. |
| 44 | */ | 44 | */ |
| 45 | 45 | ||
| 46 | #define VERSION "0.323" | 46 | #define VERSION "0.324" |
| 47 | 47 | ||
| 48 | #include <linux/config.h> | 48 | #include <linux/config.h> |
| 49 | #include <asm/uaccess.h> | 49 | #include <asm/uaccess.h> |
| @@ -341,8 +341,10 @@ static struct leaf *leaf_new(void) | |||
| 341 | static struct leaf_info *leaf_info_new(int plen) | 341 | static struct leaf_info *leaf_info_new(int plen) |
| 342 | { | 342 | { |
| 343 | struct leaf_info *li = kmalloc(sizeof(struct leaf_info), GFP_KERNEL); | 343 | struct leaf_info *li = kmalloc(sizeof(struct leaf_info), GFP_KERNEL); |
| 344 | li->plen = plen; | 344 | if(li) { |
| 345 | INIT_LIST_HEAD(&li->falh); | 345 | li->plen = plen; |
| 346 | INIT_LIST_HEAD(&li->falh); | ||
| 347 | } | ||
| 346 | return li; | 348 | return li; |
| 347 | } | 349 | } |
| 348 | 350 | ||
| @@ -879,8 +881,8 @@ static struct node *trie_rebalance(struct trie *t, struct tnode *tn) | |||
| 879 | return (struct node*) tn; | 881 | return (struct node*) tn; |
| 880 | } | 882 | } |
| 881 | 883 | ||
| 882 | static struct list_head * | 884 | static struct list_head * |
| 883 | fib_insert_node(struct trie *t, u32 key, int plen) | 885 | fib_insert_node(struct trie *t, int *err, u32 key, int plen) |
| 884 | { | 886 | { |
| 885 | int pos, newpos; | 887 | int pos, newpos; |
| 886 | struct tnode *tp = NULL, *tn = NULL; | 888 | struct tnode *tp = NULL, *tn = NULL; |
| @@ -940,7 +942,6 @@ fib_insert_node(struct trie *t, u32 key, int plen) | |||
| 940 | if(tp && IS_LEAF(tp)) | 942 | if(tp && IS_LEAF(tp)) |
| 941 | BUG(); | 943 | BUG(); |
| 942 | 944 | ||
| 943 | t->revision++; | ||
| 944 | 945 | ||
| 945 | /* Case 1: n is a leaf. Compare prefixes */ | 946 | /* Case 1: n is a leaf. Compare prefixes */ |
| 946 | 947 | ||
| @@ -949,8 +950,10 @@ fib_insert_node(struct trie *t, u32 key, int plen) | |||
| 949 | 950 | ||
| 950 | li = leaf_info_new(plen); | 951 | li = leaf_info_new(plen); |
| 951 | 952 | ||
| 952 | if(! li) | 953 | if(! li) { |
| 953 | BUG(); | 954 | *err = -ENOMEM; |
| 955 | goto err; | ||
| 956 | } | ||
| 954 | 957 | ||
| 955 | fa_head = &li->falh; | 958 | fa_head = &li->falh; |
| 956 | insert_leaf_info(&l->list, li); | 959 | insert_leaf_info(&l->list, li); |
| @@ -959,14 +962,19 @@ fib_insert_node(struct trie *t, u32 key, int plen) | |||
| 959 | t->size++; | 962 | t->size++; |
| 960 | l = leaf_new(); | 963 | l = leaf_new(); |
| 961 | 964 | ||
| 962 | if(! l) | 965 | if(! l) { |
| 963 | BUG(); | 966 | *err = -ENOMEM; |
| 967 | goto err; | ||
| 968 | } | ||
| 964 | 969 | ||
| 965 | l->key = key; | 970 | l->key = key; |
| 966 | li = leaf_info_new(plen); | 971 | li = leaf_info_new(plen); |
| 967 | 972 | ||
| 968 | if(! li) | 973 | if(! li) { |
| 969 | BUG(); | 974 | tnode_free((struct tnode *) l); |
| 975 | *err = -ENOMEM; | ||
| 976 | goto err; | ||
| 977 | } | ||
| 970 | 978 | ||
| 971 | fa_head = &li->falh; | 979 | fa_head = &li->falh; |
| 972 | insert_leaf_info(&l->list, li); | 980 | insert_leaf_info(&l->list, li); |
| @@ -1003,9 +1011,14 @@ fib_insert_node(struct trie *t, u32 key, int plen) | |||
| 1003 | newpos = 0; | 1011 | newpos = 0; |
| 1004 | tn = tnode_new(key, newpos, 1); /* First tnode */ | 1012 | tn = tnode_new(key, newpos, 1); /* First tnode */ |
| 1005 | } | 1013 | } |
| 1006 | if(!tn) | ||
| 1007 | trie_bug("tnode_pfx_new failed"); | ||
| 1008 | 1014 | ||
| 1015 | if(!tn) { | ||
| 1016 | free_leaf_info(li); | ||
| 1017 | tnode_free((struct tnode *) l); | ||
| 1018 | *err = -ENOMEM; | ||
| 1019 | goto err; | ||
| 1020 | } | ||
| 1021 | |||
| 1009 | NODE_SET_PARENT(tn, tp); | 1022 | NODE_SET_PARENT(tn, tp); |
| 1010 | 1023 | ||
| 1011 | missbit=tkey_extract_bits(key, newpos, 1); | 1024 | missbit=tkey_extract_bits(key, newpos, 1); |
| @@ -1027,7 +1040,9 @@ fib_insert_node(struct trie *t, u32 key, int plen) | |||
| 1027 | } | 1040 | } |
| 1028 | /* Rebalance the trie */ | 1041 | /* Rebalance the trie */ |
| 1029 | t->trie = trie_rebalance(t, tp); | 1042 | t->trie = trie_rebalance(t, tp); |
| 1030 | done:; | 1043 | done: |
| 1044 | t->revision++; | ||
| 1045 | err:; | ||
| 1031 | return fa_head; | 1046 | return fa_head; |
| 1032 | } | 1047 | } |
| 1033 | 1048 | ||
| @@ -1156,8 +1171,12 @@ fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, | |||
| 1156 | * Insert new entry to the list. | 1171 | * Insert new entry to the list. |
| 1157 | */ | 1172 | */ |
| 1158 | 1173 | ||
| 1159 | if(!fa_head) | 1174 | if(!fa_head) { |
| 1160 | fa_head = fib_insert_node(t, key, plen); | 1175 | fa_head = fib_insert_node(t, &err, key, plen); |
| 1176 | err = 0; | ||
| 1177 | if(err) | ||
| 1178 | goto out_free_new_fa; | ||
| 1179 | } | ||
| 1161 | 1180 | ||
| 1162 | write_lock_bh(&fib_lock); | 1181 | write_lock_bh(&fib_lock); |
| 1163 | 1182 | ||
| @@ -1170,6 +1189,9 @@ fn_trie_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, | |||
| 1170 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, nlhdr, req); | 1189 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, nlhdr, req); |
| 1171 | succeeded: | 1190 | succeeded: |
| 1172 | return 0; | 1191 | return 0; |
| 1192 | |||
| 1193 | out_free_new_fa: | ||
| 1194 | kmem_cache_free(fn_alias_kmem, new_fa); | ||
| 1173 | out: | 1195 | out: |
| 1174 | fib_release_info(fi); | 1196 | fib_release_info(fi); |
| 1175 | err:; | 1197 | err:; |
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index af2ec88bbb2f..c703528e0bcd 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
| @@ -283,14 +283,18 @@ static inline int ip_rcv_finish(struct sk_buff *skb) | |||
| 283 | { | 283 | { |
| 284 | struct net_device *dev = skb->dev; | 284 | struct net_device *dev = skb->dev; |
| 285 | struct iphdr *iph = skb->nh.iph; | 285 | struct iphdr *iph = skb->nh.iph; |
| 286 | int err; | ||
| 286 | 287 | ||
| 287 | /* | 288 | /* |
| 288 | * Initialise the virtual path cache for the packet. It describes | 289 | * Initialise the virtual path cache for the packet. It describes |
| 289 | * how the packet travels inside Linux networking. | 290 | * how the packet travels inside Linux networking. |
| 290 | */ | 291 | */ |
| 291 | if (skb->dst == NULL) { | 292 | if (skb->dst == NULL) { |
| 292 | if (ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev)) | 293 | if ((err = ip_route_input(skb, iph->daddr, iph->saddr, iph->tos, dev))) { |
| 294 | if (err == -EHOSTUNREACH) | ||
| 295 | IP_INC_STATS_BH(IPSTATS_MIB_INADDRERRORS); | ||
| 293 | goto drop; | 296 | goto drop; |
| 297 | } | ||
| 294 | } | 298 | } |
| 295 | 299 | ||
| 296 | #ifdef CONFIG_NET_CLS_ROUTE | 300 | #ifdef CONFIG_NET_CLS_ROUTE |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index ee07aec215a0..6ce5c3292f9f 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
| @@ -188,7 +188,13 @@ static inline int ip_finish_output2(struct sk_buff *skb) | |||
| 188 | skb = skb2; | 188 | skb = skb2; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | nf_reset(skb); | 191 | #ifdef CONFIG_BRIDGE_NETFILTER |
| 192 | /* bridge-netfilter defers calling some IP hooks to the bridge layer | ||
| 193 | * and still needs the conntrack reference. | ||
| 194 | */ | ||
| 195 | if (skb->nf_bridge == NULL) | ||
| 196 | #endif | ||
| 197 | nf_reset(skb); | ||
| 192 | 198 | ||
| 193 | if (hh) { | 199 | if (hh) { |
| 194 | int hh_alen; | 200 | int hh_alen; |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index f2509034ce72..d2bf8e1930a3 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
| @@ -1149,8 +1149,10 @@ static int __init ic_dynamic(void) | |||
| 1149 | ic_rarp_cleanup(); | 1149 | ic_rarp_cleanup(); |
| 1150 | #endif | 1150 | #endif |
| 1151 | 1151 | ||
| 1152 | if (!ic_got_reply) | 1152 | if (!ic_got_reply) { |
| 1153 | ic_myaddr = INADDR_NONE; | ||
| 1153 | return -1; | 1154 | return -1; |
| 1155 | } | ||
| 1154 | 1156 | ||
| 1155 | printk("IP-Config: Got %s answer from %u.%u.%u.%u, ", | 1157 | printk("IP-Config: Got %s answer from %u.%u.%u.%u, ", |
| 1156 | ((ic_got_reply & IC_RARP) ? "RARP" | 1158 | ((ic_got_reply & IC_RARP) ? "RARP" |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index e4f809a93f47..7833d920bdba 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -297,6 +297,7 @@ static int vif_delete(int vifi) | |||
| 297 | static void ipmr_destroy_unres(struct mfc_cache *c) | 297 | static void ipmr_destroy_unres(struct mfc_cache *c) |
| 298 | { | 298 | { |
| 299 | struct sk_buff *skb; | 299 | struct sk_buff *skb; |
| 300 | struct nlmsgerr *e; | ||
| 300 | 301 | ||
| 301 | atomic_dec(&cache_resolve_queue_len); | 302 | atomic_dec(&cache_resolve_queue_len); |
| 302 | 303 | ||
| @@ -306,7 +307,9 @@ static void ipmr_destroy_unres(struct mfc_cache *c) | |||
| 306 | nlh->nlmsg_type = NLMSG_ERROR; | 307 | nlh->nlmsg_type = NLMSG_ERROR; |
| 307 | nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr)); | 308 | nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr)); |
| 308 | skb_trim(skb, nlh->nlmsg_len); | 309 | skb_trim(skb, nlh->nlmsg_len); |
| 309 | ((struct nlmsgerr*)NLMSG_DATA(nlh))->error = -ETIMEDOUT; | 310 | e = NLMSG_DATA(nlh); |
| 311 | e->error = -ETIMEDOUT; | ||
| 312 | memset(&e->msg, 0, sizeof(e->msg)); | ||
| 310 | netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT); | 313 | netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT); |
| 311 | } else | 314 | } else |
| 312 | kfree_skb(skb); | 315 | kfree_skb(skb); |
| @@ -499,6 +502,7 @@ static struct mfc_cache *ipmr_cache_alloc_unres(void) | |||
| 499 | static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c) | 502 | static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c) |
| 500 | { | 503 | { |
| 501 | struct sk_buff *skb; | 504 | struct sk_buff *skb; |
| 505 | struct nlmsgerr *e; | ||
| 502 | 506 | ||
| 503 | /* | 507 | /* |
| 504 | * Play the pending entries through our router | 508 | * Play the pending entries through our router |
| @@ -515,7 +519,9 @@ static void ipmr_cache_resolve(struct mfc_cache *uc, struct mfc_cache *c) | |||
| 515 | nlh->nlmsg_type = NLMSG_ERROR; | 519 | nlh->nlmsg_type = NLMSG_ERROR; |
| 516 | nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr)); | 520 | nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct nlmsgerr)); |
| 517 | skb_trim(skb, nlh->nlmsg_len); | 521 | skb_trim(skb, nlh->nlmsg_len); |
| 518 | ((struct nlmsgerr*)NLMSG_DATA(nlh))->error = -EMSGSIZE; | 522 | e = NLMSG_DATA(nlh); |
| 523 | e->error = -EMSGSIZE; | ||
| 524 | memset(&e->msg, 0, sizeof(e->msg)); | ||
| 519 | } | 525 | } |
| 520 | err = netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT); | 526 | err = netlink_unicast(rtnl, skb, NETLINK_CB(skb).dst_pid, MSG_DONTWAIT); |
| 521 | } else | 527 | } else |
diff --git a/net/ipv4/ipvs/ip_vs_conn.c b/net/ipv4/ipvs/ip_vs_conn.c index fd6feb5499fe..9f16ab309106 100644 --- a/net/ipv4/ipvs/ip_vs_conn.c +++ b/net/ipv4/ipvs/ip_vs_conn.c | |||
| @@ -548,7 +548,6 @@ void ip_vs_conn_expire_now(struct ip_vs_conn *cp) | |||
| 548 | { | 548 | { |
| 549 | if (del_timer(&cp->timer)) | 549 | if (del_timer(&cp->timer)) |
| 550 | mod_timer(&cp->timer, jiffies); | 550 | mod_timer(&cp->timer, jiffies); |
| 551 | __ip_vs_conn_put(cp); | ||
| 552 | } | 551 | } |
| 553 | 552 | ||
| 554 | 553 | ||
| @@ -764,7 +763,6 @@ void ip_vs_random_dropentry(void) | |||
| 764 | { | 763 | { |
| 765 | int idx; | 764 | int idx; |
| 766 | struct ip_vs_conn *cp; | 765 | struct ip_vs_conn *cp; |
| 767 | struct ip_vs_conn *ct; | ||
| 768 | 766 | ||
| 769 | /* | 767 | /* |
| 770 | * Randomly scan 1/32 of the whole table every second | 768 | * Randomly scan 1/32 of the whole table every second |
| @@ -801,21 +799,12 @@ void ip_vs_random_dropentry(void) | |||
| 801 | continue; | 799 | continue; |
| 802 | } | 800 | } |
| 803 | 801 | ||
| 804 | /* | ||
| 805 | * Drop the entry, and drop its ct if not referenced | ||
| 806 | */ | ||
| 807 | atomic_inc(&cp->refcnt); | ||
| 808 | ct_write_unlock(hash); | ||
| 809 | |||
| 810 | if ((ct = cp->control)) | ||
| 811 | atomic_inc(&ct->refcnt); | ||
| 812 | IP_VS_DBG(4, "del connection\n"); | 802 | IP_VS_DBG(4, "del connection\n"); |
| 813 | ip_vs_conn_expire_now(cp); | 803 | ip_vs_conn_expire_now(cp); |
| 814 | if (ct) { | 804 | if (cp->control) { |
| 815 | IP_VS_DBG(4, "del conn template\n"); | 805 | IP_VS_DBG(4, "del conn template\n"); |
| 816 | ip_vs_conn_expire_now(ct); | 806 | ip_vs_conn_expire_now(cp->control); |
| 817 | } | 807 | } |
| 818 | ct_write_lock(hash); | ||
| 819 | } | 808 | } |
| 820 | ct_write_unlock(hash); | 809 | ct_write_unlock(hash); |
| 821 | } | 810 | } |
| @@ -829,7 +818,6 @@ static void ip_vs_conn_flush(void) | |||
| 829 | { | 818 | { |
| 830 | int idx; | 819 | int idx; |
| 831 | struct ip_vs_conn *cp; | 820 | struct ip_vs_conn *cp; |
| 832 | struct ip_vs_conn *ct; | ||
| 833 | 821 | ||
| 834 | flush_again: | 822 | flush_again: |
| 835 | for (idx=0; idx<IP_VS_CONN_TAB_SIZE; idx++) { | 823 | for (idx=0; idx<IP_VS_CONN_TAB_SIZE; idx++) { |
| @@ -839,18 +827,13 @@ static void ip_vs_conn_flush(void) | |||
| 839 | ct_write_lock_bh(idx); | 827 | ct_write_lock_bh(idx); |
| 840 | 828 | ||
| 841 | list_for_each_entry(cp, &ip_vs_conn_tab[idx], c_list) { | 829 | list_for_each_entry(cp, &ip_vs_conn_tab[idx], c_list) { |
| 842 | atomic_inc(&cp->refcnt); | ||
| 843 | ct_write_unlock(idx); | ||
| 844 | 830 | ||
| 845 | if ((ct = cp->control)) | ||
| 846 | atomic_inc(&ct->refcnt); | ||
| 847 | IP_VS_DBG(4, "del connection\n"); | 831 | IP_VS_DBG(4, "del connection\n"); |
| 848 | ip_vs_conn_expire_now(cp); | 832 | ip_vs_conn_expire_now(cp); |
| 849 | if (ct) { | 833 | if (cp->control) { |
| 850 | IP_VS_DBG(4, "del conn template\n"); | 834 | IP_VS_DBG(4, "del conn template\n"); |
| 851 | ip_vs_conn_expire_now(ct); | 835 | ip_vs_conn_expire_now(cp->control); |
| 852 | } | 836 | } |
| 853 | ct_write_lock(idx); | ||
| 854 | } | 837 | } |
| 855 | ct_write_unlock_bh(idx); | 838 | ct_write_unlock_bh(idx); |
| 856 | } | 839 | } |
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c index 9cde8c61f525..6706d3a1bc4f 100644 --- a/net/ipv4/netfilter/ipt_CLUSTERIP.c +++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c | |||
| @@ -30,7 +30,7 @@ | |||
| 30 | #include <linux/netfilter_ipv4/ipt_CLUSTERIP.h> | 30 | #include <linux/netfilter_ipv4/ipt_CLUSTERIP.h> |
| 31 | #include <linux/netfilter_ipv4/ip_conntrack.h> | 31 | #include <linux/netfilter_ipv4/ip_conntrack.h> |
| 32 | 32 | ||
| 33 | #define CLUSTERIP_VERSION "0.6" | 33 | #define CLUSTERIP_VERSION "0.7" |
| 34 | 34 | ||
| 35 | #define DEBUG_CLUSTERIP | 35 | #define DEBUG_CLUSTERIP |
| 36 | 36 | ||
| @@ -524,8 +524,9 @@ arp_mangle(unsigned int hook, | |||
| 524 | || arp->ar_pln != 4 || arp->ar_hln != ETH_ALEN) | 524 | || arp->ar_pln != 4 || arp->ar_hln != ETH_ALEN) |
| 525 | return NF_ACCEPT; | 525 | return NF_ACCEPT; |
| 526 | 526 | ||
| 527 | /* we only want to mangle arp replies */ | 527 | /* we only want to mangle arp requests and replies */ |
| 528 | if (arp->ar_op != htons(ARPOP_REPLY)) | 528 | if (arp->ar_op != htons(ARPOP_REPLY) |
| 529 | && arp->ar_op != htons(ARPOP_REQUEST)) | ||
| 529 | return NF_ACCEPT; | 530 | return NF_ACCEPT; |
| 530 | 531 | ||
| 531 | payload = (void *)(arp+1); | 532 | payload = (void *)(arp+1); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 80cf633d9f4a..12a1cf306f67 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -1909,7 +1909,7 @@ static int ip_route_input_slow(struct sk_buff *skb, u32 daddr, u32 saddr, | |||
| 1909 | */ | 1909 | */ |
| 1910 | if ((err = fib_lookup(&fl, &res)) != 0) { | 1910 | if ((err = fib_lookup(&fl, &res)) != 0) { |
| 1911 | if (!IN_DEV_FORWARD(in_dev)) | 1911 | if (!IN_DEV_FORWARD(in_dev)) |
| 1912 | goto e_inval; | 1912 | goto e_hostunreach; |
| 1913 | goto no_route; | 1913 | goto no_route; |
| 1914 | } | 1914 | } |
| 1915 | free_res = 1; | 1915 | free_res = 1; |
| @@ -1933,7 +1933,7 @@ static int ip_route_input_slow(struct sk_buff *skb, u32 daddr, u32 saddr, | |||
| 1933 | } | 1933 | } |
| 1934 | 1934 | ||
| 1935 | if (!IN_DEV_FORWARD(in_dev)) | 1935 | if (!IN_DEV_FORWARD(in_dev)) |
| 1936 | goto e_inval; | 1936 | goto e_hostunreach; |
| 1937 | if (res.type != RTN_UNICAST) | 1937 | if (res.type != RTN_UNICAST) |
| 1938 | goto martian_destination; | 1938 | goto martian_destination; |
| 1939 | 1939 | ||
| @@ -2025,6 +2025,11 @@ martian_destination: | |||
| 2025 | "%u.%u.%u.%u, dev %s\n", | 2025 | "%u.%u.%u.%u, dev %s\n", |
| 2026 | NIPQUAD(daddr), NIPQUAD(saddr), dev->name); | 2026 | NIPQUAD(daddr), NIPQUAD(saddr), dev->name); |
| 2027 | #endif | 2027 | #endif |
| 2028 | |||
| 2029 | e_hostunreach: | ||
| 2030 | err = -EHOSTUNREACH; | ||
| 2031 | goto done; | ||
| 2032 | |||
| 2028 | e_inval: | 2033 | e_inval: |
| 2029 | err = -EINVAL; | 2034 | err = -EINVAL; |
| 2030 | goto done; | 2035 | goto done; |
