[HDLC] Fix dev->header_cache_update having a random value.

Switching HDLC devices from Ethernet-framing mode caused stale ethernet
function assignments within net_device.

Signed-off-by: Krzysztof Halasa <khc@pm.waw.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by Krzysztof Halasa and committed by David S. Miller b5284e5a c6387a86

+23 -23
+23 -10
drivers/net/wan/hdlc.c
··· 38 38 #include <linux/hdlc.h> 39 39 40 40 41 - static const char* version = "HDLC support module revision 1.20"; 41 + static const char* version = "HDLC support module revision 1.21"; 42 42 43 43 #undef DEBUG_LINK 44 44 ··· 222 222 return -EINVAL; 223 223 } 224 224 225 + static void hdlc_setup_dev(struct net_device *dev) 226 + { 227 + /* Re-init all variables changed by HDLC protocol drivers, 228 + * including ether_setup() called from hdlc_raw_eth.c. 229 + */ 230 + dev->get_stats = hdlc_get_stats; 231 + dev->flags = IFF_POINTOPOINT | IFF_NOARP; 232 + dev->mtu = HDLC_MAX_MTU; 233 + dev->type = ARPHRD_RAWHDLC; 234 + dev->hard_header_len = 16; 235 + dev->addr_len = 0; 236 + dev->hard_header = NULL; 237 + dev->rebuild_header = NULL; 238 + dev->set_mac_address = NULL; 239 + dev->hard_header_cache = NULL; 240 + dev->header_cache_update = NULL; 241 + dev->change_mtu = hdlc_change_mtu; 242 + dev->hard_header_parse = NULL; 243 + } 244 + 225 245 static void hdlc_setup(struct net_device *dev) 226 246 { 227 247 hdlc_device *hdlc = dev_to_hdlc(dev); 228 248 229 - dev->get_stats = hdlc_get_stats; 230 - dev->change_mtu = hdlc_change_mtu; 231 - dev->mtu = HDLC_MAX_MTU; 232 - 233 - dev->type = ARPHRD_RAWHDLC; 234 - dev->hard_header_len = 16; 235 - 236 - dev->flags = IFF_POINTOPOINT | IFF_NOARP; 237 - 249 + hdlc_setup_dev(dev); 238 250 hdlc->carrier = 1; 239 251 hdlc->open = 0; 240 252 spin_lock_init(&hdlc->state_lock); ··· 306 294 } 307 295 kfree(hdlc->state); 308 296 hdlc->state = NULL; 297 + hdlc_setup_dev(dev); 309 298 } 310 299 311 300
-3
drivers/net/wan/hdlc_cisco.c
··· 365 365 memcpy(&state(hdlc)->settings, &new_settings, size); 366 366 dev->hard_start_xmit = hdlc->xmit; 367 367 dev->hard_header = cisco_hard_header; 368 - dev->hard_header_cache = NULL; 369 368 dev->type = ARPHRD_CISCO; 370 - dev->flags = IFF_POINTOPOINT | IFF_NOARP; 371 - dev->addr_len = 0; 372 369 netif_dormant_on(dev); 373 370 return 0; 374 371 }
-3
drivers/net/wan/hdlc_fr.c
··· 1289 1289 memcpy(&state(hdlc)->settings, &new_settings, size); 1290 1290 1291 1291 dev->hard_start_xmit = hdlc->xmit; 1292 - dev->hard_header = NULL; 1293 1292 dev->type = ARPHRD_FRAD; 1294 - dev->flags = IFF_POINTOPOINT | IFF_NOARP; 1295 - dev->addr_len = 0; 1296 1293 return 0; 1297 1294 1298 1295 case IF_PROTO_FR_ADD_PVC:
-2
drivers/net/wan/hdlc_ppp.c
··· 127 127 if (result) 128 128 return result; 129 129 dev->hard_start_xmit = hdlc->xmit; 130 - dev->hard_header = NULL; 131 130 dev->type = ARPHRD_PPP; 132 - dev->addr_len = 0; 133 131 netif_dormant_off(dev); 134 132 return 0; 135 133 }
-3
drivers/net/wan/hdlc_raw.c
··· 88 88 return result; 89 89 memcpy(hdlc->state, &new_settings, size); 90 90 dev->hard_start_xmit = hdlc->xmit; 91 - dev->hard_header = NULL; 92 91 dev->type = ARPHRD_RAWHDLC; 93 - dev->flags = IFF_POINTOPOINT | IFF_NOARP; 94 - dev->addr_len = 0; 95 92 netif_dormant_off(dev); 96 93 return 0; 97 94 }
-2
drivers/net/wan/hdlc_x25.c
··· 215 215 x25_rx, 0)) != 0) 216 216 return result; 217 217 dev->hard_start_xmit = x25_xmit; 218 - dev->hard_header = NULL; 219 218 dev->type = ARPHRD_X25; 220 - dev->addr_len = 0; 221 219 netif_dormant_off(dev); 222 220 return 0; 223 221 }