27 #include <linux/capability.h>
28 #include <linux/module.h>
31 #include <linux/net.h>
32 #include <linux/netdevice.h>
36 #include <linux/string.h>
38 #include <linux/if_arp.h>
39 #include <linux/if_ether.h>
41 #include <linux/sysctl.h>
43 #include <linux/slab.h>
44 #include <asm/uaccess.h>
57 #define DN_IFREQ_SIZE (sizeof(struct ifreq) - sizeof(struct sockaddr) + sizeof(struct sockaddr_dn))
59 static char dn_rt_all_end_mcast[
ETH_ALEN] = {0xAB,0x00,0x00,0x04,0x00,0x00};
60 static char dn_rt_all_rt_mcast[
ETH_ALEN] = {0xAB,0x00,0x00,0x03,0x00,0x00};
61 static char dn_hiord[
ETH_ALEN] = {0xAA,0x00,0x04,0x00,0x00,0x00};
62 static unsigned char dn_eco_version[3] = {0x02,0x00,0x00};
72 static struct net_device *decnet_default_device;
94 .timer3 = dn_send_brd_hello,
103 .timer3 = dn_send_brd_hello,
113 .timer3 = dn_send_ptp_hello,
124 .timer3 = dn_send_brd_hello,
134 .timer3 = dn_send_ptp_hello,
143 .timer3 = dn_send_brd_hello,
147 #define DN_DEV_LIST_SIZE ARRAY_SIZE(dn_dev_list)
149 #define DN_DEV_PARMS_OFFSET(x) offsetof(struct dn_dev_parms, x)
153 static int min_t2[] = { 1 };
154 static int max_t2[] = { 60 };
155 static int min_t3[] = { 1 };
156 static int max_t3[] = { 8191 };
158 static int min_priority[1];
159 static int max_priority[] = { 127 };
161 static int dn_forwarding_proc(
ctl_table *,
int,
162 void __user *,
size_t *, loff_t *);
163 static struct dn_dev_sysctl_table {
170 .procname =
"forwarding",
172 .maxlen =
sizeof(
int),
177 .procname =
"priority",
179 .maxlen =
sizeof(
int),
182 .extra1 = &min_priority,
183 .extra2 = &max_priority
188 .maxlen =
sizeof(
int),
197 .maxlen =
sizeof(
int),
209 struct dn_dev_sysctl_table *
t;
218 for(i = 0; i <
ARRAY_SIZE(t->dn_dev_vars) - 1; i++) {
220 t->dn_dev_vars[i].data = ((
char *)
parms) + offset;
226 t->dn_dev_vars[0].extra1 = (
void *)dev;
229 if (t->sysctl_header ==
NULL)
235 static void dn_dev_sysctl_unregister(
struct dn_dev_parms *parms)
238 struct dn_dev_sysctl_table *t = parms->
sysctl;
247 size_t *lenp, loff_t *ppos)
249 #ifdef CONFIG_DECNET_ROUTER
259 old = dn_db->
parms.forwarding;
263 if ((err >= 0) && write) {
264 if (dn_db->
parms.forwarding < 0)
265 dn_db->
parms.forwarding = 0;
266 if (dn_db->
parms.forwarding > 2)
267 dn_db->
parms.forwarding = 2;
274 tmp = dn_db->
parms.forwarding;
275 dn_db->
parms.forwarding = old;
276 if (dn_db->
parms.down)
277 dn_db->
parms.down(dev);
280 dn_db->
parms.up(dev);
290 static void dn_dev_sysctl_unregister(
struct dn_dev_parms *parms)
302 if (blksize > 0xffff)
311 return (
__u16)blksize;
314 static struct dn_ifaddr *dn_dev_alloc_ifa(
void)
323 static void dn_dev_free_ifa(
struct dn_ifaddr *ifa)
348 dn_dev_free_ifa(ifa1);
351 dn_dev_delete(dn_db->
dev);
355 static int dn_dev_insert_ifa(
struct dn_dev *dn_db,
struct dn_ifaddr *ifa)
359 unsigned char mac_addr[6];
394 dn_db = dn_dev_create(dev, &err);
404 rv = dn_dev_insert_ifa(dn_db, ifa);
406 dn_dev_free_ifa(ifa);
468 if ((ifa = dn_dev_alloc_ifa()) ==
NULL) {
476 dn_dev_del_ifa(dn_db, ifap, 0);
481 ret = dn_dev_set_ifa(dev, ifa);
497 spin_lock(&dndev_lock);
498 dev = decnet_default_device;
505 spin_unlock(&dndev_lock);
517 spin_lock(&dndev_lock);
518 if (force || decnet_default_device ==
NULL) {
519 old = decnet_default_device;
520 decnet_default_device =
dev;
523 spin_unlock(&dndev_lock);
530 static void dn_dev_check_default(
struct net_device *dev)
532 spin_lock(&dndev_lock);
533 if (dev == decnet_default_device) {
534 decnet_default_device =
NULL;
538 spin_unlock(&dndev_lock);
547 static struct dn_dev *dn_dev_by_index(
int ifindex)
568 struct net *
net = sock_net(skb->
sk);
570 struct dn_dev *dn_db;
579 err = nlmsg_parse(nlh,
sizeof(*ifm), tb,
IFA_MAX, dn_ifa_policy);
584 ifm = nlmsg_data(nlh);
599 dn_dev_del_ifa(dn_db, ifap, 1);
607 static int dn_nl_newaddr(
struct sk_buff *skb,
struct nlmsghdr *nlh,
void *arg)
609 struct net *net = sock_net(skb->
sk);
612 struct dn_dev *dn_db;
620 err = nlmsg_parse(nlh,
sizeof(*ifm), tb,
IFA_MAX, dn_ifa_policy);
624 if (tb[IFA_LOCAL] ==
NULL)
627 ifm = nlmsg_data(nlh);
632 dn_db = dn_dev_create(dev, &err);
637 if ((ifa = dn_dev_alloc_ifa()) ==
NULL)
643 ifa->
ifa_local = nla_get_le16(tb[IFA_LOCAL]);
654 err = dn_dev_insert_ifa(dn_db, ifa);
656 dn_dev_free_ifa(ifa);
661 static inline size_t dn_ifaddr_nlmsg_size(
void)
675 nlh = nlmsg_put(skb, portid, seq, event,
sizeof(*ifm), flags);
679 ifm = nlmsg_data(nlh);
689 nla_put_le16(skb, IFA_LOCAL, ifa->
ifa_local)) ||
691 nla_put_string(skb, IFA_LABEL, ifa->
ifa_label)))
692 goto nla_put_failure;
693 return nlmsg_end(skb, nlh);
696 nlmsg_cancel(skb, nlh);
700 static void dn_ifaddr_notify(
int event,
struct dn_ifaddr *ifa)
705 skb = alloc_skb(dn_ifaddr_nlmsg_size(),
GFP_KERNEL);
709 err = dn_nl_fill_ifaddr(skb, ifa, 0, 0, event, 0);
725 struct net *net = sock_net(skb->
sk);
726 int idx, dn_idx = 0, skip_ndevs, skip_naddr;
728 struct dn_dev *dn_db;
734 skip_ndevs = cb->
args[0];
735 skip_naddr = cb->
args[1];
740 if (idx < skip_ndevs)
742 else if (idx > skip_ndevs) {
753 if (dn_idx < skip_naddr)
767 cb->
args[1] = dn_idx;
774 struct dn_dev *dn_db;
810 rv = dn_dev_get_first(dev, addr);
812 if (rv == 0 || dev ==
init_net.loopback_dev)
856 skb_reset_network_header(skb);
858 dn_rt_finish_output(skb, dn_rt_all_rt_mcast, msg->
id);
862 #define DRDELAY (5 * HZ)
864 static int dn_am_i_a_router(
struct dn_neigh *dn,
struct dn_dev *dn_db,
struct dn_ifaddr *ifa)
896 unsigned char *i1, *i2;
900 if (mtu2blksize(dev) < (26 + 7))
903 n = mtu2blksize(dev) - 26;
909 size = 2 + 26 + 7 *
n;
924 *
ptr++ = dn_db->
parms.forwarding == 1 ?
948 skb_reset_network_header(skb);
950 if (dn_am_i_a_router(dn, dn_db, ifa)) {
953 dn_rt_finish_output(skb2, dn_rt_all_end_mcast,
src);
957 dn_rt_finish_output(skb, dn_rt_all_rt_mcast,
src);
964 if (dn_db->
parms.forwarding == 0)
965 dn_send_endnode_hello(dev, ifa);
967 dn_send_router_hello(dev, ifa);
984 ptr =
skb_put(skb, 2 + 4 + tdlen);
991 for(i = 0; i < tdlen; i++)
995 dn_rt_finish_output(skb, dn_rt_all_rt_mcast, src);
1002 if (dn_db->
parms.forwarding == 0)
1012 static void dn_eth_down(
struct net_device *dev)
1016 if (dn_db->
parms.forwarding == 0)
1022 static void dn_dev_set_timer(
struct net_device *dev);
1024 static void dn_dev_timer_func(
unsigned long arg)
1027 struct dn_dev *dn_db;
1032 if (dn_db->
t3 <= dn_db->
parms.t2) {
1033 if (dn_db->
parms.timer3) {
1038 dn_db->
parms.timer3(dev, ifa);
1046 dn_dev_set_timer(dev);
1049 static void dn_dev_set_timer(
struct net_device *dev)
1057 dn_db->
timer.function = dn_dev_timer_func;
1063 static struct dn_dev *dn_dev_create(
struct net_device *dev,
int *err)
1067 struct dn_dev *dn_db;
1075 if (i == DN_DEV_LIST_SIZE)
1079 if ((dn_db = kzalloc(
sizeof(
struct dn_dev),
GFP_ATOMIC)) ==
NULL)
1097 if (dn_db->
parms.up) {
1098 if (dn_db->
parms.up(dev) < 0) {
1106 dn_dev_sysctl_register(dev, &dn_db->
parms);
1108 dn_dev_set_timer(dev);
1130 int maybe_default = 0;
1142 if (dn_db ==
NULL) {
1144 dn_db = dn_dev_create(dev, &err);
1159 if ((ifa = dn_dev_alloc_ifa()) ==
NULL)
1167 dn_dev_set_ifa(dev, ifa);
1173 if (maybe_default) {
1180 static void dn_dev_delete(
struct net_device *dev)
1188 dn_dev_sysctl_unregister(&dn_db->
parms);
1189 dn_dev_check_default(dev);
1192 if (dn_db->
parms.down)
1193 dn_db->
parms.down(dev);
1201 neigh_release(dn_db->
router);
1203 neigh_release(dn_db->
peer);
1217 dn_dev_del_ifa(dn_db, &dn_db->
ifa_list, 0);
1218 dn_dev_free_ifa(ifa);
1269 #ifdef CONFIG_PROC_FS
1270 static inline int is_dn_dev(
struct net_device *dev)
1275 static void *dn_dev_seq_start(
struct seq_file *seq, loff_t *
pos)
1288 if (!is_dn_dev(dev))
1298 static void *dn_dev_seq_next(
struct seq_file *seq,
void *
v, loff_t *
pos)
1309 if (!is_dn_dev(dev))
1318 static void dn_dev_seq_stop(
struct seq_file *seq,
void *v)
1324 static char *dn_type2asc(
char type)
1338 static int dn_dev_seq_show(
struct seq_file *seq,
void *v)
1341 seq_puts(seq,
"Name Flags T1 Timer1 T3 Timer3 BlkSize Pri State DevType Router Peer\n");
1348 seq_printf(seq,
"%-8s %1s %04u %04u %04lu %04lu"
1349 " %04hu %03d %02x %-10s %-7s %-7s\n",
1351 dn_type2asc(dn_db->
parms.mode),
1355 dn_db->
parms.priority,
1364 .
start = dn_dev_seq_start,
1365 .next = dn_dev_seq_next,
1366 .stop = dn_dev_seq_stop,
1367 .show = dn_dev_seq_show,
1372 return seq_open(file, &dn_dev_seq_ops);
1377 .open = dn_dev_seq_open,
1391 if (addr[0] > 63 || addr[0] < 0) {
1396 if (addr[1] > 1023 || addr[1] < 0) {
1411 #ifdef CONFIG_SYSCTL
1415 dn_dev_sysctl_register(
NULL, &dn_dev_list[i]);
1422 #ifdef CONFIG_SYSCTL
1426 dn_dev_sysctl_unregister(&dn_dev_list[i]);