ax25_dev
struct ax25_dev __rcu *ax25_ptr;
ax25_dev *ax25_dev;
static inline void ax25_dev_hold(ax25_dev *ax25_dev)
refcount_inc(&ax25_dev->refcount);
static inline void ax25_dev_put(ax25_dev *ax25_dev)
if (refcount_dec_and_test(&ax25_dev->refcount))
kfree_rcu(ax25_dev, rcu);
void ax25_fillin_cb(ax25_cb *, ax25_dev *);
struct sock *ax25_make_new(struct sock *, struct ax25_dev *);
static inline ax25_dev *ax25_dev_ax25dev(const struct net_device *dev)
ax25_dev *ax25_addr_ax25dev(ax25_address *);
void ax25_dev_dama_off(ax25_dev *);
void ax25_ds_setup_timer(ax25_dev *);
void ax25_ds_set_timer(ax25_dev *);
void ax25_ds_del_timer(ax25_dev *);
int ax25_register_dev_sysctl(ax25_dev *ax25_dev);
void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev);
static inline int ax25_register_dev_sysctl(ax25_dev *ax25_dev) { return 0; }
static inline void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) {}
ax25_dev = ax25->ax25_dev;
s->ax25_dev = NULL;
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
netdev_put(ax25_dev->dev,
ax25_dev_put(ax25_dev);
if (ax25_dev) {
if (!ax25_dev->device_up) {
netdev_put(ax25_dev->dev, &ax25->dev_tracker);
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev = NULL;
if (ax25->ax25_dev != NULL)
(ax25_dev = ax25_addr_ax25dev(&addr->fsa_digipeater[0])) == NULL) {
if ((ax25_dev = ax25_addr_ax25dev(&addr->fsa_ax25.sax25_call)) == NULL) {
if (ax25_dev) {
ax25_fillin_cb(ax25, ax25_dev);
netdev_hold(ax25_dev->dev, &ax25->dev_tracker, GFP_ATOMIC);
if (ax25->ax25_dev == NULL) {
ax25->ax25_dev->dev))) {
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
if (ax25->ax25_dev->dama.slave)
ax25_dev *ax25_dev;
ax25_dev = ax25->ax25_dev;
netdev_hold(ax25_dev->dev, &ax25->dev_tracker, GFP_ATOMIC);
ax25_dev_hold(ax25_dev);
if (ax25->ax25_dev != NULL) {
ax25->ax25_dev->dev->dev_addr, AX25_ADDR_LEN);
if (ax25->ax25_dev == NULL) {
if (len > ax25->ax25_dev->dev->mtu) {
size = len + ax25->ax25_dev->dev->hard_header_len;
ax25_queue_xmit(skb, ax25->ax25_dev->dev);
if (s->ax25_dev == NULL || s->ax25_dev->dev == dev) {
ax25->ax25_dev == NULL? "???" : ax25->ax25_dev->dev->name,
if (s->ax25_dev == NULL)
if (ax25cmp(&s->source_addr, src_addr) == 0 && ax25cmp(&s->dest_addr, dest_addr) == 0 && s->ax25_dev->dev == dev) {
s->ax25_dev->dev == skb->dev &&
ax25_dev *ax25_dev;
ax25_dev = ax25_addr_ax25dev(&ax25_ctl.port_addr);
if (!ax25_dev)
ax25 = ax25_find_cb(&ax25_ctl.source_addr, &ax25_ctl.dest_addr, &digi, ax25_dev->dev);
ax25_dev_put(ax25_dev);
if (ax25_dev->dama.slave && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
ax25_dev_put(ax25_dev);
static void ax25_fillin_cb_from_dev(ax25_cb *ax25, const ax25_dev *ax25_dev)
ax25->rtt = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]) / 2;
ax25->t1 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T1]);
ax25->t2 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T2]);
ax25->t3 = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_T3]);
ax25->n2 = ax25_dev->values[AX25_VALUES_N2];
ax25->paclen = ax25_dev->values[AX25_VALUES_PACLEN];
ax25->idle = msecs_to_jiffies(ax25_dev->values[AX25_VALUES_IDLE]);
ax25->backoff = ax25_dev->values[AX25_VALUES_BACKOFF];
if (ax25_dev->values[AX25_VALUES_AXDEFMODE]) {
ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
void ax25_fillin_cb(ax25_cb *ax25, ax25_dev *ax25_dev)
ax25->ax25_dev = ax25_dev;
if (ax25->ax25_dev != NULL) {
ax25_fillin_cb_from_dev(ax25, ax25_dev);
if (ax25->ax25_dev) {
if (dev == ax25->ax25_dev->dev) {
netdev_put(ax25->ax25_dev->dev, &ax25->dev_tracker);
ax25_dev_put(ax25->ax25_dev);
ax25->ax25_dev = ax25_dev_ax25dev(dev);
if (!ax25->ax25_dev) {
ax25_fillin_cb(ax25, ax25->ax25_dev);
ax25_dev_hold(ax25->ax25_dev);
struct ax25_dev *ax25_dev;
ax25_dev *ax25_dev;
ax25_dev = ax25->ax25_dev;
if (ax25_dev != NULL && ax25_dev->dev != NULL) {
strscpy(devname, ax25_dev->dev->name, sizeof(devname));
if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
ax25_dev->device_up = false;
if (s->ax25_dev == ax25_dev) {
struct sock *ax25_make_new(struct sock *osk, struct ax25_dev *ax25_dev)
s->ax25_dev = NULL;
ax25->ax25_dev = ax25_dev;
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
ax25_unregister_dev_sysctl(ax25_dev);
timer_shutdown_sync(&ax25_dev->dama.slave_timer);
if (s == ax25_dev) {
netdev_put(dev, &ax25_dev->dev_tracker);
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev, *fwd_dev;
if ((ax25_dev = ax25_addr_ax25dev(&fwd->port_from)) == NULL)
ax25_dev_put(ax25_dev);
if (ax25_dev->forward) {
ax25_dev_put(ax25_dev);
ax25_dev->forward = fwd_dev->dev;
ax25_dev_put(ax25_dev);
if (!ax25_dev->forward) {
ax25_dev_put(ax25_dev);
ax25_dev->forward = NULL;
ax25_dev_put(ax25_dev);
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
if (ax25_dev->forward == NULL)
return ax25_dev->forward;
ax25_dev *s, *n;
ax25_dev *ax25_addr_ax25dev(ax25_address *addr)
ax25_dev *ax25_dev, *res = NULL;
list_for_each_entry(ax25_dev, &ax25_dev_list, list)
if (ax25cmp(addr, (const ax25_address *)ax25_dev->dev->dev_addr) == 0) {
res = ax25_dev;
ax25_dev_hold(ax25_dev);
ax25_dev *ax25_dev;
ax25_dev = kzalloc_obj(*ax25_dev);
if (!ax25_dev) {
refcount_set(&ax25_dev->refcount, 1);
ax25_dev->dev = dev;
netdev_hold(dev, &ax25_dev->dev_tracker, GFP_KERNEL);
ax25_dev->forward = NULL;
ax25_dev->device_up = true;
ax25_dev->values[AX25_VALUES_IPDEFMODE] = AX25_DEF_IPDEFMODE;
ax25_dev->values[AX25_VALUES_AXDEFMODE] = AX25_DEF_AXDEFMODE;
ax25_dev->values[AX25_VALUES_BACKOFF] = AX25_DEF_BACKOFF;
ax25_dev->values[AX25_VALUES_CONMODE] = AX25_DEF_CONMODE;
ax25_dev->values[AX25_VALUES_WINDOW] = AX25_DEF_WINDOW;
ax25_dev->values[AX25_VALUES_EWINDOW] = AX25_DEF_EWINDOW;
ax25_dev->values[AX25_VALUES_T1] = AX25_DEF_T1;
ax25_dev->values[AX25_VALUES_T2] = AX25_DEF_T2;
ax25_dev->values[AX25_VALUES_T3] = AX25_DEF_T3;
ax25_dev->values[AX25_VALUES_IDLE] = AX25_DEF_IDLE;
ax25_dev->values[AX25_VALUES_N2] = AX25_DEF_N2;
ax25_dev->values[AX25_VALUES_PACLEN] = AX25_DEF_PACLEN;
ax25_dev->values[AX25_VALUES_PROTOCOL] = AX25_DEF_PROTOCOL;
ax25_dev->values[AX25_VALUES_DS_TIMEOUT]= AX25_DEF_DS_TIMEOUT;
ax25_ds_setup_timer(ax25_dev);
list_add(&ax25_dev->list, &ax25_dev_list);
rcu_assign_pointer(dev->ax25_ptr, ax25_dev);
ax25_register_dev_sysctl(ax25_dev);
ax25_dev *s, *ax25_dev;
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
static void ax25_kiss_cmd(ax25_dev *ax25_dev, unsigned char cmd, unsigned char param)
if (ax25_dev->dev == NULL)
skb->protocol = ax25_type_trans(skb, ax25_dev->dev);
static int ax25_check_dama_slave(ax25_dev *ax25_dev)
if (ax25->ax25_dev == ax25_dev && (ax25->condition & AX25_COND_DAMA_MODE) && ax25->state > AX25_STATE_1) {
static void ax25_dev_dama_on(ax25_dev *ax25_dev)
if (ax25_dev == NULL)
if (ax25_dev->dama.slave == 0)
ax25_kiss_cmd(ax25_dev, 5, 1);
ax25_dev->dama.slave = 1;
ax25_ds_set_timer(ax25_dev);
void ax25_dev_dama_off(ax25_dev *ax25_dev)
if (ax25_dev == NULL)
if (ax25_dev->dama.slave && !ax25_check_dama_slave(ax25_dev)) {
ax25_kiss_cmd(ax25_dev, 5, 0);
ax25_dev->dama.slave = 0;
ax25_ds_del_timer(ax25_dev);
ax25_dev_dama_on(ax25->ax25_dev);
ax25_dev_dama_off(ax25->ax25_dev);
ax25_ds_set_timer(ax25->ax25_dev);
if (ax25o->ax25_dev != ax25->ax25_dev)
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
void ax25_ds_setup_timer(ax25_dev *ax25_dev)
timer_setup(&ax25_dev->dama.slave_timer, ax25_ds_timeout, 0);
void ax25_ds_del_timer(ax25_dev *ax25_dev)
if (ax25_dev)
timer_delete(&ax25_dev->dama.slave_timer);
void ax25_ds_set_timer(ax25_dev *ax25_dev)
if (ax25_dev == NULL) /* paranoia */
ax25_dev->dama.slave_timeout =
msecs_to_jiffies(ax25_dev->values[AX25_VALUES_DS_TIMEOUT]) / 10;
mod_timer(&ax25_dev->dama.slave_timer, jiffies + HZ);
ax25_dev *ax25_dev = timer_container_of(ax25_dev, t, dama.slave_timer);
if (ax25_dev == NULL || !ax25_dev->dama.slave)
if (!ax25_dev->dama.slave_timeout || --ax25_dev->dama.slave_timeout) {
ax25_ds_set_timer(ax25_dev);
if (ax25->ax25_dev != ax25_dev || !(ax25->condition & AX25_COND_DAMA_MODE))
ax25_dev_dama_off(ax25_dev);
skb->dev = ax25->ax25_dev->dev;
if (ax25->sk != NULL && ax25->ax25_dev->values[AX25_VALUES_CONMODE] == 2) {
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (dama || ax25->ax25_dev->dama.slave)
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
if (ax25_dev->values[AX25_VALUES_CONMODE] == 0)
(make = ax25_make_new(sk, ax25_dev)) == NULL) {
ax25_fillin_cb(ax25, ax25_dev);
ax25->window = ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25_dev->values[AX25_VALUES_WINDOW];
if (dama && ax25->ax25_dev->values[AX25_VALUES_PROTOCOL] == AX25_PROTO_DAMA_SLAVE)
skbn->dev = ax25->ax25_dev->dev;
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) {
if (ip_mode == 'V' || (ip_mode == ' ' && ax25_dev->values[AX25_VALUES_IPDEFMODE])) {
ax25_dev->values[AX25_VALUES_PACLEN],
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (!ax25->ax25_dev->dama.slave) ax25_kick(ax25);
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
ax25_dev *ax25_dev;
if (ax25->ax25_dev == NULL) {
ax25_queue_xmit(skb, ax25->ax25_dev->dev);
ax25_dev = ax25_dev_ax25dev(dev);
if (!ax25_dev) {
paclen = ax25_dev->values[AX25_VALUES_PACLEN];
ax25_dev = ax25_dev_ax25dev(dev);
if (!ax25_dev) {
ax25_fillin_cb(ax25, ax25_dev);
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (ax25_dev->dama.slave)
ax25_dev_put(ax25_dev);
ax25_dev_put(ax25_dev);
ax25_rt->dev = ax25_dev->dev;
ax25_dev_put(ax25_dev);
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_addr_ax25dev(&route->port_addr)) == NULL)
if (s->dev == ax25_dev->dev &&
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev;
if ((ax25_dev = ax25_addr_ax25dev(&rt_option->port_addr)) == NULL)
if (ax25_rt->dev == ax25_dev->dev &&
ax25_dev_put(ax25_dev);
ax25_dev *ax25_dev;
ax25_dev = ax25_addr_ax25dev(&route->port_addr);
if (!ax25_dev)
ax25_rt->dev == ax25_dev->dev) {
ax25_dev_put(ax25_dev);
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_EWINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
ax25->window = ax25->ax25_dev->values[AX25_VALUES_WINDOW];
if ((skb = alloc_skb(ax25->ax25_dev->dev->hard_header_len + 2, GFP_ATOMIC)) == NULL)
skb_reserve(skb, ax25->ax25_dev->dev->hard_header_len);
if (ax25->ax25_dev)
proto = ax25->ax25_dev->values[AX25_VALUES_PROTOCOL];
if (ax25->ax25_dev->dama.slave)
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (!ax25->ax25_dev->dama.slave)
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (!ax25->ax25_dev->dama.slave)
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (ax25->ax25_dev->dama.slave)
switch (ax25->ax25_dev->values[AX25_VALUES_PROTOCOL]) {
if (ax25->ax25_dev->dama.slave)
int ax25_register_dev_sysctl(ax25_dev *ax25_dev)
table[k].data = &ax25_dev->values[k];
snprintf(path, sizeof(path), "net/ax25/%s", ax25_dev->dev->name);
ax25_dev->sysheader = register_net_sysctl_sz(&init_net, path, table,
if (!ax25_dev->sysheader) {
void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev)
struct ctl_table_header *header = ax25_dev->sysheader;
ax25_dev->sysheader = NULL;
ax25->ax25_dev->dev, 0,
ax25->ax25_dev->dev == rose_neigh->dev)