Commit 737bfa64 authored by Kai Germaschewski's avatar Kai Germaschewski

ISDN: Move net_device setup to a type-specific method

isdn_net handles all kind of interfaces, e.g. raw IP, ethernet over ISDN,
PPP - this is a cleanup making the setup of a net_device specific to the
type of interface.
parent 5fd62b58
...@@ -371,8 +371,9 @@ isdn_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb) ...@@ -371,8 +371,9 @@ isdn_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb)
kfree_skb(skb); kfree_skb(skb);
} }
int isdn_ciscohdlck_setup_dev(isdn_net_dev *p) int isdn_ciscohdlck_setup(isdn_net_dev *p)
{ {
isdn_other_setup(p);
p->dev.do_ioctl = isdn_ciscohdlck_dev_ioctl; p->dev.do_ioctl = isdn_ciscohdlck_dev_ioctl;
return 0; return 0;
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
void isdn_ciscohdlck_connected(isdn_net_local *lp); void isdn_ciscohdlck_connected(isdn_net_local *lp);
void isdn_ciscohdlck_disconnected(isdn_net_local *lp); void isdn_ciscohdlck_disconnected(isdn_net_local *lp);
int isdn_ciscohdlck_setup_dev(isdn_net_dev *p); int isdn_ciscohdlck_setup(isdn_net_dev *p);
void isdn_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb); void isdn_ciscohdlck_receive(isdn_net_local *lp, struct sk_buff *skb);
#endif #endif
...@@ -611,11 +611,9 @@ isdn_status_callback(isdn_ctrl * c) ...@@ -611,11 +611,9 @@ isdn_status_callback(isdn_ctrl * c)
dbg_statcallb("BHUP: %d\n", i); dbg_statcallb("BHUP: %d\n", i);
dev->drv[di]->online &= ~(1 << (c->arg)); dev->drv[di]->online &= ~(1 << (c->arg));
isdn_info_update(); isdn_info_update();
#ifdef CONFIG_ISDN_X25
/* Signal hangup to network-devices */ /* Signal hangup to network-devices */
if (isdn_net_stat_callback(i, c)) if (isdn_net_stat_callback(i, c))
break; break;
#endif
isdn_v110_stat_callback(&slot[i].iv110, c); isdn_v110_stat_callback(&slot[i].iv110, c);
if (isdn_tty_stat_callback(i, c)) if (isdn_tty_stat_callback(i, c))
break; break;
......
...@@ -107,7 +107,7 @@ struct concap_proto * isdn_concap_new( int encap ) ...@@ -107,7 +107,7 @@ struct concap_proto * isdn_concap_new( int encap )
return NULL; return NULL;
} }
void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg) void isdn_x25_cleanup(isdn_net_dev *p)
{ {
isdn_net_local *lp = &p->local; isdn_net_local *lp = &p->local;
struct concap_proto * cprot = p -> cprot; struct concap_proto * cprot = p -> cprot;
...@@ -122,8 +122,14 @@ void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg) ...@@ -122,8 +122,14 @@ void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg)
p -> cprot = NULL; p -> cprot = NULL;
lp -> dops = NULL; lp -> dops = NULL;
restore_flags(flags); restore_flags(flags);
}
int isdn_x25_setup(isdn_net_dev *p, int encap)
{
isdn_net_local *lp = &p->local;
/* ... , prepare for configuration of new one ... */ /* ... , prepare for configuration of new one ... */
switch ( cfg -> p_encap ){ switch ( encap ){
case ISDN_NET_ENCAP_X25IFACE: case ISDN_NET_ENCAP_X25IFACE:
lp -> dops = &isdn_concap_reliable_dl_dops; lp -> dops = &isdn_concap_reliable_dl_dops;
} }
...@@ -131,15 +137,16 @@ void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg) ...@@ -131,15 +137,16 @@ void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg)
p -> cprot = isdn_concap_new( cfg -> p_encap ); p -> cprot = isdn_concap_new( cfg -> p_encap );
/* p -> cprot == NULL now if p_encap is not supported /* p -> cprot == NULL now if p_encap is not supported
by means of the concap_proto mechanism */ by means of the concap_proto mechanism */
/* the protocol is not configured yet; this will if (!p->cprot)
happen later when isdn_net_reset() is called */ return -EINVAL;
}
int isdn_x25_setup_dev(isdn_net_dev *p) isdn_other_setup(p);
{
p->dev.type = ARPHRD_X25; /* change ARP type */ p->dev.type = ARPHRD_X25; /* change ARP type */
p->dev.addr_len = 0; p->dev.addr_len = 0;
/* the protocol is not configured yet; this will
happen later when isdn_x25_open() is called */
return 0; return 0;
} }
...@@ -251,9 +258,6 @@ void isdn_x25_receive(isdn_net_local *lp, struct sk_buff *skb) ...@@ -251,9 +258,6 @@ void isdn_x25_receive(isdn_net_local *lp, struct sk_buff *skb)
cprot -> pops -> data_ind(cprot,skb); cprot -> pops -> data_ind(cprot,skb);
return; return;
} }
printk(KERN_WARNING "%s: unknown encapsulation, dropping\n",
lp->name);
kfree_skb(skb);
} }
void isdn_x25_realrm(isdn_net_dev *p) void isdn_x25_realrm(isdn_net_dev *p)
......
...@@ -14,8 +14,8 @@ struct concap_proto *isdn_concap_new(int); ...@@ -14,8 +14,8 @@ struct concap_proto *isdn_concap_new(int);
#ifdef CONFIG_ISDN_X25 #ifdef CONFIG_ISDN_X25
void isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg); int isdn_x25_setup(isdn_net_dev *p, int encap);
int isdn_x25_setup_dev(isdn_net_dev *p); void isdn_x25_cleanup(isdn_net_dev *p);
void isdn_x25_open(struct net_device *dev); void isdn_x25_open(struct net_device *dev);
void isdn_x25_close(struct net_device *dev); void isdn_x25_close(struct net_device *dev);
void isdn_x25_connected(isdn_net_local *lp); void isdn_x25_connected(isdn_net_local *lp);
...@@ -28,14 +28,14 @@ void isdn_x25_realrm(isdn_net_dev *p); ...@@ -28,14 +28,14 @@ void isdn_x25_realrm(isdn_net_dev *p);
#else #else
static inline void static inline void
isdn_x25_encap_changed(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg) isdn_x25_cleanup(isdn_net_dev *p)
{ {
} }
static inline int static inline int
isdn_x25_setup_dev(isdn_net_dev *p) isdn_x25_setup(isdn_net_dev *p, int encap)
{ {
printk(KERN_WARNING "ISDN: SyncPPP support not configured\n"); printk(KERN_WARNING "ISDN: X25 support not configured\n");
return -EINVAL; return -EINVAL;
} }
...@@ -69,12 +69,15 @@ isdn_x25_hangup(isdn_net_local *lp) ...@@ -69,12 +69,15 @@ isdn_x25_hangup(isdn_net_local *lp)
{ {
} }
static inline int
isdn_x25_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
return 0;
}
static inline void static inline void
isdn_x25_receive(isdn_net_local *lp, struct sk_buff *skb) isdn_x25_receive(isdn_net_local *lp, struct sk_buff *skb)
{ {
printk(KERN_WARNING "%s: unknown encapsulation, dropping\n",
lp->name);
kfree_skb(skb);
} }
static inline void static inline void
......
...@@ -205,6 +205,9 @@ static void do_dialout(isdn_net_local *lp); ...@@ -205,6 +205,9 @@ static void do_dialout(isdn_net_local *lp);
static int isdn_net_handle_event(isdn_net_local *lp, int pr, void *arg); static int isdn_net_handle_event(isdn_net_local *lp, int pr, void *arg);
static int isdn_rawip_setup(isdn_net_dev *p);
static int isdn_ether_setup(isdn_net_dev *p);
char *isdn_net_revision = "$Revision: 1.140.6.11 $"; char *isdn_net_revision = "$Revision: 1.140.6.11 $";
/* /*
...@@ -1061,10 +1064,8 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev) ...@@ -1061,10 +1064,8 @@ isdn_net_start_xmit(struct sk_buff *skb, struct net_device *ndev)
unsigned long flags; unsigned long flags;
isdn_net_local *lp = (isdn_net_local *) ndev->priv; isdn_net_local *lp = (isdn_net_local *) ndev->priv;
#ifdef CONFIG_ISDN_X25 if (lp->p_encap == ISDN_NET_ENCAP_X25IFACE)
if (lp->netdev->cprot)
return isdn_x25_start_xmit(skb, ndev); return isdn_x25_start_xmit(skb, ndev);
#endif
/* auto-dialing xmit function */ /* auto-dialing xmit function */
{ {
...@@ -1320,10 +1321,13 @@ isdn_net_receive(struct net_device *ndev, struct sk_buff *skb) ...@@ -1320,10 +1321,13 @@ isdn_net_receive(struct net_device *ndev, struct sk_buff *skb)
} }
isdn_ppp_receive(lp->netdev, olp, skb); isdn_ppp_receive(lp->netdev, olp, skb);
return; return;
case ISDN_NET_ENCAP_X25IFACE:
default:
isdn_x25_receive(lp, skb); isdn_x25_receive(lp, skb);
return; return;
default:
isdn_BUG();
kfree_skb(skb);
return;
} }
netif_rx(skb); netif_rx(skb);
...@@ -1928,14 +1932,12 @@ isdn_net_force_dial_lp(isdn_net_local * lp) ...@@ -1928,14 +1932,12 @@ isdn_net_force_dial_lp(isdn_net_local * lp)
} }
/* Connect interface with channel */ /* Connect interface with channel */
isdn_net_bind_channel(lp, chi); isdn_net_bind_channel(lp, chi);
#ifdef CONFIG_ISDN_PPP
if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP) if (lp->p_encap == ISDN_NET_ENCAP_SYNCPPP)
if (isdn_ppp_bind(lp) < 0) { if (isdn_ppp_bind(lp) < 0) {
isdn_net_unbind_channel(lp); isdn_net_unbind_channel(lp);
restore_flags(flags); restore_flags(flags);
return -EAGAIN; return -EAGAIN;
} }
#endif
/* Initiate dialing */ /* Initiate dialing */
restore_flags(flags); restore_flags(flags);
init_dialout(lp); init_dialout(lp);
...@@ -2102,54 +2104,47 @@ isdn_net_set_encap(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg) ...@@ -2102,54 +2104,47 @@ isdn_net_set_encap(isdn_net_dev *p, isdn_net_ioctl_cfg *cfg)
isdn_net_local *lp = &p->local; isdn_net_local *lp = &p->local;
int retval; int retval;
if (cfg->p_encap < 0 ||
cfg->p_encap > ISDN_NET_ENCAP_MAX_ENCAP) {
retval = -EINVAL;
goto out;
}
if (lp->p_encap == cfg->p_encap){ if (lp->p_encap == cfg->p_encap){
/* no change */ /* nothing to do */
retval = 0; retval = 0;
goto out; goto out;
} }
if (isdn_net_device_started(p)) { if (isdn_net_device_started(p)) {
retval = -EBUSY; retval = -EBUSY;
goto out; goto out;
} }
isdn_x25_encap_changed(p, cfg); switch (lp->p_encap) {
case ISDN_NET_ENCAP_X25IFACE:
isdn_x25_cleanup(p);
break;
}
switch ( cfg->p_encap ) { switch (cfg->p_encap) {
case ISDN_NET_ENCAP_SYNCPPP: case ISDN_NET_ENCAP_SYNCPPP:
retval = isdn_ppp_setup_dev(p); retval = isdn_ppp_setup(p);
break; break;
case ISDN_NET_ENCAP_X25IFACE: case ISDN_NET_ENCAP_X25IFACE:
retval = isdn_x25_setup_dev(p); retval = isdn_x25_setup(p, cfg->p_encap);
break; break;
case ISDN_NET_ENCAP_CISCOHDLCK: case ISDN_NET_ENCAP_CISCOHDLCK:
retval = isdn_ciscohdlck_setup_dev(p); retval = isdn_ciscohdlck_setup(p);
break;
case ISDN_NET_ENCAP_RAWIP:
retval = isdn_rawip_setup(p);
break;
case ISDN_NET_ENCAP_ETHER:
retval = isdn_ether_setup(p);
break; break;
default: default:
if (cfg->p_encap < 0 || retval = isdn_other_setup(p);
cfg->p_encap > ISDN_NET_ENCAP_MAX_ENCAP) {
retval = -EINVAL;
break; break;
} }
retval = 0; if (retval == 0)
}
if (cfg->p_encap == ISDN_NET_ENCAP_RAWIP) {
p->dev.hard_header = NULL;
p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
} else {
p->dev.hard_header = isdn_net_header;
if (cfg->p_encap == ISDN_NET_ENCAP_ETHER) {
p->dev.hard_header_cache = lp->org_hhc;
p->dev.header_cache_update = lp->org_hcu;
p->dev.flags = IFF_BROADCAST | IFF_MULTICAST;
} else {
p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
}
}
lp->p_encap = cfg->p_encap; lp->p_encap = cfg->p_encap;
out: out:
...@@ -2651,3 +2646,39 @@ isdn_net_rmall(void) ...@@ -2651,3 +2646,39 @@ isdn_net_rmall(void)
restore_flags(flags); restore_flags(flags);
return 0; return 0;
} }
static int
isdn_rawip_setup(isdn_net_dev *p)
{
p->dev.hard_header = NULL;
p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
return 0;
}
static int
isdn_ether_setup(isdn_net_dev *p)
{
isdn_net_local *lp = &p->local;
p->dev.hard_header = isdn_net_header;
p->dev.hard_header_cache = lp->org_hhc;
p->dev.header_cache_update = lp->org_hcu;
p->dev.flags = IFF_BROADCAST | IFF_MULTICAST;
return 0;
}
int
isdn_other_setup(isdn_net_dev *p)
{
p->dev.hard_header = isdn_net_header;
p->dev.hard_header_cache = NULL;
p->dev.header_cache_update = NULL;
p->dev.flags = IFF_NOARP|IFF_POINTOPOINT;
return 0;
}
...@@ -53,6 +53,7 @@ extern int isdn_net_rcv_skb(int, struct sk_buff *); ...@@ -53,6 +53,7 @@ extern int isdn_net_rcv_skb(int, struct sk_buff *);
extern int isdn_net_dial_req(isdn_net_local *); extern int isdn_net_dial_req(isdn_net_local *);
extern void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb); extern void isdn_net_writebuf_skb(isdn_net_local *lp, struct sk_buff *skb);
extern void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb); extern void isdn_net_write_super(isdn_net_local *lp, struct sk_buff *skb);
extern int isdn_other_setup(isdn_net_dev *p);
#define ISDN_NET_MAX_QUEUE_LENGTH 2 #define ISDN_NET_MAX_QUEUE_LENGTH 2
......
...@@ -2895,8 +2895,9 @@ static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_ ...@@ -2895,8 +2895,9 @@ static int isdn_ppp_set_compressor(struct ippp_struct *is, struct isdn_ppp_comp_
return -EINVAL; return -EINVAL;
} }
int isdn_ppp_setup_dev(isdn_net_dev *p) int isdn_ppp_setup(isdn_net_dev *p)
{ {
isdn_other_setup(p);
p->dev.type = ARPHRD_PPP; /* change ARP type */ p->dev.type = ARPHRD_PPP; /* change ARP type */
p->dev.addr_len = 0; p->dev.addr_len = 0;
p->dev.do_ioctl = isdn_ppp_dev_ioctl; p->dev.do_ioctl = isdn_ppp_dev_ioctl;
......
...@@ -21,7 +21,7 @@ extern int isdn_ppp_hangup_slave(char *); ...@@ -21,7 +21,7 @@ extern int isdn_ppp_hangup_slave(char *);
#ifdef CONFIG_ISDN_PPP #ifdef CONFIG_ISDN_PPP
int isdn_ppp_setup_dev(isdn_net_dev *p); int isdn_ppp_setup(isdn_net_dev *p);
void isdn_ppp_wakeup_daemon(isdn_net_local *); void isdn_ppp_wakeup_daemon(isdn_net_local *);
int isdn_ppp_bind(isdn_net_local *); int isdn_ppp_bind(isdn_net_local *);
void isdn_ppp_free(isdn_net_local *); void isdn_ppp_free(isdn_net_local *);
...@@ -31,7 +31,7 @@ int isdn_ppp_xmit(struct sk_buff *, struct net_device *); ...@@ -31,7 +31,7 @@ int isdn_ppp_xmit(struct sk_buff *, struct net_device *);
#else #else
static inline int static inline int
isdn_ppp_setup_dev(isdn_net_dev *p) isdn_ppp_setup(isdn_net_dev *p)
{ {
printk(KERN_WARNING "ISDN: SyncPPP support not configured\n"); printk(KERN_WARNING "ISDN: SyncPPP support not configured\n");
return -EINVAL; return -EINVAL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment